《加密与解密》笔记二

这次主要是记录OllyDbg的断点作用和使用方法。

普通断点

这个断点主要是把设断部分改为int 3也就是执行三号中断,然后触发中断后程序停留开始执行中断OD捕捉这个中断以后将源代码改回原来的指令。
优点:很方便的设置断点,可以设置无数多个
缺点:容易被检测到,比如:

#include
int add(int a,int b ,int c)
{
    _asm {
        INT 3
    }
    int d = a + b + c;
    printf("%d", d);
    return 0;
}
int main()
{
    int a = 0, b = 0, c = 0,d = 0;
    if (
#ifdef _DEBUG
    (d = *(char *)(((unsigned int)add + 5) + *(int *)((unsigned int)add + 1) + 0x1E), d & 0x000000FF)
#else
        (d = (*(char *)((unsigned int)add + 0x1F)), d & 0x000000FF)
#endif  
        == 0xCC
        )
        return 0;
    add(a, b, c);
    return 0;
}

(只是说明检测的方法,实际检测回更简单,因为在C语言环境下没办法直接在开头就直接设置int 3的,所以用了一下偏移,实际上一般开头就是)
当然,防范这种检查可以在后面一点的位置下断点。
快捷键是F2

硬件断点

《加密与解密》笔记二_第1张图片
我肯可以发现,其中DR0到DR4都是存放断点的寄存器,这个时候我们只需要在OD的寄存器窗口右键选择查看调试寄存器就可以看到,下断的时候在所要下断的代码处右键断点硬件执行就可以,然后在上方的调试->硬件断点里面可以删除,或者在之前的代码处也可以删除。
优点:不会被检测到断点存在
缺点:只额可以设置4个断点。
快捷键:F4是直接执行到所选位置,这里其实运用的就是这个硬件断点,但是只是一次性的。

内存断点

这个断点的原理实际上就是将选中的内存设为不可访问和读写的,此时如果放翁到相应的内存就会触发异常此时OD就捕获异常并判断这个异常是否是之前设置的哪个位置,如果是的话就发生中断,然后通知用户。
设置方法:
选中要下段的内存区域,然后右键断点->内存写入,用完以后(发生中断后)就可以右键->断点->删除内存断点。
或者是直接在要执行的代码上右键断点->内存访问,之后的删除部分也是一样的。
优点:在上两种方法失效的情况下可以尝试使用这种方法。
缺点:会降低速度

内存访问一次性断点

这个断点就是借助了段页式内存管理,在OD按一下上面的m或者是ALT+M可以看到很多段,在这些段上右键或是F2就可以在访问上设置断点,这个是一个一次性的断点,其中里面的设置访问断点和这个功能一样,只不过不是一次性的。

消息断点

这个就涉及到之前的Win32里面的消息了,实质上就是对某一个窗口设置一个触发某个消息时的一个断点,方法是:
点击工具栏的w,然后在程序执行到相应窗口时点右键刷新找到相应的窗口以后右键就可以设置相应的消息断点了

条件断点

其实就是选定某一条指令当然后设定条件断点(Shift + F2)然后输入条件就好了,比如我在循环处写一个ecx==00000000,之类的就可以等他跳出循环了再看变化,或者是在调用函数的一开始,我们可以判断让他满足某一个条件,函数的参数是由ebp进行相加得出的(在入栈的时候esp会一直往小地址走,然后调用了一个函数之后会现有mov ebp,esp,然后才是add esp,….所以ebp往后的前四个字节(ebp + 0~3)就是第一个参数(ebp所指的4字节的数字是retu时的返回地址,我们可以对这个地址修改达到一个攻击手段)然后第四个字节时函数的第一个参数,因为一开始我们的调用惯例都是默认的_cdecl或者是_stdcall,都是由右往左入栈,所以有:
int a,b,c;
add(a,b,c);
mov eax,dword ptr[c]
push eax
mov eax,dword ptr[b]
push eax
mov eax,dword ptr[a]
push eax
call add(这一句实际上是push的下面那个指令的地址)
所以此时的esp后面的内容是:一个地址,a,b,c。
所以我们要监控变量a只需要:
[ebp + 4]== …..就可以。

之后是监控条件断点

这个其实就是之前监控的一个升级版,这个可以列出你想要得到执行某一个指令时的某一内容的所有情况:
摁shift+F4然后就会出现:
《加密与解密》笔记二_第2张图片
然后如果条件那一栏不填写也是OK的只是不会有特别显著的提醒,但是一定要注意的是监控的表达式一定要写。
书上的一个例子:
《加密与解密》笔记二_第3张图片
《加密与解密》笔记二_第4张图片
这样就很直观的可以看出数据的变化了。(这个Log data是用Alt + L快捷键打开的)

你可能感兴趣的:(加密与解密-笔记)