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

5.2 磁盘CRC32完整性检测

CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,并以此来判定特定程序内存是否发生了变化,如果发生变化则拒绝执行,通过此种方法来保护内存或磁盘文件不会被非法篡改。总之,内存和磁盘中的校验技术都是用于确保数据和程序的完整性和安全性的重要技术。

磁盘CRC(循环冗余校验)用于检测磁盘数据的完整性,一般而言某些木马专杀工具同样会用到磁盘CRC特征校验技术,该技术的实现原理与内存验证原理完全一致,针对磁盘的验证同样很简单,但此处我们需要将计算到的CRC32值存储到PE文件自身中,通常我们可以存储到PE文件的前一个DWORD的位置上,程序运行后对比这个值,来判断程序是否被打过补丁,如果打过直接结束掉。

// 检查磁盘完整性
BOOL CalculateDiskCRC32()
{char szFileName[MAX_PATH] = { 0 };char *pBuffer;DWORD pNumberOfBytesRead;int FileSize = 0;// 获取自身文件,并打开文件GetModuleFileName(0, szFileName, MAX_PATH);HANDLE hFile = CreateFile(szFileName, GENERIC_READ, 1, 0, 3, FILE_ATTRIBUTE_NORMAL, 0);if (hFile == INVALID_HANDLE_VALUE){return TRUE;}// 取文件长度FileSize = GetFileSize(hFile, 0);pBuffer = new char[FileSize];// 读取文件到内存ReadFile(hFile, pBuffer, FileSize, &pNumberOfBytesRead, 0);CloseHandle(hFile);PIMAGE_DOS_HEADER pDosHeader = NULL;PIMAGE_NT_HEADERS32 pNtHeader = NULL;pDosHeader = (PIMAGE_DOS_HEADER)pBuffer;// 获取到NT头pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader + pDosHeader->e_lfanew);// 定位到PE文件头前4字节处DWORD OriginalCRC32 = *(DWORD *)((DWORD)pNtHeader - 4);printf("[*] 读出节表值 = %x \n", OriginalCRC32);// 我们只需要计算PE结构的CRC32值,不需要计算DOS头FileSize = FileSize - DWORD(pDosHeader->e_lfanew);DWORD CheckCRC32 = CRC32((BYTE*)(pBuffer + pDosHeader->e_lfanew), FileSize);printf("[+] 计算CRC32 = %x \n", CheckCRC32);if (CheckCRC32 == OriginalCRC32){return FALSE;}else{return TRUE;}return TRUE;
}int main(int argc, char* argv[])
{BOOL ref = CalculateDiskCRC32();if (ref == TRUE){printf("[-] 程序已被修改 \n");}else{printf("[+] 程序正常 \n");}system("pause");return 0;
}

首先读者运行上述程序,则程序会输出当前的CRC32值be63ac8b我们记下这个HASH值,如下图所示;

并将此值替换到如下图中的黄色位置,当程序运行后会读取该区域内的数据,并与动态计算的CRC32值进行计算,最终判断是否被修改,如下图所示;

通过CRC32数据对比并遍历磁盘文件,我们可以实现一个简单的特征定位查杀程序,用于专门定位某些特殊的程序,如下是修改后的代码片段;

// 计算文件CRC过程
BOOL CalcCRC32(char *FilePath)
{// 打开文件HANDLE hFile = CreateFile(FilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){return FALSE;}// 获取文件大小DWORD dwSize = GetFileSize(hFile, NULL);if (dwSize == 0xFFFFFFFF){return FALSE;}// 分配内存BYTE *pFile = (BYTE*)malloc(dwSize);if (pFile == NULL){return FALSE;}// 读取内存DWORD dwNum = 0;ReadFile(hFile, pFile, dwSize, &dwNum, NULL);// 计算CRC32DWORD dwCRC32 = CRC32(pFile, dwSize);if (pFile != NULL){free(pFile);pFile = NULL;}CloseHandle(hFile);return dwCRC32;
}int main(int argc, char* argv[])
{WIN32_FIND_DATA stFindFile;HANDLE hFindFile;char *szFilter = "*.exe";      // 筛选所有的.exe结尾的文件char szFindFile[MAX_PATH];     // 保存欲检测程序的路径char szSearch[MAX_PATH];       // 保存完整的筛选路径int ret = 0;                   // 搜索状态返回值lstrcpy(szFindFile, "D:\\");   // 搜索D盘目录下的所有exe结尾的文件lstrcpy(szSearch, "D:\\");lstrcat(szSearch, szFilter);DWORD dwTmpCRC32;hFindFile = FindFirstFile(szSearch, &stFindFile);if (hFindFile != INVALID_HANDLE_VALUE){do{lstrcat(szFindFile, stFindFile.cFileName);dwTmpCRC32 = CalcCRC32(szFindFile);// 比较判断if (dwTmpCRC32 == 0xbe63ac8b){printf("[*] CRC32 = %x 发现病毒 %s \n", dwTmpCRC32, szFindFile);}else{printf("[-] CRC32 = %x 正常程序 %s \n", dwTmpCRC32, szFindFile);}// 删除程序名称只保留"C:\"szFindFile[3] = '\0';ret = FindNextFile(hFindFile, &stFindFile);} while (ret != 0);}FindClose(hFindFile);system("pause");return 0;
}

运行程序输出效果如下图所示;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/7a9a55f0.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

http://www.lryc.cn/news/174126.html

相关文章:

  • 企业内部安全与风控管理图解
  • vscode基于cmake安装opencv库
  • Web 器学习笔记(基础)
  • uniapp中vue3使用uni.createSelectorQuery().in(this)报错
  • k8s-部署
  • Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)
  • 奇舞周刊第507期:通过 View Transition API 在状态之间添加丰富的过渡动画
  • 如何通过技术变现
  • 高效查询大量快递信息,轻松掌握技巧
  • iperf3: error - unable to connect to server: No route to host 但嵌入式Linux设备
  • OpenCV自学笔记十七:傅里叶变换
  • uniapp如何判断是哪个(微信/APP)平台
  • 网络安全——(黑客)自学
  • 一拖三快充线(USB-C转三充)的解决方案--LDR6020P
  • 2024年考研教育专业的教育综合考试大纲、样题和往年真题
  • 算法之斐波那契数列
  • 关于Pandas数据分析
  • Go 并发可视化解释 - sync.Mute
  • 十几张高清世界地图
  • Python 逢七拍手游戏
  • Windows安装Mysql--免安装版
  • TypeScript中常见的操作符运算符总结
  • 什么是泛型约束?
  • 代码随想录算法训练营 动态规划part11
  • 新概念英语(第二册)复习——Lesson 16 - Lesson20
  • [题] n-皇后问题 #深搜 #DFS
  • 十小时开源了一个加密算法仓库,功能强大,后端开发人员狂喜!
  • 标准化套利的使用
  • 【MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制】
  • 十五、红外遥控器