前言:dbg是很好的调试工具
dbg的界面
我们将.exe的文件拖入dbg,下图演示的是32位的dbg。
一共有四个窗口,分别是:反汇编窗口、寄存器窗口、数据窗口、堆栈窗口。
这里需要充分了解部分寄存器
esp寄存器:拓展堆栈指针寄存器,其指向的是当前栈空间的地址。
eip寄存器:指令拓展寄存器,其总是指向下一条要被执行的指令
标志位寄存器:ZF、OF、CF
基本的快捷键及功能
F2:下断点,指定断点的地址(断点是软件断点,与硬件断点有所区别)
F3:加载一个可执行程序
F4:执行程序到光标处
F7:单步步入
F8:单步步过
F9:直接运行程序,遇到断点暂停
Ctrl+F2:重新运行到起始处
Ctrl+F9:执行到函数的返回处
Alt+F9:执行到用户代码处
Ctlr+G:快速定位地址
相关概念
OEP(Original Entry Point):
程序的入口点。软件加壳一般隐藏了真实的OEP(或者使用了假的OEP),这时我们需要寻找程序真正的OEP,才可以完成脱壳。
IAT(Import Address Table):
在可执行文件中使用其他DLL可执文件的代码或者数据,称为导入或者输出。在脱壳或者加壳的部分中,导入表是什么关键的一部分。加壳要尽可能的破坏和隐藏原始的导入表;而脱壳刚好相反。
ESP定律法:
ESP定律的原理在于利用程序中堆栈平衡来快速找到OEP。由于在程序自解密或者自解压的过程中,不少壳会先将当前寄存器状态压栈,如使用pushad,在解压结束后,会将之前的寄存器值出栈,如使用popad(OEP就在附近)。因此在寄存器出栈时,往往程序代码被恢复,此时硬件断点触发。然后在程序当前位置,只需要少许单步操作,就很容易达到正确的OEP位置。