本文共 2901 字,大约阅读时间需要 9 分钟。
见
隐藏和保护程序代码与数据, 阻碍逆向分析. 动态反调试技术会干扰调试器, 使之无法正常跟踪查找源程序的核心代码(OEP).
在SEH机制下, 如果程序发生异常OS通常会交给进程中的SEH处理, 但是被调试的进程异常被调试器接收, 所以根据这点可以判断进程是否被调试.
通常SEH会通过INT3指令系统断点触发, 如果是调试状态, 进程会因为没有得到异常处理而终止, 非调试状态则会在SEH代码执行之后恢复正常, 继续运行, 为了破解这个反调试技术, 可以在调试器中设置INT3 breaks忽略的选项, 让调试器碰到INT3中断时自觉交个SEH处理, 这样就能继续进入正常代码调试. 下图是OllyDbg的设置.当异常不被SEH处理时, 还有一个API会接收异常, 就是SetUnhandledExceptionFilter()
. 这个API会调用系统最后的异常处理器, 称为Last Exception Filter. 不过异常处理器只是弹出错误信息框, 终止进程运行. 但是需要注意的是SetUnhandledExceptionFilter()这个API, 而不是最后的异常处理器, kernel32!SetUnhandledExceptionFilter()
中会调用ntdll!NtQueryInformationProcess(ProcessDebugPort)
API (静态反调试)来判断是否处于调试状态. 如果知道是调试状态则将异常抛给调试器, 如果不是则调用最后的异常处理器.
kernel32!SetUnhandledExceptionFilter()
修改最后的异常处理器, 在最后的异常处理器中判断调试状态, 所以是结合了静态和动态两种反调试方法. 破解方法, 钩取ntdll!NtQueryInformationProcess(ProcessDebugPort)
先破解静态反调试, 然后跟踪SetUnhandledExceptionFilter()
注册的Exception Filter找到正常运行的地址.
代码调试过程是比正常运行的耗时要多得多的, 根据这点可以根据时间信息来判断是否在调试.
破解方法, 就是修改时间信息, 欺骗反调试代码. 不过Timing Check常常是和其他反调试技术并用的, 所以破解难度直线上升. 另外, Timing Check常常用作反模拟技术, 比如在模拟器中运行的程序, 速度要慢很多, 所以可以判断是否是在模拟器中运行. 技术分类Counter based method | Time based method |
---|---|
RDTSC | timeGetTime() |
kernel32!QueryPerformanceCounter() / ntdll!NtQueryPerformanceCounter() | _ftime() |
kernel32!GetTickCount() |
RDTSC(Read Time Stamp Counter)
x86 CPU中有一个Time Stamp Counter时间戳计数器, 对每个时钟周期计数然后保存到TSC RDTSC是将TSC的值读取到EDX:EAX的汇编指令破解方法
TF
EFLAGS寄存器的第9个比特位破解方法, 设置调试器忽略EXCEPTION_SINGLE_STEP异常, 即可绕过TF检测.
破解方法, 利用TF标志绕过INT 2D指令. 在INT 2D处下断点, 设置TF = 1, 一个很巧妙的想法, 用异常冲掉内核指令INT 2D的效果, TF == 1时, 执行INT 2D不会让CPU忽略下一个字节的指令代码, 所以INT 2D无效化了. 用异常打败异常
最本质的反调试思想, 因为对于x86CPU, 所有调试都是基于把指令第一个字节设置成0xCC来中断程序运行的, 所以检测作为断点的0xCC就能判断调试状态. 注意不是单纯扫描0xCC, 因为0xCC可以是立即数, 地址, 偏移量等, 不一定就是调试器下的断点.
反调试思想, 预判破解者通常在API开始的第一个指令处下断点, 所以专门检测API的第一个字节是否是0xCC来判断调试状态.常用API
比较校验和
特定代码区域的校验和, 如果下了断点某个字节改成了0xCC, 则校验和也会随之改变. 所以发现校验和不一致, 就可判断调试状态. 破解, 避开校验区域设置断点, 或者修改程序控制流强制转到正常代码运行. 不过比较校验和的反调试技术会用于多个区域, 数十上百个, 因此采用了该技术的程序破解难度大大增加.动态反调试技术重要是下面这些
反调试技术是逆向技术中的高级技术, 浓缩了很多低中级的逆向技术, 还另有扩展, 静态和动态反调试是实际软件保护技术的重要部分, 也是逆向技术中的精彩一环, 目前暂时了解了一点点Windows系统的反调试技术, 未来在纵向上还需要继续实践打磨, 横向上还需要继续深入学习Linux, Android, IOS等系统的反调试技术.
转载地址:http://vvfq.baihongyu.com/