之前总结了一些常见的反调试技术,反调试技术是程序作者用来保护程序不被调试,以此来保护自己的秘密,但是逆行分析人员也有自己的破解反调试的方法,就是“反反调试”。
记录学习过程,以待后来温习。
反调试技术的总结:https://blog.csdn.net/weixin_43742894/article/details/105278690
主要是通过学习《恶意代码分析实战》这本书的课后题,来进行绕过反调试的学习。
资源在这:链接:https://pan.baidu.com/s/11eObiXjcv2_QdC3BjlHXDw
提取码:pis9
0x00 实验要求
本次学习的是实验一,实验一的要求如下:
下面进行练习。
首先实验一的程序是一个exe文件。
0x01 实验工具:
IDA Pro
OllyDbg
0x02 分析过程
首先使用PEiD进行查壳,发现无壳,这个实验作为绕过反调试练习,无壳是可以理解的。就好比踢足球不带扳手一样合理🐶。
我们将文件放进IDA里进行静态分析。发现这个main函数中有很多fs:30h和sub_401000。并且在验证后会有俩种可能,这里执行的就是反调试的测试。
其二,又有很多call sub_401000。
进入sub_401000函数,此函数的最后是一个退出整个程序的_exit,然后查看sub_401000的交叉引用,发现调用sub_401000一共有79个,我们就可以判断,sub_401000是在反调试不通过后退出程序的函数。
在OD里查看,发现这个函数也是执行退出删除的功能。
绕过反调试
第一判断处:我们知道fs段寄存器偏移0x30h,可以找到PEB。第一个fs:[30h]+2指向了PEB的BeingDubgged,这是检验反调试的一种技术。BeingDubgged=1的时候就是被调试,这里是第一处反调试。
ntdll!_PEB
+0x000 InheritedAddressSpace : UChar
+0x001 ReadImageFileExecOptions : UChar
+0x002 BeingDebugged : UChar
+0x003 BitField : UChar
+0x003 ImageUsesLargePages : Pos 0, 1 Bit
+0x003 IsProtectedProcess : Pos 1, 1 Bit
+0x003 IsLegacyProcess : Pos 2, 1 Bit
第一处绕过反调试:
适用于绕过PEB结构的反调试成员。
1.手动dump fs:[30]+2找到BeingDebugged,把01修改为00,即可绕过BeingDebugged的反调试,下面PEB结构中的反调试,手动方法一致。
2.使用插件:PhantOM,勾选hide from PEB。
第二处:[fs:[30h]+18]+10,ProcessHeap也是用来测试反调试的的标志,这是第二处反调试。
+0x014 SubSystemData : Ptr32 Void
+0x018 ProcessHeap : Ptr32 Void
+0x01c FastPebLock : Ptr32 _RTL_CRITICAL_SECTION
第三处:fs:30h+68,NtGlobalFlag 反调试。
+0x064 NumberOfProcessors : Uint4B
+0x068 NtGlobalFlag : Uint4B
+0x070 CriticalSectionTimeout : _LARGE_INTEGER
0x03 总结:
1.使用了那些反调试技术:
手动检测数据结构
1 检测BeingDebugged属性
2 检测ProcessHeap属性
3 检测NTGlobalFlag
2.反调试技术成功后,会执行什么操作
会执行sub_401000,删除自身退出程序。
3.如何应对这些反调试技术
使用phantOM插件。
4.如何手动修改绕过反调试
使用COMMON,dump命令找到数据结构进行修改。
5.使用什么插件可以绕过反调试
PhantOm
写在最后:
“路漫漫其修远兮,吾将上下而求索。”
反调试和反反调试技术是逆向分析中非常重要的部分,在之前的学习中为了追求速度,学的粗枝大叶,到头来又得花时间重新回顾,所以学习知识时,一定要脚踏实地,不能只学表面,不过如今复习,到也有“温故而知新”的乐趣。