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.xdnf.cn/news/140093.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Java Web】CSS

目录 1.CSS(Cascading Style Sheets) 层叠样式表 2.标签 1.注释 2.三种书写样式 1.内部样式 2.内联样式 3.外部样式 3.CSS选择器 (1)标签选择器 (2)类选择器 (3)ID选择器 复合选择器 &#xf…

网络知识——局域网和交换机

定义: 局域网(Local Area Network,简称LAN)是指在某一区域内由多台计算机互联成的计算机组。广域网(Wide Area Network,简称WAN)是指跨越单个建筑物或大型园区,连接分布在特定地理区…

MongoDB的搭建 和crud操作

MongoDB docker 下载 docker run --restartalways -d --name mongo -v /docker/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6使用navcat工具使用MongoDB Crud操作 jar包 <dependency><groupId>org.projectlombok</groupId><artifactId>lom…

AP5193 DC-DC恒流转换器 消防应急 灯汽车灯 应急日光灯太阳能灯驱动IC

AP5193是一款PWM工作模式,高效率、外围简单、 内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。电流2.5A。AP5193可实现线性调光和PWM调光&#xff0c;线性调光 脚有效电压范围0.55-2.6V. AP5193 工作频率可以通过RT 外部电阻编程来设定&#xff0c…

postman发送图片

POSTMAN 如何发送携带图片的请求? 闲话不叙 步骤如下&#xff1a; 新建一个请求&#xff0c;在Headers中添加一对k-v : Content-Type > multipart/form-data 请求的接口: RequestMapping("/fileUploadController")public String fileUpload(MultipartFile fil…

【每日一题】1539. 第 k 个缺失的正整数

1539. 第 k 个缺失的正整数 - 力扣&#xff08;LeetCode&#xff09; 给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。 请你找到这个数组里第 k 个缺失的正整数。 示例 1&#xff1a; 输入&#xff1a;arr [2,3,4,7,11], k 5 输出&#xff1a;9 解释&#xff1a;缺失…

【刷题-牛客】链表内指定区间反转

链表定区间翻转链表 题目链接题目描述核心思想详细图解代码实现复杂度分析 题目链接 链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com) 题目描述 核心思想 遍历链表的过程中在进行原地翻转 [m,n]翻转区间记作子链表,找到子链表的 起始节点 left 和 终止节点 right记录在…

基于Qt实现的可视化大屏监控

基于Qt实现的可视化大屏监控 先上图 基于Qt实现的可视化大屏监控 总有人质疑QWidget实现不了炫酷的界面&#xff0c;其实QWidget已经很强大了&#xff0c;虽然很多效果没有现成的框架&#xff0c;所以比不上html5或者安卓这种&#xff0c;但是也能实现很多不错的效果了&#…

Jetpack Compose干货,如何让Compose Dialog从屏幕任意方向进入

一、前言 来个效果图&#xff0c;基于Compose Dialog&#xff0c;最终要实现的库能力如下&#xff1a; 这里使用的是这个包下面的&#xff1a; androidx.compose.ui.window.Dialog androidx.compose.material3.AlertDialog它内部调用的也是androidx.compose.ui.window.Dialog …

Android开源 日志框架 LogDog V2.3.1

目录 一、简介 二、下载使用 添加jitpack 仓库 添加依赖: 三、更改 1、 LogDogV2.3.1初始化: 2、通过上面的初始化 &#xff0c;已经知道IJsonEngine 优化了泛型参数&#xff0c;采用 Object/Any 3、优化空异常的判断&#xff0c;哪怕打印变量是NULL LogDog会打印“nul…

Activiti7工作流 二【Activiti7入门、Activiti7进阶】

文章目录 六、Activiti7入门6.1 业务流程建模6.1.1 绘制流程图6.1.2 指定任务负责人6.1.3 生成png格式流程图 6.2 部署流程定义6.3 启动流程实例6.4 任务查询6.5 任务处理6.6 添加审批意见6.6 查看历史审批 七、Activiti7进阶7.1 流程定义相关7.1.1 流程定义查询7.1.2 流程资源…

有哪些好用的上网行为管理软件?(上网行为管理软件功能好的软件推荐)

随着互联网的快速发展&#xff0c;企业的信息化管理和员工的上网行为已经成为企业信息化建设的重要组成部分。上网行为管理软件作为一种新型的管理工具&#xff0c;可以帮助企业实现对员工上网行为的管控和优化&#xff0c;进而提高企业的工作效率和网络安全。本文将对多款市场…

minio文件上传

1.代码 大佬仓库&#xff1a;https://gitee.com/Gary2016/minio-upload?_fromgitee_search 关于这个代码的讲解&#xff1a;来自b站 2.准备minio 参考&#xff1a;[1]、[2] 2.1 下载 官网&#xff1a;https://min.io/download#/windows 2.2 启动 ①准备一个data文件夹…

树、二叉树、堆及其应用(堆排序、top-k问题)

目录 树的概念与结构 概念&#xff1a; 与树相关的概念: 树的表示&#xff1a; 二叉树 概念&#xff1a; 特殊的二叉树&#xff1a; 二叉树性质&#xff1a; 二叉树的存储结构&#xff1a; 堆 堆的概念: 堆的实现&#xff1a; 堆的创建&#xff1a; 堆的插入&#xff1a; 堆的删…

【算法思想-排序】排序数组-力扣 912 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

OJ练习第180题——颠倒二进制位

颠倒二进制位 力扣链接&#xff1a;190. 颠倒二进制位 题目描述 颠倒给定的 32 位无符号整数的二进制位。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中&#xff0c;没有无符号整数类型。在这种情况下&#xff0c;输入和输出都将被指…

2023华为杯数学建模研赛E题全解析

2023华为杯数学建模研赛E题解析&#xff0c;完整版已出!!! 包含所有模型、代码、结果&#xff0c;39页技术文档&#xff0c;详细内容如下! 免费版链接已放在下面&#xff0c;需要的同学可以直接自取~ 【云顶数模】2023研究生数学建模免费链接&#xff1a; https://pan.baid…

【Redis】专栏合集,从入门到高级业务场景实战

作者简介 目录 1.概述 2.下载安装 3.基础操作 4.集群 5.实战场景 1.概述 诸如数mysql、Oracle之类的关系型数据库或者NTFS、HDFS之类的文件存储系统&#xff0c;其本质上数据都是存在磁盘上的。这是现代计算机体系架构的架构所决定的&#xff0c;要持久化存储的数据都会落…

卸载Visual Studio 2010学习版 —— 卸载VCExpress

目录 最初安装Visual Studio 2010学习版是因为计算机二级 C语言考试而装&#xff0c;现如今考完试后便可卸载掉了&#xff0c;安装简便而卸载却没有uninstall.exe文件。故本文提供卸载方式。 进入到程序目录&#xff0c;找到setup.exe文件&#xff0c;也可以在程序目录搜索set…