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 许可协议。转载请注明出处!
相关文章:

5.2 磁盘CRC32完整性检测
CRC校验技术是用于检测数据传输或存储过程中是否出现了错误的一种方法,校验算法可以通过计算应用与数据的循环冗余校验(CRC)检验值来检测任何数据损坏。通过运用本校验技术我们可以实现对特定内存区域以及磁盘文件进行完整性检测,…...

企业内部安全与风控管理图解
企业内部安全说外部安全,企业领导者都非常关注,由于各方面原因,。。。力不从心,妥协! 方向: 1、制度 结合企业实情,编制企业安全管理制度 2、硬件 处理常规硬件外观,加壳与锁定、…...
vscode基于cmake安装opencv库
一、安装相关依赖库 首先更新源 sudo apt update安装相关包 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libjasper若是报错:无法定位到 libjasper软件包 则依次执行以下命令 sud…...

Web 器学习笔记(基础)
Filter 过滤器 概念:表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一 作用:顾名思义可以过滤资源的请求,并实现特殊的需求 Filter 接口及它核心的 doFilter() 方法(执行前就是…...

uniapp中vue3使用uni.createSelectorQuery().in(this)报错
因为VUE3中使用setup没有this作用域,所以报错 解决办法:使用getCurrentInstance()方法获取组件实例 import { getCurrentInstance } from vue;const instance getCurrentInstance(); // 获取组件实例 const DOMArr uni.createSelectorQuery().in(ins…...

k8s-部署
1.k8s 集群与部署 更改所有主机名字和解析 k8s1 192.168.25.11 reg.westos.org,habbor 仓库 k8s2 192.168.25.12 master,k8s 集群控制节点 k8s3 192.168.25.13 node,k8s 集群工作节点 k8s4 192.168.25.14 node,k8s 集群工作节点 所有节…...

Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)
目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Arduino驱动MMA7260三轴加速度传感器芯片,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。 1...

奇舞周刊第507期:通过 View Transition API 在状态之间添加丰富的过渡动画
记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 通过 View Transition API 在状态之间添加丰富的过渡动画 W3C 2023 年度全球技术大会 (TPAC2023) 于今年9月 11 - 15 日召开。W3C CSS 工作组成员 Bramus Van Damme(Google) 为本届…...
如何通过技术变现
技术变现是指将技术转化为实际价值的过程。以下是几种常见的技术变现方式: 软件开发与销售:根据市场需求开发软件,并将其销售给需要的企业或个人。专利许可与授权:将技术成果申请专利,通过专利许可和授权给企业使用&a…...

高效查询大量快递信息,轻松掌握技巧
在如今快节奏的生活中,快递已经成为我们日常不可或缺的一部分。然而,对于一些忙碌的人来说,单个查询每一个快递单号可能会浪费太多时间。因此,我们需要一款可以帮助我们批量查询快递的软件。 在市场上,有很多款专门用于…...
iperf3: error - unable to connect to server: No route to host 但嵌入式Linux设备
起因 需要测试WIFI设置为802.11n制式能否输出40MHZ带宽去做CE认证 需要一台设备WIFI 设置为STA模式 一台设备WIFI设置为AP模式 用STA模式的设备去连接AP模式的设备才能产生40MH带宽 起初用了一台设备做STA模式设备(设备A)来测试没问题了,要换一台设备做STA设备(设备…...
OpenCV自学笔记十七:傅里叶变换
1、Numpy实现傅里叶变换 傅里叶变换(Fourier Transform)是一种将信号从时域转换到频域的数学变换。它将一个连续或离散的时域信号分解为一组正弦和余弦函数的复合。 在Python中,可以使用NumPy库来实现傅里叶变换。具体步骤如下:…...

uniapp如何判断是哪个(微信/APP)平台
其实大家在开发uniapp项目的时候长长会遇到这样一个问题,就是针对某些小程序,没发去适配相关的功能,所以要针对不同的平台,进行不同的处理。 #ifdef : if defined 仅在某个平台编译 #ifndef : …...

网络安全——(黑客)自学
想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客!!! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队…...

一拖三快充线(USB-C转三充)的解决方案--LDR6020P
DR6020P 是带有 3 组 6 路 DRP USB-C 及 PD 通信协议处理模块和 USB2.0 Device 功能的 16 位 RISC MCU,内置 8K16 位 MTP 程序存储器(可烧录 1000 次),512 字节的数据存储器(SRAM)。内置 LDO 5V 输出&#…...

2024年考研教育专业的教育综合考试大纲、样题和往年真题
根据教育部通知,2024年全国硕士研究生招生考试初试定于2023年12月23日至24日,即我们说的2024年考研时间为12月23-24日。距离现在只剩下3个月不到的时间,那么如何让我们在最后三个月内的复习和备考有效且高效呢? 结合很多清北复交研…...

算法之斐波那契数列
10.1 斐波那契数列 题目链接 牛客网 题目描述 求斐波那契数列的第 n 项,n < 39。 解题思路 如果使用递归求解,会重复计算一些子问题。例如,计算 f(4) 需要计算 f(3) 和 f(2),计算 f(3) 需要计算 f(2) 和 f(1),…...

关于Pandas数据分析
pandas的数据加载与预处理 数据清洗:洗掉脏数据 整理分析:字不如表 数据展现:表不如图 环境搭建 pythonjupyter anaconda Jupyter Notebook Jupyter Notebook可以在网页页面中直接编写代码和运行代码, 代码的运行结果也会直接在代码块下显示…...

Go 并发可视化解释 - sync.Mute
在学习 Go 编程语言时,您可能会遇到这句著名的格言:“不要通过共享内存来进行通信;相反,通过通信来共享内存。” 这句话构成了 Go 强大并发模型的基础,其中通道(channels)作为协程之间的主要通信…...

十几张高清世界地图
十几张高清世界地图 仅供学习!...

奥威BI+AI数据分析:企业数智化转型的加速器
在当今数据驱动的时代,企业对于数据分析的需求日益增长。奥威BIAI数据分析的组合,正成为众多企业数智化转型的加速器。 奥威BI以其强大的数据处理和可视化能力著称。它能够轻松接入多种数据源,实现数据的快速整合与清洗。通过内置的ETL工具&…...

【Ragflow】25.Ragflow-plus开发日志:excel文件解析新思路/公式解析适配
引言 RagflowPlus v0.3.0 版本中,增加了对excel文件的解析支持,但收到反馈,说效果并不佳。 以下测试文件内容来自群友反馈提供,数据已脱敏处理。 经系统解析后,分块效果如下: 可以看到,由于该…...
Trae CN IDE 中 Python 开发的具体流程和配置总结
以下是 Trae CN IDE 中 Python 开发的具体流程和配置总结,结合实例说明,帮助开发者快速上手: 一、环境准备 1. 安装 Trae CN IDE 下载地址:访问 Trae 官网 下载对应操作系统的安装包(Windows .exe / macOS .dmg / Linux .tar.gz)。安装步骤: Windows:双击 .exe 文件,…...

【C++高并发内存池篇】性能卷王养成记:C++ 定长内存池,让内存分配快到飞起!
📝本篇摘要 在本篇将介绍C定长内存池的概念及实现问题,引入内存池技术,通过实现一个简单的定长内存池部分,体会奥妙所在,进而为之后实现整体的内存池做铺垫! 🏠欢迎拜访🏠ÿ…...
QT中子线程触发主线程弹窗并阻塞等待用户响应
目录 QT中子线程触发主线程弹窗并阻塞等待用户响应一、使用QMetaObject::invokeMethod实现子线程安全触发主线程弹窗并阻塞等待:🔧 Qt多线程弹窗:安全阻塞等待方案(QMetaObject::invokeMethod详解)🧠 一、核…...

C++:参数传递方法(Parameter Passing Methods)
目录 1. 值传递(Pass by Value) 2. 地址传递(Pass by Address) 3. 引用传递(Pass by Reference) 数组作为函数参数(Array as Parameter) 数组作为函数返回值 什么是函数ÿ…...

hook组件-useEffect、useRef
hook组件-useEffect、useRef useEffect 用法及执行机制 WillMount -> render -> DidMount ShouldUpdate -> WillUpdate -> render -> DidUpdate WillUnmount(只有这个安全) WillReceiveProps useEffect(callback) 默认所有依赖都更新useEffect(callback, [])&am…...
JDK21深度解密 Day 9:响应式编程模型重构
【JDK21深度解密 Day 9】响应式编程模型重构 引言:从Reactor到虚拟线程的范式转变 在JDK21中,虚拟线程的引入彻底改变了传统的异步编程模型。作为"JDK21深度解密"系列的第91天,我们将聚焦于响应式编程模型重构这一关键主题。通过…...

FFmpeg移植教程(linux平台)
目录 第三方源码编译三部曲关于 configure 的说明 FFmpeg 移植流程获取源码方法一:git 远程克隆方法二:官网下载压缩包解压 配置安装 第三方源码编译三部曲 Linux平台下有许多开源的第三方库和服务,这些开源代码一般都符合GNU-autotools编码…...

03 APP 自动化-定位元素工具元素定位
文章目录 一、Appium常用元素定位工具1、U IAutomator View Android SDK 自带的定位工具2、Appium Desktop Inspector3、Weditor安装:Weditor工具的使用 4、uiautodev通过定位工具获取app页面元素有哪些属性 二、app 元素定位方法 一、Appium常用元素定位工具 1、U…...