PE的可选映像头(IMAGE_OPTION_HEADER)里面,有一个Checksum字段,是该文件的校验和,一般EXE文件可以使0,但一些重要的和系统DLL及驱动文件必须有一个校验和.
Windows 提供了一个API函数MapFileAndCheckSum 测试文件的Checksum,它位于IMAGEHLP.DLL链接库里,其原型:
ULONG MapFileAndCheckSum
{
LPSTR FileName, // 文件名
LPDWORD HeaderSum, // 指向PE文件头的CheckSum
LPDWORD new_checksum // 指向新计算出的Checksum
}
程序一旦运行后,new_checksum 地址处将放当前的文件的校验和,old_checksum地址指向PE文件的checksum字段
安全的方法是将此值放在注册表里,需要时比较.
内存映像校验
磁盘文件完整性校验可以抵抗解密者直接修改文件,但对内存补丁却没有效果,必须对内存关键的代码进行校验.
1 对整个代码进行校验
每个程序至少有一个代码区块明睁察和数据区块,数据区块属性可读写,程序运行时早培全局变量通常会放在这里,这些数据会动态变化,因此校验这部分是没什么意义,而代码段只读,存激茄放的是程序代码,在程序中数据数不会变的,因此用这部分进行内存校验是可行的.
具体实现方法:
(1) 从内存中映像中得到PE相关数据,如代码块的RVA和内存大小
(2) 根据得到代码区块的RVA值和内存大小,计算出内存数据的CRC-32值
(3) 读取自身文件先前存储的CRC-32值(PE文件头前一个字段),这个值是通过软件写进去的.
(4) 比较两个CRC-32值.
这样比较内存的代码段校验,只要内存的数据被修改,就能发现。
BOOL CodeSectionCRC32()
{
PIMAGE_DOS_HEADER pDosHeader = NULL
PIMAGE_NT_HEADERS pNTHeader = NULL
PIMAGE_SECTION_HEADER pSection = NULL
DWORD ImageBase,OriginalCRC32
ImageBase = (DWORD)GetModuleHandle(NULL)// 取基址
pDosHeader = (PIMAGE_DOS_HEADER)ImageBase
pNtHeader = (PIMAGE_NT_HEADER32)((DWORD)pDosHeader + pDosHeader ->e_lfanew)
// 定位到PE文件头前4个字节值,并读取存储在这里的CRC -32值
OriginalCRC32 = *((DWORD*)(DWORD)pNtHeader - 4)
pSecHeader = IMAGE_FIRST_SECTION(pNtHeader) // 得到第一个区块的地址
//假设第一个区块就是代码区块
if(OriginalCRC32 == CRC32((BYTE*)ImageBase + pSecHeader ->VirtualAddress)
// 为了方便加壳
// 上一句也可为if(OriginalCRC32 == CRC32((BYTE *)0x401000, 0x36AE)
return TRUE
else
return FALSE
}
checksum是指这段程序的代码标识,checksum是唯一的,所以它是用来验证你烧录的程式胡贺是不是和原程式一致。当你刷完BIOS后,如果checksum和BIOS自己说明的一致表示刷新成功。如果你连它本身嫌做袭的checksum不清楚,那么芹兄无法验证是不是烧录了正确的代码。
你试下能不能正常开机,如果可以一般没有问题。
一、定义不同:
1.CRC:
是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术。
2.checksum:
在数据处理和数据通信领域中,用于校验目的的一组数据项的和。
二、作用不同:
1.CRC:
用除法及余数的原理来作错误侦测。
2.checksum:
保证数据的完整性和准确性。
扩展资料
在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为孙碧0),从而接受方接收到错误的数据。
为尽量提高接受方收到数据的正确率,在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。检测的方式有多种,常见的有奇偶校验、因特网校验改纳和循环冗余校验等。
循环冗余校验是一种用于校验通信链路上数字传输准确性的计算方法(通过某种数学运算来则歼举建立数据位和校验位的约定关系的)。
参考资料来源:百度百科-CRC
参考资料来源:百度百科-Checksum
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)