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
}
修改BIOS需要的工具集1。ultraedit : 编辑反汇编文件(看BIOS模块到底做什么)和二进制文件(修改模块),以及txt 文件
2。Award BIOS 修改工具:
1) CBROM : 导出替换模块
2) modbin : 修改CMOS 选项等, 高级 DIY 者修改 BIOS 的核心模块 original.bin
3) awardeco : 导出模块工具,可以看到每个模块释放到 RAM 的位置。
debug32 : 简单插入代码时,需要参考汇编语句得实际代码是什么,特别是帮助计算跳转。。。
masm 5.0. 6.11 等: 插入代码量大、需要插入几个子程序时,debug 就难用啦,一般也需要压缩一点代码。。。。
disktool 和 winhex : 个别工具死活不让修改得结果存盘时,可以考虑直接修改文件所在的扇区。。。这些可是破解软件高手的工具呢。
BIOS 源代码参考: 实际上 diy 根本不可能研究源代码的,手上拥有一份,当个老师在旁边,
w32Dasm 反汇编工具: 导出 BIOS模块后进行反汇编( 选 16位好看,这是我的习惯),按照你
自己或朋友的分析、猜想,估计程序执行了什么。怎么执行的, 然后找反汇编文件,看看是不是这样的。找到后旧大胆地测试。
IDEHelper : 高级字符串搜索工具, 没有其他可以比!!!可以在一个目录下搜索所有的文件。
Labtool-48 编程器: 这是我修改BIOS 用的编程器, 这里讲的时它的软件,有一个 edit 可以返配看bin 文件的 checksum. 很多 没有饥纯模块的BIOS 修改后cheksum 需要保持不变修改checksum 后,直接烧到芯片上测试,快捷!据说其他工具如 winhex 也有checksum 检测, 还有更复杂的呢。但工具切换多了,漏肢指在特别忙的时候,经常会碰到“修改一个文件,但你却测试另外一个文件”的怪事。。。
刷机步骤(线刷):①在电脑下衡空载一个线刷宝
②在关机状态下长按电源键跟音咐弯瞎量减键5秒闹喊会自动进入一个有安卓机器人的界面
③用数据线连接手机
④线刷宝会识别出手机型号并且给出相应的刷机包点下载就可以
⑤下载完成之后点刷机就可以等到电脑显示刷机成功了就可以拔下手机。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)