清除硬件断点的方法有哪些?修改调试寄存器,CONTEXT结构体
1.对API下断点,测试是否会断下应该是存在判断敏感API的机器码,检测第一个字节是否是0xCC,故此处导致程序崩溃了,破解方法就是在第二行反汇编下断点。 尝试在下一行重新下断点,结果程序直接运行了?并没有断下。 再次尝试在API对应的底层函数调用的位置下断点 结果发现程序还是运行起来了,并没有断下,所以应该不是API,而是异常
2.搭建异常触发环境首先我们需要对OD进行一些配置,在菜单中找到调试选项,将一些异常取消忽略,按照以下配置。 除了OD调试选项的配置之外,一些反反调试插件也需要做些配置,这里我们使用的是StrongOD插件,在插件中找到StrongOD,取消插件对一些异常的跳过。按照以下配置对插件进行设置。 程序运行起来,发现一共有7个异常,需要排查出对硬件断点清0的地方,这里采用在异常点设置硬件断点的方法,尝试看能不能断下来,如果能断下来说明当前异常点前面的异常处理函数中没有对硬件断点清0。
第一个异常: 第二个异常: 第三个异常: 第四个异常: 第五个异常: 第六个异常: 第七个异常: 按照上面的思路,首先在第二个异常点设置硬件执行断点,然后动态调试程序,如果硬件执行断点有效(在状态栏中可以发现硬件断点命中的提示信息)说明第一个异常点的异常回调函数中没有清除硬件断点的代码。
硬件执行断点的特点是到了这个地址就会停下来,而异常是必须触发,即必须执行了这段代码,执行了这条指令才能够触发,如果先触发了硬件断点,就意味着这个异常前面的异常处理函数是没有清除硬件断点的,
按照这样的方式,依次测试每一个异常的回调函数。第二个异常:这条指令还没有执行之前就已经触发了硬件断点,说明第一个函数内没有清除硬件断点 清除第二个异常处的硬件断点,依次向下一个异常继续下硬件执行断点
第三个异常 这条指令还没有执行之前就已经触发了硬件断点,说明第二个函数内没有清除硬件断点 第四个异常这条指令直接触发了异常,说明第三个函数内有清除硬件断点的代码 综上所述,发现第三个异常,即第一个STI特权指令异常回调是清除硬件断点的代码。打开SEH链观察 在0043AF42的位置下断点 继续shift+F9进入第三个异常处理函数 上面代码由于是和异常、清除硬件断点有关的,所以其中肯定有异常相关的结构体和寄存器相关的Context结构,直接分析代码不太容易看出来,这个时候我们就可以将其直接在这个地方进行DUMP,这里DUMP不是为了脱壳,只是单纯的DUMP,然后方便在IDA中查看其中的代码,使用IDA特有的解析结构体的功能,解析可能存在的结构体。 进入IDA,我直接一手F5...... 在结构体中Inser添加一个Context结构 在伪代码中转换结构体 继续回到OD,分析这段代码应该就是清除硬件断点的代码 初步思路:在0043AF59的位置设置一个断点,到了这个断点之后将清除硬件断点的这段代码清除一下,将其NOP掉,后面的硬件断点就能正常的触发了
将之前更改的设置还原,把异常重新跳过
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课