OD定位IsDebuggerPresent检测地址
- 编写个小程序,调用IsDebuggerPresent来检测调试器是否存在
2.打开原版汉化OD并附加到程序里,这里不能使用第三方OD,因为第三方OD集成了许多插件,有一定强度的反调试功能。
附加后,OD自动在模块入口处断下。
3.Ctrl+F9,执行到返回,程序跑起来之后再按Ctrl+N,调出来查看程序用了哪些模块命令。
找到了,这个程序调用了IsDebuggerPresent。
4.右键,这里我选择第一个,进入函数地址对应的汇编窗口
5.可以看到函数对应的代码段
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运行起来,可以看到此时已经被断下,在栈窗口中看到了访问此地址的别的地址
6.点击栈窗口中的0146FB14(也就是第一行地址),回车,此时汇编窗口会切换到这个函数的地址
可以看到上面有个CALL,后面的备注就是这个函数,还看到下面有个检测到调试器的对话框,程序的检测逻辑一目了然