常见静态反调试技术总结

静态反调试技术

本文介绍了几种常见的静态反调试技术,包括PEB,LTS等
文中用到的程序资源https://download.csdn.net/download/weixin_45551083/12549567

1 PEB


TEB(Thread Environment Block,线程环境块)系统在此TEB中保存频繁使用的线程相关的数据。位于用户地址空间,在比 PEB 所在地址低的地方。进程中的每个线程都有自己的一个TEB。一个进程的所有TEB都以堆栈的方式,存放在从0x7FFDE000开始的线性内存中,每4KB为一个完整的TEB,不过该内存区域是向下扩展的。在用户模式下,当前线程的TEB位于独立的4KB段,可通过CPU的FS寄存器来访问该段,一般存储在[FS:0]。

PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息。位于用户地址空间。在Win 2000下,进程环境块的地址对于每个进程来说是固定的,在0x7FFDF000处,这是用户地址空间,所以程序能够直接访问。

  • 获取PEB地址:
    (1) 直接获取
mov eax,fs:[0x30]
mov PEB,eax

(2) 先获取TEB地址,再获取TEB

mov eax, fs:[0x18]		;0x18处是TEB地址
mov eax, ds:[eax+0x30]
  • PEB中与反调试密切相关的成员:
+0x002 BeingDebugged
+0x00c Ldr
+0x018 ProcessHeap
+0x068 NtGlobalFlag 
1.1 BeingDebugged +0x002

​ 进程处于调试状态时,PEB.BeingDebugged成员的值设为1.在非调试状态下为0;

  • IsDebuggerPresent() API
    通过获取PEB.BeingDebugged的值来判断是否处于被调试状态,被调试返回非0值,未被调试返回0值
    修改PEB.BeingDebugged的值或者IsDebuggerPresent() 的返回值即可破解
1.2 Ldr +00c

​ 调试进程时,其堆内存区域中会出现一些特殊标识,表名它正处于被调试状态.最醒目的是.未使用的堆内存区域全部填充着0xEEFEEEFE.利用这一特征可判断是否处于被调试状态.
​ PEB.Ldr 指向_PEB_LDR_DATA结构体指针,_PEB_LDR_DATA恰好是在堆中创建的.检测_PEB_LDR_DATA是否是0xEEFEEEFE即可判断是否处于被调试
​ 将填充着0xEEFEEEFE的区域写为NULL即可破解

1.3 ProcessHeap +0x018

​ PEB.ProcessHeap指向HEAP结构体.
​ HEAP结构体中与反调试有关的:

+0xC  Flags
+0x10 ForceFlags

程序正常运行时,
​ HEAP.Flags=0x2
​ HEAP.ForceFlags=0
调试时会发生变化.

  • GetProcessHeap()
    获取Flags和ForceFlags值来判断是否处于调试状态
    破解: 将HEAP.Flags重新修改为2 HEAP.ForceFlags修改为0
1.4 NtGlobalFlag +0x068

​ 调试进程时,PEB

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值