破解之断点详解
本帖最后由 能隐能显 于 2014-10-16 20:31 编辑逆向之断点详解 在软件调试过程中出现最频繁的一个术语就是断点。断点(BreakPoint):是一个用于通知寄存器在执行到特定点时将程序暂时挂起的信号。当程序在挂起的时候我们称程序处于中断模式。进入终端模式并不会终止或者结束程序,程序流程可以在任何时候继续进行。断点分三类:Int3断点、硬件断点、内存断点1、Int3断点 Int3断点的机器指令为CCh,因而又称为CC断点。该断点的本质是修改指令,当调试到此断点时调试器会捕获到这个异常,并且停在断点处,然后将断点处的指令恢复为原指令。理论上可以设置无数个此类的断点。然而,由于该断点在下断后修改了原指令,如果将该断点设在API函数的首地址,程序可以通过检测函数的首地址是否是CCh来判断该程序是否被调试,如果程序加入了这个判断流程就可以改变函数的执行路线,从而使调试失败。如果想跳过这个检测机制可以通过将Int3断点设在函数尾处或者函数入口点的下一行来躲避检查。通过下面的代码可以检测API函数入口点是否被设置Int3断点: FARPROC addr;BYTE Marks = 0;(FARPROC &)addr = GetProcAddress(LoadLibrary("User32.dll"),"MessageBoxA");Marks = *((BYTE*)addr);if(Marks = 0xCC){return TRUE;} 2、硬件断点在寄存器中用于调试的寄存器被称为调试寄存器,调试寄存器一共有八个,从Dr0到Dr7。这八个寄存器按照不同的用途可以分为如下三类:a)Dr0--Dr3用于存放中断的地址,例如:401000hb)Dr4,Dr5 一般不使用,保留c)Dr6,Dr7 用来记录Dr0--Dr3这四个寄存器下断的属性,例如401000h这个地址是读、写还是执行;下断的是字节、字还是双子。通过上面的分类信息可以看出Dr0--Dr3用于设置硬件断点,也就是在调试过程中设置bmp断点。由于只有四个寄存器可以用于设置断点,因而在调试的过程中最多只能设置四个硬件断点。3、内存断点 程序在运行的过程中内存会有三种不同的状态:读、写和执行。设置内存断点就是通过对指定的地址设置不可访问/不可写属性,当程序试图访问/写入该内存地址的时候就会触发异常。OD截获异常之后通过比较异常地址是不是断点来判断是否要中断。任何时刻在调试器中只能存在一个内存断点。由于内存断点不会修改程序源码,在Int3中断被检测到并且硬件代码失效的情况下,可以用内存断点来代替。但要随时谨记在调试过程中只能有一处内存断点。
如果对你有帮助,请评分吧,评分是不用花的钱的喔。
不错的帖子,赚到了{:5_184:}
蜡笔小小新 发表于 2014-10-16 20:28
不错的帖子,赚到了
好就评分啊,看来我还是要加上一句话才行
感谢分享,学习了!
不错的帖子{:5_184:}
本帖最后由 pnccm 于 2014-10-17 16:26 编辑
楼主请问下cc断点是否就是我们一直常说的下 {:5_189:}F2断点 还有内存断点又该如何下断点。内存断点是需要自己通过某个地址下断点
还是可以像F2那样可以通过用API函数下短。
还请知道的话回复下。让我们这些新手学习学习
我很赞同!
学习了{:5_117:}
不错。学习了
感谢分享,学习了...