OD定位IsDebuggerPresent检测地址

  1. 编写个小程序,调用IsDebuggerPresent来检测调试器是否存在

OD定位IsDebuggerPresent检测地址

2.打开原版汉化OD并附加到程序里,这里不能使用第三方OD,因为第三方OD集成了许多插件,有一定强度的反调试功能。
附加后,OD自动在模块入口处断下。
OD定位IsDebuggerPresent检测地址
3.Ctrl+F9,执行到返回,程序跑起来之后再按Ctrl+N,调出来查看程序用了哪些模块命令。
找到了,这个程序调用了IsDebuggerPresent。
OD定位IsDebuggerPresent检测地址

4.右键,这里我选择第一个,进入函数地址对应的汇编窗口
OD定位IsDebuggerPresent检测地址
5.可以看到函数对应的代码段OD定位IsDebuggerPresent检测地址
FS寄存器指向当前活动线程的TEB结构(线程结构)
偏移 说明
000 指向SEH链指针
004 线程堆栈顶部
008 线程堆栈底部
00C SubSystemTib
010 FiberData
014 ArbitraryUserPointer
018 FS段寄存器在内存中的镜像地址
020 进程PID
024 线程ID
02C 指向线程局部存储指针
030 PEB结构地址(进程结构)
034 上个错误号

由此可知,第一行的含义是获取PEB结构地址,并送入寄存器EAX里;
第二行的含义是EAX的地址再加上偏移2,再次送入寄存器EAX里;
第三行的含义是返回EAX的值。

给第一行代码下断点,然后F9运行起来,可以看到此时已经被断下,在栈窗口中看到了访问此地址的别的地址
OD定位IsDebuggerPresent检测地址
6.点击栈窗口中的0146FB14(也就是第一行地址),回车,此时汇编窗口会切换到这个函数的地址
OD定位IsDebuggerPresent检测地址
可以看到上面有个CALL,后面的备注就是这个函数,还看到下面有个检测到调试器的对话框,程序的检测逻辑一目了然