欢迎来到 无奈人生 安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Windows下反反调试技术汇总

来源:未知 作者:wnhack 时间:2019-01-08 14:28 点击: 我要投稿
广告位API接口通信错误,查看德得广告获取帮助
一、前言
对于安全研究人员来说,调试过程中经常会碰到反调试技术,原因很简单:调试可以窥视程序的运行“秘密”,而程序作者想要通过反调试手段隐藏他们的“秘密”,普通程序需要防止核心代码被调试逆向,恶意代码需要隐藏自己的恶意行为防止被跟踪。就像病毒和杀软的关系一样,为了顺利的逆向分析,有反调试手段就有对应的破解方法-反反调试。对此,天融信阿尔法实验室研究人员总结了各类常见反调试手段以及对应的绕过方案,作为总结希望与君共勉。
关于各种反调试手段,网络上和各种安全书籍上都有对应的介绍、各种调试工具插件已经集成了反调试功能,但有的只是介绍了反调试方法,并没有对应的破解方式,有的反调试手段已经失效。本文并不是研究新的反调试方法,而是对windows平台的反调试技术进行分类总结,并介绍其原理和应对方法。
合理的分类有助于学习和理解各种反调试技术的原理,由于理解不同,分类也不尽相同。当你掌握了这些技术后,可以按照自己的理解重新给它们分类。本文按照静态反调试方法与动态反调试方法将反调试技术分为两大类,其中静态反调试技术的分类原理为:程序启动时,系统会根据正常运行和调试运行分配不同的进程环境,通过检测进程环境来检测进程是否处于调试状态;根据逆向人员的工作环境和程序的正常运行环境不同,可以通过检测调试器或逆向分析工具实现反调试。动态反调试技术的分类原理是:进程运行时的执行流程是否正常、执行状态是否正常。
本文测试环境:
测试代码: https://github.com/alphaSeclab/anti-debug
调试器为原版OllyDbg1.1(http://www.ollydbg.de/odbg110.zip) 因为各种魔改带插件的OD已经自带许多反反调试功能,会影响测试效果。
测试系统为win7 SP1 32位旗舰版
PE编辑器:LordPE
二、静态反调试技术
许多静态反调试技术对系统有较强的依赖,本文测试的静态反调试技术时使用的是win 7 SP1 32位旗舰版。像PEB中ProcessHeap的Flags与ForceFlags等类似反调试手段针对的是NT5.X以下版本,win7 下检测就会失效,所以本文未做介绍。
2.1 进程状态检测
我们不一样:正常启动的进程和调试启动的进程的某些初始信息是不同的,比如进程环境块PEB、STARTUPINFO等,这些信息使用方便,经常被广泛应用于反调试技术。
2.1.1 BeingDebugged
PEB结构体的内容如下(部分省略):

上表中列出了Windows 7 32位SP1中PEB的结构体成员,其中我们将会介绍到的与反调试相关的成员有:偏移为0×002的BeingDebugged和偏移为0×068的NtGlobalFlag。BeingDebugged是一个标志位,就像它的名字一样,用来表示进程是否处于被调试状态,NtGlobalFlag用来表示进程的堆内存特性,调试和非调试时其值不同。所以我们只需要获取这两个值与正常状态的值比较,就能知道进程是否处于调试状态。
利用fs段寄存器指向的TEB结构可以得到PEB结构体的地址:
mov EAX,DWORD PTR FS:[0x30]
调试时该值为TRUE,非调试时该值为FALSE。所以我们可以这样判断进程是否被调试:

正常运行时,该函数返回FALSE,用OD打开调试运行时,该函数返回TRUE。
其实有一个API可以直接获取BeingDebugged的值:IsDebuggerPresent();我们看下这个API的实现代码:在OD反汇编窗口按下快捷键CTRL+G,输入函数名跳转到函数地址


可以看到该函数其实也是读取的PEB中的BeingDebugged标志位的值。和我们的代码相比,它多了一行MOV EAX,DWORD PTRFS:[18],这行代码的作用是获取TEB的地址,我们上面说了,PEB的地址在TEB中,所以可以先获取TEB的地址,再获取PEB的地址。
破解方法:调试时手动将其置0。
OD打开被调试程序,在内存窗口CTRL+G,输入FS:[30],内存窗口将跳转到PEB的地址:

选中偏移为2的位置CTRL+E,将1改为0即可。
2.1.2 NtGlobalFlags
当进程处于调试状态时,PEB结构体偏移为0×68的NtGlobalFlag的值会被设置为0×70。所以和BeingDebugged成员检查一样,我们只需要检查其值是否为0×70就能判断程序是否被调试。

破解方法:和修改BeingDebugged的值一样,内存窗口CTRL+G输入fs:[30]跳转到PEB的地址,选中偏移0×68的地方,CTRL+E将其改为0即可。

2.1.3 NtQueryInformationProcess()
除了利用PEB查询进程相关的调试信息外,还可以利用NtQueryInformationProcess()API来获取其他各种与进程调试相关的信息。
一、前言
对于安全研究人员来说,调试过程中经常会碰到反调试技术,原因很简单:调试可以窥视程序的运行“秘密”,而程序作者想要通过反调试手段隐藏他们的“秘密”,普通程序需要防止核心代码被调试逆向,恶意代码需要隐藏自己的恶意行为防止被跟踪。就像病毒和杀软的关系一样,为了顺利的逆向分析,有反调试手段就有对应的破解方法-反反调试。对此,天融信阿尔法实验室研究人员总结了各类常见反调试手段以及对应的绕过方案,作为总结希望与君共勉。
关于各种反调试手段,网络上和各种安全书籍上都有对应的介绍、各种调试工具插件已经集成了反调试功能,但有的只是介绍了反调试方法,并没有对应的破解方式,有的反调试手段已经失效。本文并不是研究新的反调试方法,而是对windows平台的反调试技术进行分类总结,并介绍其原理和应对方法。

本文来自无奈人生安全网


合理的分类有助于学习和理解各种反调试技术的原理,由于理解不同,分类也不尽相同。当你掌握了这些技术后,可以按照自己的理解重新给它们分类。本文按照静态反调试方法与动态反调试方法将反调试技术分为两大类,其中静态反调试技术的分类原理为:程序启动时,系统会根据正常运行和调试运行分配不同的进程环境,通过检测进程环境来检测进程是否处于调试状态;根据逆向人员的工作环境和程序的正常运行环境不同,可以通过检测调试器或逆向分析工具实现反调试。动态反调试技术的分类原理是:进程运行时的执行流程是否正常、执行状态是否正常。
本文测试环境:
测试代码: https://github.com/alphaSeclab/anti-debug 无奈人生安全网
调试器为原版OllyDbg1.1(http://www.ollydbg.de/odbg110.zip) 因为各种魔改带插件的OD已经自带许多反反调试功能,会影响测试效果。
测试系统为win7 SP1 32位旗舰版
PE编辑器:LordPE
二、静态反调试技术
许多静态反调试技术对系统有较强的依赖,本文测试的静态反调试技术时使用的是win 7 SP1 32位旗舰版。像PEB中ProcessHeap的Flags与ForceFlags等类似反调试手段针对的是NT5.X以下版本,win7 下检测就会失效,所以本文未做介绍。 本文来自无奈人生安全网
2.1 进程状态检测
我们不一样:正常启动的进程和调试启动的进程的某些初始信息是不同的,比如进程环境块PEB、STARTUPINFO等,这些信息使用方便,经常被广泛应用于反调试技术。
2.1.1 BeingDebugged
PEB结构体的内容如下(部分省略):
内容来自无奈安全网
上表中列出了Windows 7 32位SP1中PEB的结构体成员,其中我们将会介绍到的与反调试相关的成员有:偏移为0×002的BeingDebugged和偏移为0×068的NtGlobalFlag。BeingDebugged是一个标志位,就像它的名字一样,用来表示进程是否处于被调试状态,NtGlobalFlag用来表示进程的堆内存特性,调试和非调试时其值不同。所以我们只需要获取这两个值与正常状态的值比较,就能知道进程是否处于调试状态。
利用fs段寄存器指向的TEB结构可以得到PEB结构体的地址:
mov EAX,DWORD PTR FS:[0x30]
www.wnhack.com

调试时该值为TRUE,非调试时该值为FALSE。所以我们可以这样判断进程是否被调试:

正常运行时,该函数返回FALSE,用OD打开调试运行时,该函数返回TRUE。
其实有一个API可以直接获取BeingDebugged的值:IsDebuggerPresent();我们看下这个API的实现代码:在OD反汇编窗口按下快捷键CTRL+G,输入函数名跳转到函数地址

内容来自无奈安全网




可以看到该函数其实也是读取的PEB中的BeingDebugged标志位的值。和我们的代码相比,它多了一行MOV EAX,DWORD PTRFS:[18],这行代码的作用是获取TEB的地址,我们上面说了,PEB的地址在TEB中,所以可以先获取TEB的地址,再获取PEB的地址。
破解方法:调试时手动将其置0。 无奈人生安全网
OD打开被调试程序,在内存窗口CTRL+G,输入FS:[30],内存窗口将跳转到PEB的地址:

选中偏移为2的位置CTRL+E,将1改为0即可。
2.1.2 NtGlobalFlags

内容来自无奈安全网


当进程处于调试状态时,PEB结构体偏移为0×68的NtGlobalFlag的值会被设置为0×70。所以和BeingDebugged成员检查一样,我们只需要检查其值是否为0×70就能判断程序是否被调试。

破解方法:和修改BeingDebugged的值一样,内存窗口CTRL+G输入fs:[30]跳转到PEB的地址,选中偏移0×68的地方,CTRL+E将其改为0即可。
copyright 无奈人生
2.1.3 NtQueryInformationProcess()
除了利用PEB查询进程相关的调试信息外,还可以利用NtQueryInformationProcess()API来获取其他各种与进程调试相关的信息。
。 (责任编辑:wnhack)
【声明】:无奈人生安全网(http://www.wnhack.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱472701013@qq.com,我们会在最短的时间内进行处理。