在我以前的雇主中,我们使用了一个第三方组件,它基本上只是一个 DLL 和一个头文件。该特定模块在 Win32 中处理打印。但是,制造该组件的公司破产了,所以我无法报告我发现的错误。
所以我决定自己修复错误并启动调试器。我很惊讶地发现反调试代码几乎无处不在,通常IsDebuggerPresent
是这样,但引起我注意的是:
; some twiddling with xor
; and data, result in eax
jmp eax
mov eax, 0x310fac09
; rest of code here
乍一看,我只是跳过了被调用两次的例程,然后事情就变得一团糟。过了一会儿,我意识到位旋转的结果总是一样的,即 jmp eax 总是直接跳到mov eax, 0x310fac09
指令中。我剖析了这些字节,它是用于测量 DLL 中一些调用之间所用时间0f31
的指令。rdtsc
所以我的问题是:你最喜欢的反调试技巧是什么?