逆向中反制反调试手段笔记
IsDebuggerPresent 绕过
IsDebuggerPresent
作为 winapi 函数,不可去符号表,在 ida
中可以通过导入表 (imports) 找到函数,然后通过以下几种手段绕过:
- 调试时,修改函数返回值 (即修改 rax 寄存器值)
- 调试时,修改相应的内存 (内存窗口中查找
fs:[30]
位置,即PEB
地址,偏移为 0x68 的位置即为BeingDebugged
) - 将调用函数后的条件语句修改 (
jz
→jnz
/jnz
→jz
) - 将相应代码区段 patch
nop
- 动态调试时,直接跳过函数运行
PEB 标志位绕过
需要通过 ida 查找是否有涉及到 fs
寄存器的汇编代码
然后再进行相应的操作,如 patch nop
等。
自修改代码绕过
如以下例题
静态分析
通过 ida 静态分析,找到相应的修改算法,通过 ida python 逆向修改代码区段
1 | judge=0x600B00 |
一个可能的 IDA Python 静态分析脚本:
1 | start = 0x402219 |
动态分析
通过 ida 或是 ollydbg 等动态调试器,在解密代码后下断点,可以直接将其自修改后的程序导出,但会存在数据可能发生错误的问题。
最好将对应自修改后的代码与之前的代码进行结合分析。