逆向中反制反调试手段笔记

IsDebuggerPresent 绕过

IsDebuggerPresent 作为 winapi 函数,不可去符号表,在 ida 中可以通过导入表 (imports) 找到函数,然后通过以下几种手段绕过:

  1. 调试时,修改函数返回值 (即修改 rax 寄存器值)
  2. 调试时,修改相应的内存 (内存窗口中查找 fs:[30] 位置,即 PEB 地址,偏移为 0x68 的位置即为 BeingDebugged )
  3. 将调用函数后的条件语句修改 (jzjnz / jnzjz)
  4. 将相应代码区段 patch nop
  5. 动态调试时,直接跳过函数运行

PEB 标志位绕过

需要通过 ida 查找是否有涉及到 fs 寄存器的汇编代码

然后再进行相应的操作,如 patch nop 等。

自修改代码绕过

如以下例题

ques

静态分析

通过 ida 静态分析,找到相应的修改算法,通过 ida python 逆向修改代码区段

1
2
3
4
5
6
7
8
judge=0x600B00
for i in range(182):
addr=judge+i
byte=get_byte(addr)
# 获取指定地址的指定字节数
byte=ord(byte)^0xC
# 打patch修改字节
patch_byte(addr, byte)

一个可能的 IDA Python 静态分析脚本:

1
2
3
4
5
6
start = 0x402219
offset = 233
xorn = 0x99
data = get_bytes(start, offset)
newdata = bytes(map(lambda x: x ^ xorn, data))
ida_bytes.patch_bytes(start, newdata)

动态分析

通过 ida 或是 ollydbg 等动态调试器,在解密代码后下断点,可以直接将其自修改后的程序导出,但会存在数据可能发生错误的问题。

最好将对应自修改后的代码与之前的代码进行结合分析。