OllyDebug调试技巧

  • F2下断点,Alt+B打开断点编辑器,可编辑所有下过的断点,空格键可快速切换断点状态。
  • 当位于某个Call中,这时想返回到调用这个Call的地方,可以按Ctrl+F9快捷键执行返回功能。这样OD就会停在遇到的第一个返回命令(Ret, Retf)
  • 如果跟进系统dll提供的api函数中,此时想返回到应用程序领空里,可以按快捷键Alt+F9执行返回到用户代码命令
  • 领空,实际上就是指在某一时刻,CPU执行的指令所在的某段代码的所有者。如004014F7这类地址一般是可执行文件领空,7C8114AB这类大地址一般是系统dll所在的地址空间。
  • 程序通常读取文本框内容的字符串用的是以下两个函数:GetDlgItemText(A/W), GetWindowText(A/W)
  • 一般我们要结合经验通过猜测的方式多尝试几遍设陷阱,找出相关的函数。
  • Ctrl+G键打开跟随表达式的窗口。
  • Ctrl+N可以打开应用程序的导入表,然后查看应用程序总共导入了哪些函数来以此推断需要在哪里挖坑下陷阱。
  • VC++中,一般调用函数的指令都是push,push,push...Call,参数是逆序入栈的。
  • VC++中,关于返回值,汇编代码的返回值约定是存放在eax这个寄存器里面,如果32位的eax不够存放返回值,系统会将返回值放在内存的某个位置并把该位置的地址放在eax返回。
  • 在反汇编的过程中,经常要找Call,其实Call xxx就是push eip,然后jmp xxx,执行完就ret到Call指令所在的地址。
  • Call的几种方式

call 404000h; 直接跳到函数或过程的地址

call eax; 函数或过程地址存放在eax

call dword ptr [eax]; Call的是eax里面存的地址的值

call dword ptr [eax+5]; Call的是eax里面存的地址+5后的值

call dword ptr [<&API>]; Call一个系统api

  • 在反汇编中会经常遇到Test指令,Test指令和And指令一样,对两个操作数进行位于运算,只是不将结果保存,操作后对标志位重新置位。该指令在反汇编中99%是test eax, eax(如果eax为0,则ZF位置1)......
  • 在反汇编的过程中经常遇到条件跳转指令

  • 在条件跳转指令前也会经常遇到cmp指令

cmp a, b

如果a-b=0, 则ZF置1

无符号时:

CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时a<b

CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时a>b

有符号时:

若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,a>b

若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为a<b

若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出a<b

若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出a>b

最后两个可以作出这种判断的原因是,溢出的本质问题:

两数同为正,相加,值为负,则说明溢出

两数同为负,相加,值为正,则说明溢出

故有,正正得负则溢出,负负得正则溢出

  • 1、GetModuleHandleA这个api用于获取程序的ImageBase(基地址),可以从PEInfo获取。
  • 2、MessageBox有一个参数是OwnerHandle(父窗口句柄),如果为0则表示桌面的句柄,我们可以通过将这个值改为一个不存在的句柄,例如1,这样这个MessageBox就不会显示出来了。
  • 3、可以通过查找PE结构里面的程序入口,然后只要修改这个程序入口的地址,那么就可以跳过一些不必要的指令了。
  • 4、如果想让一些指令不执行,可以通过jmp直接跳到后面的地址,也可以将这些指令用nop填充,但是要注意不能损坏正常的程序运行逻辑。
  • 5、有些文件篡改了PE头的信息,虽然程序可以正常运行,但是却使得程序无法被OllyDebug反调试,这个时候需要去查看PE文件头的信息,找到被篡改的值将其修复。
  • 6、SEH(Structured Exception Handling),结构化异常处理。SEH是Windows操作系统提供的功能,和开发工具无关。
  • 7、异常也可以当作是一种消息,应用程序发生异常时就触发了该消息并告知系统,接收后同样会找它的回调函数,也就是我们的异常处理例程。
  • 8、如果程序中没有做异常处理,系统也不会置之不理,它将弹出常见的错误框,然后结束该程序。
  • 9、在OD中,也可以SHIFT+F9来忽略异常,也可在设置里面设置忽略的异常Code。
  • 10、在OD中先暂停,使用ALT+F9会自动返回到用户程序的领空。
  • 11、Ctrl+N可以查看输入表,可以通过右键下api断点。
  • 12、右键->查找->所有参考文本字符串 可以查询字符串,记得从头开始查询,然后双击查询到的字符串即可跳到对应的地址。
  • 13、右键->查找参考->选定命令 可以跟踪这条指令
  • 14、右键->查找->所有模块中的调用 可以用来查询api

来自:

我是枫子 - 博客园https://www.cnblogs.com/maplewan/

猜你喜欢

转载自blog.csdn.net/xiao_yi_xiao/article/details/121561980