- 静态反调试
- 特点:在调试开始阻拦调试者
PEB | BeginDebug:调试标记位 Ldr:内存状态 Heap(Flag,Force Flags):堆状态 NtGlobalFlag:内核全局标记 |
TEB | StaticUnicodeString:静态缓冲区 |
原始API | NtQueryInformation() ProcessDebugPort(0x07):获取调试端口 ProcessDebugObjectHandle(0x1E):获取调试句柄 ProcessDebugFlag(0x1F):获取调试标记 NtQuerySystemInformation() SystemKernelDebuggerInformation(0x23):获取系统调试状态(双机) NtQueryObject():遍历系统内核对象 |
攻击调试器 | 分离调试器 NtSetInfomationThread() ThreadHideFromDebugger(0x11) |
打开进程检查 | SeDebugPrivilege:检查进程是否具有调试权限 |
TLS回调函数 | 坑爹 |
普通API | 父进程检查 窗口名检查 进程名遍历 文件名及文件路径检查 注册表检查 |
特点:调试过程中阻拦调试者,在调试中频繁触发
SEH | 异常 断点 SetUnhandleedExceptionFilter() |
时间检查 | RDTSC:汇编,读取时间戳计时器内容 |
单步检查 | F7 |
补丁检查 | 0xCC扫描程序内0xCC,检查INT3 Hash扫描:扫描代码段Hash值,如不对则说明运行时被修改或调试 API断点扫描:扫描API的第一个字节是否为0xCC,是则说明被调试 |
反反汇编 | 指令截断:将指令截断,致反汇编引擎后续指令解析错误 指令混淆:将敏感指令拆分成多块或若干不相干的指令进行迷惑 指令膨胀:将一条指令膨胀为数十条,但行为与其一致 代码乱序:将原有代码在内存中的顺序打乱,用jmp连接,干扰调试者 |
偷取代码 | 偷取OEP代码:将OEP代码移动到其他地方加密 偷取API代码:将API的部分起始代码移动到其他地方 |
分页保护 | 运行时保护分页:修改代码及数据段保护属性干扰分析 |
壳 | 压缩壳:配合OEP加密可以使调试者很难顺利逆向 加密壳:添加各种反调试手段干扰调试者分析 |
虚拟机 | API虚拟机:将部分常用API放到虚拟机中模拟执行 指令级虚拟机:可以将任意一段指令放到虚拟机中保护起来 |