逆向学习(四):知己知彼,掌握逆向思路

仔细现察一个程序, 我们会发现, 无在怎么加密, 无论加密哪里, 这个程序加密的目的就是需要你掏腰包来获得更多的功能或者解除限制。
那么我们就可以逆向地来思考, 如果程序成功注册后, 程序的行为必将发生变化, 如NAG窗口去除, 功能制没有了等等。
也就是说, 程存代码的走法也会跟未注册的时候截然不同。因为程序的行为改变了, 那么决定它所有行为的代码走法也会发生变化。

  • 举个例子:
    • 未注册 -> 不跳过NAG窗口
    • 已注册 ->改编代码或条件,跳过NAG窗口
    • 也就是说只要找到判断是否需要“跳”的条件即可。

一般情况的条件跳,我们会想到:cmp ××,×× 接着jz或jnz或jl等;
其实,还有另外一种形式,叫做可变跳转。

一、认识两种断点

OllyDBG 从原理上来区分,有两种不同的断点:软件断点和硬件断点。
也许会有朋皮说不是还有内存断点吗?
内存断点严格来说是属于一种特殊的件断点。

内存断点:
  • 内存断点每次只能设置一个, 假如你设置了另一个内存断点, 则上一个会自动删余。
  • 设置一个内存断点, 会改变整块(4KB)内存的属性, 哪怕你只设置一个字节的内存断点。
  • 内存断点会明显降低OD性能,因为OD经常会校对内存。
软件断点
  • 就是我们常用的F2,常在004××处使用。
  • 原理是在断点处重写代码,插入一个int3中断指令,当cpu执行到int3指令的时候,OD就可以获得控制权。
硬件断点
  • 原理与软件断点不同,硬件断点的可行性依赖于CPU的物理支持。
  • 有一些寄存器,只是用来调试,称为调试寄存器:Dr0\~Dr7。
  • 其中Dr0\~Dr3四个寄存器用来存放中断地址,Dr4、Dr5保留不使用,Dr6、Dr7用来记录Dr0~Dr3的属性(如读、写、执行,单位是字节、字还是双字)。
  • 因此,这就解释了硬件断点只有四个。

如何区分该用哪种断点

因为两种断点都有自身限制,只要清楚他们各自特性就知道何时用哪种断点了。
如软件断点只能在OD的CPU界面下,在数据段下不了,在一条指令的中间也下不了。
在我们的例子中,我们需要在windows的动态链接库中下断点,因为软件断点下在dll文件中是不会保存的,重启程序将会丢失断点。因此我们需要用到硬件断点。

评论

Your email address will not be published. Required fields are marked *

Scroll Up