转自看雪
~6A;H$dr 原文地址 ^jbjHI& #<K'RJn R ;k1(p [1]引言
z0H+Or {S@gjMuN 本文对基于Windows NT的操作系统上使用的几种反调试技术进行了分类和介绍。
6E@TcN~,! 23d*;ri5 反调试技术是程序检测它是否在调试器(Debugger)下运行的方法。反调试技术被用于商业可执行程序的保护,加壳工具以及病毒等,以杜绝或减缓软件被逆(向工程)
E-jJ!>&K IayF<y,8 我们假设程序是在r3 debugger下进行分析的,例如Windows平台上的OD。本文面向逆向工程师和恶意软件分析师。
|&"/
u7^ 请注意,我们将纯粹谈论通用的反调试和反跟踪技术。此文不会涉及特定的调试器检测,例如窗口或进程的枚举,注册表扫描等。
Wr
3z%1 '4Drs}j5 [2]反调试和反跟踪技术
Spu>
ac `pb=y} - 利用内存差
A^c
( |2E:]wT}qg (1) kernel32!IsDebuggerPresent
kyi"U A82 如果正在调试进程,则IsDebuggerPresent返回1,否则返回0。此API只读取PEB!BeingDebugged 的byte-flag(位于PEB结构中的偏移 2)。
.[r1Qz7G 绕过它就只需要 PEB!BeingDebugged 设置为 0
2T?8{yO7 例:
."Kp6s `k - call IsDebuggerPresent
- test eax, eax
- jne @DebuggerDetected
- ...
.wV-g:2 s
!IvUc7' (2) PEB!IsDebugged
L\hid/NL :}UjX|D 该字段引用进程的Process Environment Block(进程环境块/区间?)中的第二个字节. 被调试期间会由系统设置为非0, 该字节可以被重置为0,而不会对程序的执行过程产生影响(因为这是一个信息标志).
82)%`$yZw[ h,\5C/ 例:
x)jc - mov eax, fs:[30h]
- mov eax, byte [eax+2]
- test eax, eax
- jne @DebuggerDetected
- ...
?8qN8rk^+ \3&