当前位置: 首页 > news >正文

第二次课,文件校验(预习)

hash 计算接口 Crypto API (证书,对称加密,非对称加密,编码和解码)
CryptAcquireContext
CryptCreateHash
CryptReleaseContext
CryptHashData
CryptDestroyHash
CryptGetHashParam

注册表操作接口
RegEnumKeyEx
RegEnumValueW
RegOpenKeyExW
RegQueryValueExW
RegQueryInfoKeyW

服务注册表的路径:\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services

AutoRuns 和 AutoRuncs 下载地址
https://learn.microsoft.com/zh-cn/sysinternals/downloads/autoruns

目标:
1、在上次课的基础上把所有枚举出来的进程以及进程模块的文件hash值[MD5 sha-1,sha256]计算出来;存在父进程id的进程一并把父进程信息给关联起来一并输出;涉及运行中文件的打开,可以考虑先复制到其他地方再读取内容进行计算。
2、使用注册表接口,把注册表中的服务信息枚举出来,并输出关联的二进制路径,思考一下使用服务接口枚举的服务和注册表枚举的服务如何关联。
3、使用注册表接口,枚举当前计算启动项信息,启动项注册表路径自己查阅资料。
扩展内容:可以在进程,模块hash的基础上增加文件签名校验:参考内容链接:https://blog.csdn.net/StanfordZhang/article/details/8255605

1、hash CRC32–开销比较小 ,MD5,SHA1,SHA256 --运行开销,自定义的简单hash ,oxxxdxg.exe 长度,第一个字符是0 第四个字符是d 第六个是g 存在碰撞的可能。FFFFXAC VALUE ^ KEY = ENCODE;ENCODE ^ KEY = VALUE;

1231234535–》calc_proc—>data_spect

运行时解密。

框架原始的串 --》calc——proc -》FFFFXAC ollydbg.exe

注册表,这个就是WINDOWS 自带的数据库,或者说是一个配置库。

自启动

总结:白名单技术。云查(网络接口)

先给三个代码

1、在上次课的基础上把所有枚举出来的进程以及进程模块的文件hash值
[MD5 sha-1,sha256]计算出来;存在父进程id的进程一并把父进程信息给关联起来一并输出;
涉及运行中文件的打开,可以考虑先复制到其他地方再读取内容进行计算。
//第一部分计算#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <wincrypt.h>
#include <iostream>
#include <string>
#include<TlHelp32.h>
#include<psapi.h>
#include <vector>// 计算文件的哈希值
std::string CalculateHash(const wchar_t* filePath, const char* hashAlgorithm)
{std::string hashValue;HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (hFile != INVALID_HANDLE_VALUE){HCRYPTPROV hProv = NULL;HCRYPTHASH hHash = NULL;if (CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)){if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)){const DWORD bufferSize = 8192;BYTE buffer[bufferSize];DWORD bytesRead;while (ReadFile(hFile, buffer, bufferSize, &bytesRead, NULL) && bytesRead > 0){CryptHashData(hHash, buffer, bytesRead, 0);}DWORD cbHashSize = 0;DWORD hashSize = sizeof(DWORD);if (CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&cbHashSize, &hashSize, 0)){std::vector<BYTE> hashBuffer(cbHashSize);if (CryptGetHashParam(hHash, HP_HASHVAL, &hashBuffer[0], &cbHashSize, 0)){char hexChar[] = "0123456789ABCDEF";hashValue.reserve(2 * cbHashSize);for (DWORD i = 0; i < cbHashSize; ++i){hashValue.push_back(hexChar[hashBuffer[i] >> 4]);hashValue.push_back(hexChar[hashBuffer[i] & 0xF]);}}}CryptDestroyHash(hHash);}CryptReleaseContext(hProv, 0);}CloseHandle(hFile);}return hashValue;
}int main()
{HANDLE hProcessSnap;PROCESSENTRY32 pe32;// 获取进程快照hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcessSnap == INVALID_HANDLE_VALUE){printf("创建进程快照失败!错误码:%d\n", GetLastError());return 1;}// 设置进程快照结构体大小pe32.dwSize = sizeof(PROCESSENTRY32);// 获取第一个进程的信息if (!Process32First(hProcessSnap, &pe32)){printf("获取第一个进程信息失败!错误码:%d\n", GetLastError());CloseHandle(hProcessSnap);return 1;}// 遍历进程快照,输出每个进程内的System32路径下的模块do{HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe32.th32ProcessID);if (hProcess){HMODULE hMods[1024];DWORD cbNeeded;// 获取模块句柄数组if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)){// 获取模块路径for (unsigned int i = 0; i < cbNeeded / sizeof(HMODULE); i++){wchar_t szModuleName[MAX_PATH];if (GetModuleFileNameEx(hProcess, hMods[i], szModuleName, MAX_PATH)){// 判断模块路径是否位于System32目录下if (wcsstr(szModuleName, L"\\System32\\") != NULL){std::string md5Hash = CalculateHash(szModuleName, "MD5");std::string sha1Hash = CalculateHash(szModuleName, "SHA1");std::string sha256Hash = CalculateHash(szModuleName, "SHA256");printf("进程ID: %d\n", pe32.th32ProcessID);printf("父进程ID: %d\n", pe32.th32ParentProcessID);printf("模块路径: %ls\n", szModuleName);printf("MD5 哈希值: %s\n",(md5Hash.empty() ? "计算失败" : md5Hash.c_str()));printf("SHA1 哈希值: %s\n", (sha1Hash.empty() ? "计算失败" : sha1Hash.c_str()));printf("SHA256 哈希值: %s\n\n", (sha256Hash.empty() ? "计算失败" : sha256Hash.c_str()));}}}}CloseHandle(hProcess);}} while (Process32Next(hProcessSnap, &pe32));CloseHandle(hProcessSnap);return 0;
}//使用注册表接口,把注册表中的服务信息枚举出来,并输出关联的二进制路径
#include <windows.h>
#include <iostream>
#include <string>void EnumerateServices()
{HKEY hKey;if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services", 0, KEY_READ, &hKey) == ERROR_SUCCESS){DWORD numSubKeys;if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){for (DWORD i = 0; i < numSubKeys; i++){WCHAR serviceName[MAX_PATH];DWORD serviceNameSize = MAX_PATH;if (RegEnumKeyExW(hKey, i, serviceName, &serviceNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){HKEY hServiceKey;if (RegOpenKeyExW(hKey, serviceName, 0, KEY_READ | KEY_WOW64_64KEY, &hServiceKey) == ERROR_SUCCESS){WCHAR imagePath[MAX_PATH];DWORD imagePathSize = MAX_PATH;if (RegQueryValueExW(hServiceKey, L"ImagePath", NULL, NULL, reinterpret_cast<LPBYTE>(imagePath), &imagePathSize) == ERROR_SUCCESS){std::wcout << "Service Name: " << serviceName << std::endl;std::wcout << "Binary Path: " << imagePath << std::endl;std::wcout << std::endl;}RegCloseKey(hServiceKey);}}}}RegCloseKey(hKey);}
}int main()
{EnumerateServices();return 0;
}
2、使用注册表接口,把注册表中的服务信息枚举出来,并输出关联的二进制路径,思考一下使用服务接口枚举的服务和注册表枚举的服务如何关联
#include <windows.h>
#include <iostream>
#include <string>void EnumerateServices()
{HKEY hKey;if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services", 0, KEY_READ, &hKey) == ERROR_SUCCESS){DWORD numSubKeys;if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){for (DWORD i = 0; i < numSubKeys; i++){WCHAR serviceName[MAX_PATH];DWORD serviceNameSize = MAX_PATH;if (RegEnumKeyExW(hKey, i, serviceName, &serviceNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){HKEY hServiceKey;if (RegOpenKeyExW(hKey, serviceName, 0, KEY_READ | KEY_WOW64_64KEY, &hServiceKey) == ERROR_SUCCESS){WCHAR imagePath[MAX_PATH];DWORD imagePathSize = MAX_PATH;if (RegQueryValueExW(hServiceKey, L"ImagePath", NULL, NULL, reinterpret_cast<LPBYTE>(imagePath), &imagePathSize) == ERROR_SUCCESS){std::wcout << "Service Name: " << serviceName << std::endl;std::wcout << "Binary Path: " << imagePath << std::endl;std::wcout << std::endl;}RegCloseKey(hServiceKey);}}}}RegCloseKey(hKey);}
}int main()
{EnumerateServices();return 0;
}
3、使用注册表接口,枚举当前计算启动项信息
#include <windows.h>
#include <iostream>
#include <string>void EnumerateStartupItems()
{HKEY hKey;// 枚举HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run键的值if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey) == ERROR_SUCCESS){DWORD numValues;if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &numValues, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){for (DWORD i = 0; i < numValues; i++){WCHAR valueName[MAX_PATH];DWORD valueNameSize = MAX_PATH;BYTE data[MAX_PATH];DWORD dataSize = MAX_PATH;DWORD valueType;if (RegEnumValueW(hKey, i, valueName, &valueNameSize, NULL, &valueType, data, &dataSize) == ERROR_SUCCESS){if (valueType == REG_SZ){std::wcout << "Value Name: " << valueName << std::endl;std::wcout << "Binary Path: " << reinterpret_cast<WCHAR*>(data) << std::endl;std::wcout << std::endl;}}}}RegCloseKey(hKey);}// 枚举HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run键的值if (RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &hKey) == ERROR_SUCCESS){DWORD numValues;if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &numValues, NULL, NULL, NULL, NULL) == ERROR_SUCCESS){for (DWORD i = 0; i < numValues; i++){WCHAR valueName[MAX_PATH];DWORD valueNameSize = MAX_PATH;BYTE data[MAX_PATH];DWORD dataSize = MAX_PATH;DWORD valueType;if (RegEnumValueW(hKey, i, valueName, &valueNameSize, NULL, &valueType, data, &dataSize) == ERROR_SUCCESS){if (valueType == REG_SZ){std::wcout << "Value Name: " << valueName << std::endl;std::wcout << "Binary Path: " << reinterpret_cast<WCHAR*>(data) << std::endl;std::wcout << std::endl;}}}}RegCloseKey(hKey);}
}int main()
{EnumerateStartupItems();return 0;
}

相关文章:

第二次课,文件校验(预习)

hash 计算接口 Crypto API &#xff08;证书&#xff0c;对称加密&#xff0c;非对称加密&#xff0c;编码和解码&#xff09; CryptAcquireContext CryptCreateHash CryptReleaseContext CryptHashData CryptDestroyHash CryptGetHashParam 注册表操作接口 RegEnumKeyEx RegE…...

京东官方平台API接口获得JD商品详情页信息数据采集产品价格、原价、销量、商品属性名等

京东商品详情API接口的作用是获取京东平台上某个商品的详细信息&#xff0c;包括商品标题、价格、图片、规格、参数、店铺信息等。开发者可以通过该接口获取到商品的原始数据&#xff0c;方便进行数据分析、价格比较、爬取等操作。 通过该接口获取到的商品详情数据可以结合其他…...

深入篇【C++】总结智能指针的使用与应用意义(auto_ptr/unique_ptr/shared_ptr/weak_ptr)底层原理剖析+模拟实现

深入篇【C】总结智能指针的使用与应用意义&&(auto_ptr/unique_ptr/shared_ptr/weak_ptr&#xff09;底层原理剖析模拟实现 智能指针的出现智能指针的使用应用意义/存在问题智能指针原理剖析模拟实现auto_ptrunique_ptrshared_ptrweak_ptr 智能指针的出现 首先我们要理…...

计算机视觉和机器视觉有什么区别?

人工智能是一个概念性术语&#xff0c;涵盖了若干特定技术。本文中&#xff0c;我们将探讨机器视觉&#xff08;MV&#xff09;和计算机视觉&#xff08;CV&#xff09;。二者都涉及可视化输入的摄取和解释&#xff0c;因此&#xff0c;了解这些重叠技术的优势、约束和最佳应用…...

【树莓派 picamera】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言https://www.cnblogs.com/uestc-mm/p/7606855.html 一、picamera是什么&#xff1f;二、使用步骤1.引入库2.先要安装opencv 总结 前言 想用树莓派libcamera &a…...

HarmonyOS应用开发者基础认证【满分答案】

HarmonyOS应用开发者基础认证 一、判断题二、单选题三、多选题 一、判断题 在Column和Row容器组件中&#xff0c;justifyContent用于设置子组件在主轴方向上的对齐格式&#xff0c;alignItems用于设置子组件在交叉轴方向上的对齐格式。&#xff08;正确&#xff09; 所有使用C…...

CSS 常用样式——定位属性类型及特点

一、相对定位 相对定位是 CSS 中的一种定位方式&#xff0c;它允许我们将一个元素相对于其原始位置进行定位&#xff0c;而不会影响其它元素的位置和尺寸。相对定位是通过 position: relative; 属性实现的。 相对定位常用于创建位置相对于父元素的元素&#xff0c;以及重叠元…...

华纳云:Linux文件不存在无法删除如何解决

在Linux中&#xff0c;如果您要删除一个文件&#xff0c;但文件不存在&#xff0c;通常会收到类似"文件不存在"或"没有这样的文件或目录"的错误消息。这可能是由于多种原因导致的&#xff0c;例如文件被移动、重命名、删除&#xff0c;或者您没有足够的权限…...

mysql增加字段语句转为Oracle语句

mysql增加字段语句转为Oracle语句 ALTER TABLE xm_cghyADD COLUMN WDNR blob NULL COMMENT 评审会议通知HTML AFTER HYTZFJ;在Oracle中&#xff0c;可以使用以下SQL语句来执行ALTER TABLE操作&#xff0c;将xm_cghy表添加一个名为WDNR的BLOB类型列&#xff1a; ALTER TABLE x…...

VMware搭载linux出现的bugs

---------后续在实际Linux项目复盘过程中有遇到问题(解决办法)会不定时更新.......----------- ques: Linux自带的media目录用于挂载或可移动存储设备已满&#xff08;造成这一原因是由于我多次创建新的虚拟机并在同一虚拟目录下挂载同一镜象导致有些残存文件没有删除干净&…...

websocket逆向-protobuf序列化与反序列化

系列文章目录 训练地址&#xff1a;https://www.qiulianmao.com 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集实战一&#xff1a;Http轮询更新中 websocket逆向-protobuf序列化与反序列化基础 系…...

车载电子电器架构 —— 国产基础软件生态简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

CNN-generated images are surprisingly easy to spot... for now

CNN-generated images are surprisingly easy to spot… for now----《目前CNN生成的图像非常容易被发现》 背景&#xff1a; 研究者们发现&#xff0c;仅仅对一种由CNN模型生成的图像进行训练的分类器&#xff0c;也可以检测许多其他模型生成的结果。由此提出这样的观点&#…...

蓝桥杯(七段码,C++)

思路&#xff1a; 1、把灯管的连接转为图结构&#xff0c;相邻的灯管即认为有边。 2、用深度搜索&#xff0c;去计算有多少种不同字符。 3、因为有每种字符都会重复算两遍&#xff0c;最后的结果需要数以2。 #include <iostream> using namespace std;int graph[7][7…...

Master PDF Editor v5.9.70便携版

软件介绍 Master PDF Editor中文版是一款小巧的多功能PDF编辑器,可以轻松查看,创建,修改,批注,签名,扫描,OCR和打印PDF文档.高级注释工具,可以添加任意便笺指示对象突出显示,添加下划线和删除,而无需更改源PDF文件. 软件截图 更新日志 code-industry.net/what-is-new-in-mas…...

【剑指Offer】20.表示数值的字符串

题目 请实现一个函数用来判断字符串str是否表示数值&#xff08;包括科学计数法的数字&#xff0c;小数和整数&#xff09;。 科学计数法的数字(按顺序&#xff09;可以分成以下几个部分: 1.若干空格 2.一个整数或者小数 3.&#xff08;可选&#xff09;一个 e 或 E &…...

2023年9月Web3行业月度发展报告区块链篇 | 陀螺科技会员专享

9月是加密市场的活动月&#xff0c;斯坦福区块链周、Token2049等大型活动相继举办&#xff0c;后者更是创下超过1万人的历史最高纪录&#xff0c;成为了全球最大的Web3活动。在本次Token2049上&#xff0c;RWA、支付以及出入金成为了讨论度最多的活动。尽管活动如火如荼&#x…...

Unity 快捷键的一些记录

1.Unity Prefab Apply All 设置快捷键&#xff0c;修改预设体之后快捷键应用 打包会出问题&#xff1a;The type or namespace name ‘EditorWindow‘ could not be found EditorWindow类无法打包出EXE 添加unity关键字定义如下文所示&#xff1a; #if UNITY_EDITOR using Uni…...

GIT指令 - git stash

命令解释 保存当前工作进度&#xff0c;将工作区和暂存区恢复到修改之前。 使用场景 当在A分支上进行开发&#xff0c;有点事情需要切到B分支上进行开发&#xff0c;但是A分支的代码开发一半&#xff0c;又不想提交&#xff0c;直接切换又会报错&#xff0c;可以使用该指令。…...

LiveMedia视频中间件视频隐私打码直播解决方案

一、方案背景 随着科技的发展&#xff0c;视频监控系统已经成为了我们生活中不可或缺的一部分。无论是在公共区域&#xff0c;还是在私人场所&#xff0c;我们都可以看到各种各样的监控设备。这些设备的出现&#xff0c;无疑提高了我们的生活安全&#xff0c;使得我们可以更好地…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...