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.rhkb.cn/news/136614.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯js实现html指定页面导出word

因为最近做了范文网站需要,所以要下载为word文档,如果php进行处理,很吃后台服务器,所以想用前端进行实现。查询github发现,确实有这方面的插件。 js导出word文档所需要的两个插件: FileSaver.js jquery.w…

使用香橙派学习 Linux的守护进程

Q:什么是守护进程 A:Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个…

简述TCP三次握手,四次挥手

前言: 通常大多数认为三次握手、四次挥手是HTTP协议产生的。这是一个错误的认知,实际上HTTP协议并不参与握手以及挥手过程,三次握手四次挥手均是在TCP协议层上进行的,而HTTP协议只是在已建立 TCP连接的基础上,进行通信…

讯飞实时语音读写,并播放录音,上传录音文件

需求描述:使用讯飞实现录音实时识别,并且可以播放以及上传。 首先想到使用到这个组件voice-input-button2,他集成了讯飞语音读写的功能 ,插件地址:https://github.com/ferrinweb/voice-input-button2根据文档集成成功…

TypeScrip

TypeScript强调了两个重要的特性--类型系统、适用于任何规模的项目 1、TypeScript 从名字就可以看出来,类型是其核心的特性。 我们知道,JavaScript是一门非常灵活的编程语言,他有以下一些特点: 没有类型约束,一个变量可以初始化是字符串&a…

c语言进阶部分详解(指针进阶1)

大家好!指针的初阶内容我已经写好,可移步至我的文章:c语言进阶部分详解(指针初阶)_总之就是非常唔姆的博客-CSDN博客 基本内容我便不再赘述,直接带大家进入进阶内容: 目录 一.字符指针 1.讲解…

华为云云服务器云耀L实例评测 | 从零到一:华为云云耀云服务器L实例上手体验

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Android StateFlow初探

Android StateFlow初探 前言: 最近在学习StateFlow,感觉很好用,也很神奇,于是记录了一下. 1.简介: StateFlow 是一个状态容器式可观察数据流,可以向其收集器发出当前状态更新和新状态更新。还可通过其 …

go学习之函数知识

函数 文章目录 函数1.函数入门(1)为什么需要函数?(2)什么是函数:2.包3.函数的调用机制通俗理解调用过程:return语句递归调用 4.函数注意事项和细节讨论5.init函数6.匿名函数7.闭包8.defer9.函数参数的传递方式10.字符串中常用的函数11.时间和…

基于SSM+Vue的舞蹈网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

elment table静态表格 +表头居中加粗和表格内居中

效果图 注意的地方 表头居中加粗 header-cell-class-nameactive-header header-cell-class-name是element表格自带的参数 表格内居中cell-class-name"table-center"cell-class-name是el自带的参数 <el-table :data"tableData" style"width: 100%&…

Rhino网格如何转化成曲面?

的方法有多种&#xff0c;以下是一个常用的方法: 1.选择要转换的网格对象并右键单击: 2.选择“转换网格为曲面”选项; 3.在弹出的“转换网格为曲面”对话框中&#xff0c;选择要使用的参数并点击”确定” 另外&#xff0c;还可以通过Rhino的”ExtractWireframe"和“Ed…

理解QT信号和槽

进入QT官网&#xff0c;注册&#xff0c;创建账号&#xff0c;登录&#xff1b; 下载在线安装程序&#xff1b;10天试用版本&#xff1b;安装&#xff1b;完成后如下&#xff1b; 新建一个widgets项目&#xff0c;也就是桌面的窗口应用&#xff1b; 按向导新建完成项目&#x…

华为HCIA学习(一)

文章目录 一.根据考试题总结知识点&#xff08;一题一点&#xff09;二.上午学习三.下午学习四.今天只做了70题&#xff0c;需要的可以找我 一.根据考试题总结知识点&#xff08;一题一点&#xff09; 二.上午学习 ① VRP系统是VRP是华为公司从低端到高端的全系列路由器、交换…

iOS17正式版BUG汇总:无法正常拨打电话、小组件不可用、无线充电不可用等问题

今天凌晨 iOS 17 正式版发布&#xff0c;相信不少尝鲜派已经更新体验了iOS17的新功能了&#xff0c;但还有很多用户选择观望看是否要升级&#xff0c;小编汇总了目前已更新的用户反馈的已知BUG&#xff0c;供大家查看是否要更新iOS17正式版&#xff01; 目前已知BUG&#xff1…

基于dq0变换的三相并联有源电力滤波器模拟模型(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Golang教程与Gin教程合集,入门到实战

GolangGin框架GormRbac微服务仿小米商城项目实战视频教程Docker Swarm K8s云原生分布式部署 介绍&#xff1a; Go即Golang&#xff0c;是Google公司2009年11月正式对外公开的一门编程语言&#xff0c;它不仅拥有静态编译语言的安全和高性能&#xff0c;而 且又达到了动态语言开…

【Linux学习】01Linux初识与安装

Linux&#xff08;B站黑马&#xff09;学习笔记 01Linux初识与安装 文章目录 Linux&#xff08;B站黑马&#xff09;学习笔记前言01Linux初识与安装操作系统简述Linux初识虚拟机介绍安装VMware Workstation虚拟化软件VMware中安装CentOS7 Linux操作系统下载CentOS操作系统VMwa…

基于YOLOv8模型的烟火目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的烟火目标检测系统可用于日常生活中检测与定位烟火目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…

八大排序(二)--------冒泡排序

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…