X86逆向10:学会使用硬件断点
本节课我们将学习硬件断点的使用技巧,硬件断点是由硬件提供给我们的一组寄存器,我们可以对这些硬件寄存器设置相应的值,然后让硬件帮我们断在需要下断点的地址上面,这就是硬件断点,硬件断点依赖于寄存器,这些寄存器有个通用的名称,即调试寄存器,调试寄存器一共有8个分别从Dr0-Dr7。在软件破解中硬件断点常用来寻找赋值或读取的原始位置。
硬件断点并不是OD等调试器的特有功能,调试器只是把用户的需求转换成特定的格式,并写入DRX寄存器组中,等待硬件返回执行结果,由于硬件断点是由CPU直接提供硬件级别的支持,所以硬件断点的效率是所有断点中最高的。
在OD等调试器中,除了硬件断点之外,还有个内存断点,内存断点通过修改内存页的属性并捕获异常来间接暂停被调试的程序运行,内存断点的效率大大低于硬件断点,但内存断点的自由性大于硬件断点,通常情况下能用硬件断点则不要使用内存断点,有时候容易卡成狗。
------------------------------------------------------------
本章难度:★★★★☆☆☆☆☆☆
课程课件:CM_10.zip
------------------------------------------------------------
1.老样子在进行破解实战之前,我们先来看一个CM小程序,先了解一下硬件断点的使用技巧,如下OD直接载入这个CM程序然后运行。
2.我们直接按下【Ctrl + B】,输入按钮事件特征码【FF 55 FC 5F 5E】,然后在CALL的位置下断点。
3.回到CM程序,点击【测试硬件写入断点】,OD断下后按下【F7】进入到CALL的内部,也就是按钮的按钮事件。
上图有CMP指令,该指令取出【4A25F0】中的数值,和0做了一次比较,从而影响了JNZ跳转,我们接下来就是找到是谁向这个内存地址写入的数据。
4.直接在数据窗口,按下【Ctrl +G】,输入内存地址【4A25F0】,会发现其中的数值是0。
5.选择数据窗口中的第一个DWORD数据,然后选择【断点】,【硬件写入】,【DWORD】,这里的DWORD是由CMP指令决定的,此处【CMP DWORD PTR】所以我们需要下一个DWORD断点。
6.下完断点后重新载入程序,然后运行程序会直接断下,你会发现一条【MOV DWORD 】这样的赋值语句,没错这就是源头。