[转]Anti-Debug Tech:Debug Blocker
作者:互联网
https://bbs.pediy.com/thread-273294.htm
拿一个调试器“保护”本进程这一操作并不难想到,关键是厘清Debugger和Target间关系
还有帖主的方法,构思,实践,复盘,这才叫学,温故而知新。
Debug Blocker前置知识
约定
在Debug Blocker中,调试进程与被调试进程它们之间是一种父子关系
文章中提到的父进程和子进程对应调试器和被调试进程
什么是Debug Blocker
Debug Blocker是一种高级的反调试技术,而且这种技术常常被木马病毒利用
Debug Blocker原理
Debug Blocker是进程以调试方式运行自身或者其他可执行文件的技术。目的是增加逆向分析难度
Debug Blocker特点
1.父子关系
根据进程当时所扮演的不同角色(调试与被调试的关系),会执行不同的代码分支,并做出不同的动作
2.子进程不能再被其他调试器调试
在Windows中,一个进程无法同时被多个调试器调试,换言之,此时无法用OD进行调试(后面会讲如何调试)
3.父进程会影响子进程的执行
在Dbug Blocker技术中,调试器用来操纵被调试进程的执行分支,对子进程进行修改等操作,而且是一个连续的过程,换言之,在缺少调试进程的前提下,单独调试子进程无法正常运行
4.骨肉相连(这不是一道菜)
如果强制终止调试进程,那么子进程也会被终止,这也是Debug Blocker技术中非常高明的一点(仔细体会)
5.父进程处理子进程的异常
调试器和被调试者关系中,被调试进程发生的所有异常都由调试器处理,子进程故意触发异常(如内存访问异常),如果没有得到处理,程序将崩溃。子进程发生异常时,控制权转移到父进程,此时父进程修改被调试进程的执行分支,也可以对被调试进程进行加解密操作,或者修改寄存器、栈等特定值
小结
基于以上特点,Debug Blocker 是一种比较高级的反调试手段。而且必须对调试进程进行分析调试,确定调试进程是如何处理异常的(执行逻辑),这样才能准确获取被调试进程的代码
Debug Blocker完整代码
开始调试
第一次调试
进入main函数之后,先是调用CreateMutexW创建互斥体,然后根据返回值判断是以父进程运行还是以子进程运行,如果返回值是0xB7(0xB7说明已经有一个互斥体),就以子进程运行,此时程序是第一次运行,所以会执行父进程
进入父进程函数之后,先调用GetMouduleHandleW和GetModuleFileNameW获取到文件路径,然后调用CreateProcessW通过传入DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS参数以调试方式创建子进程
第二次调试
一般使用了Debug Blocker技术的程序,其核心代码基本上在子进程运行,所以我们重新运行程序,在判断CreateMutexW返回值的时候我们修改ZF标志位强制跳转到子进程函数。
可以看到将要执行的指令是LEA EAX,EAX ,很明显是一条非法指令,(而且后面的指令不是正常的指令),会触发异常,从而将程序执行流程转移到父进程,父进程可能对此处的代码执行解密操作或者修改EIP为其他地址。
第三次调试
这是第一次异常,我们自己一共预设了两个异常
以调试方式创建子进程后,会调用WaiteForDebugEvent等待子进程发生Debug事件,(此处会涉及到Debug_EVENT结构体和调试相关的知识,不清楚的同学请自行补课)
然后根据WaiteForDebugEvent返回的信息进行三次判断,第一次判断是否属于调试事件(EXCEPTION_DEBUG_EVENT),第二次判断发生异常的原因是否属于执行无效指令(EXCEPTION_ILLEGAL_INSTRUCTION),第三次判断发生异常的地址是否是我们提前预设好的地址(0x0040103F),如果这三个条件都成立,那么继续往下执行ReadProcessMemory,否则继续等待,直到条件成立
通过在第三次判断的下一条指令下断点,我们直接进入到ReadProcessMemory这一步,通过ReadProcessMemory读取加密的代码到一个Buffer中,然后进行异或解密
解密后的代码(大家仔细看解密后的代码)
然后调用WriteProcessMemory将解密后的代码写入到子进程
--后面还有内容暂时不加了 from: pediy寒江独钓_
标签:Blocker,进程,Anti,Debug,Tech,异常,调试,调试器 来源: https://www.cnblogs.com/MousseLee/p/16439115.html