ollydbg原理分析~硬件断点与int3

今天继续接着上次的分析,来继续分析OD原理,这次先分析OD最基本的功能,断点,单步和运行到指定位置。

类似的文章前辈们已经写了很多了,这里只是将前辈们的思路实践了一下,顺便加入一点自己的理解和认识!

一般载入OD之后,往往大家会先下断点,或者直接单步运行。

一般当我们着手分析一个程序的时候总是会下一个INT 3断点,其实这个就是F2的原理

随便载入一个程序,点一下F2,然后用ollydbg保存的时候,发现提示说是文件未被修改,其实这个也能理解,因为我们按下F2的时候,程序还没被运行,所以dump下来吧,但是dump需要要求程序连同f2能够断下,所以改一下程序:

ollydbg原理分析~硬件断点与int3_第1张图片


构建一个这样的死循环,这样,程序在运行的时候会一直在013B2165前运行,而断点在后,内存中断点被记录,所以dump下来就可以看到程序的变化

Dump下重新加载:

ollydbg原理分析~硬件断点与int3_第2张图片

Int 3粗线了,原理得证明(基址加载的时候肯定会变化)

 

 

F4原理:

改一个这样的程序

ollydbg原理分析~硬件断点与int3_第3张图片

看一下调试寄存器


F4后将F4地址放在了调试寄存器里,运行程序的时候就会中断到那个地方

 ollydbg原理分析~硬件断点与int3_第4张图片

 

 

F8(步过)原理:

随便写一个程序,然后修改一下汇编,使之构成一个循环


在00F11DE8处F2断点

在函数的时候F8步过,发现函数停在00F11DE8处,然后在调试窗口右击查看调试寄存器,发现

ollydbg原理分析~硬件断点与int3_第5张图片

关于调试寄存器,具体说明请看装载的这篇文章,

有了对调试寄存器大致的了解之后,貌似我们弄懂了一些在逆向时候的问题

比如为什么硬件断点只能有4个(只有4个调试寄存器)

我们发现在DR0处存放了一个中断地址,但是这个地址不是F2断的地方,而是函数的下一条地址,那么在单步的时候,我们在查看一下调试寄存器:

发现调试寄存器根本没有变化,其实这个很好理解,因为在没有执行到函数之前的F8其实就是相当于F2功能

 

 

 

 

 

F7原理:步入

这个说法不一,查询了前辈们的说法,认为是标志寄存器T的原因:

当TF被设置位1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令,需要用其他办法。

自己想了一个方法证明:

构造一个这样的循环:

 ollydbg原理分析~硬件断点与int3_第6张图片

在运行到call的时候,改变T的标志位,然后直接让程序运行,发现程序停在开始处,得证。

 

在这和之后,在贴一段前辈们的总结:

将TF置1:程序将断在下一条原子操作处,并将TF位清零。原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行倒结束,中间不会有任何 context switch (切换到另一个线程)。call指令是原子操作,它的作用是:将返回地址压栈,并跳转。所以,在调用call的时候,如果我们将TF置1,那么程序将在call指令的功能完成以后(即将返回地址压栈并跳转)断下来。而执行call内的语句则仅仅是call的逻辑功能(我们理解的功能),并非实际的功能(CPU理解的功能)。

 

 

 

以上差不多硬件断点的一些原理都介绍了,验证的方法其实就是怎么去构造那段汇编代码,其实这个也很好想啊,想验证对函数的操作,步入或者步过,就要构造一个call啊,想要了解运行到断点处和光标处,就要想着让他跳转啊,所以有jmp,然后之所以都构成循环,是因为让程序停在我们需要验证的地方啊。

接下来会继续分析,OD的内存断点的原理

未完待续,大牛勿喷!

 

你可能感兴趣的:(逆向分析)