<转>vmp3.0.9全保护拆分解析

以下为了避免插件干扰,故采用x64dbg原版进行分析。

首先我通过检测到调试器的弹窗进行栈回溯,定位到该关键点:
CALL eax

 

由于才接触Vmp,所以是把各个保护拆分开来进行的分析,会比较简单一些,不过全保护其实也就是凑在一起罢了,只要注意顺序就行啦。

 

本帖只是分析基础保护反调试反虚拟机等,不涉及还原VM和分析VM代码的部分。属于新手贴一类,适合萌新观看,大佬轻喷,有错漏之处,敬请指正,谢谢。

 

EverEdit编辑器是加的一个vmp的壳子,虽然特征和这里分析的不太一致,但是反调试路子大致一样的,而且虽然是vmp但是通过trace跟踪和分析也是可以暴力破解的,可以拿来练手,这里推荐一下。

一、反调试保护

1.调用IsDebuggerPresent,判断返回值eax==1被调试,eax==0没有调试。

 

2.CheckRemoteDebuggerPresent,判断buffer返回值是0还是1,1被调试,0没有调试。

3.NtQueryInformationProcess,ProcessInfoClass=0x1E来获取调试句柄,判断是否被调试,调试句柄返回0且eax的返回值是0xC0000353

4.NtSetInformationThread,ThreadInfoClass=0x11,这个不是检测调试,而是设置不把调试信息发送到调试器,可以直接把0x11修改为0x3或者其它数值就可以了。

5.ZwQuerySystemInformation,SystemInfoClass=0x23(MACRO:SystemKernelDebuggerInformation),返回值是2字节的bool值,设置为0即可。

6.ZwQuerySystemInformation,SystemInfoClass=0xB(MACRO:SystemModuleInformation),会去遍历内核模块,然后进行判断,第一次是获取需要存储的buffer长度,第二次才是真正获取信息,只要把buffer都置为0,就检测不到调试了,至于buffer的位置会在第一次调用后使用LocalAlloc申请空间来存储

 

 

7.CloseHandle反调试,如果被调试了,那么KiRaiseUserExceptionDispatcher函数会被调用,走异常处理流程;如果是不被调试的状态,不会走向异常流程。

8.检测硬件断点,是通过SEH异常来处理的

首先在SEH链中对当前模块的SEH头下一个软件断点

然后把图示中的Dr0、Dr1、Dr2、Dr3、Dr6、Dr7调试寄存器都修改为0

然后F9再次到CALL eax的时候如果是GetpRrocessAffinityMask函数调用,说明反调试已经顺利通过。

PS:上面对CALL eax下的是硬件断点,注意不要下软件断点,因为前面ZwSetInformationThread后(User-mode反调试)或者第三次最后一次NtQuerySystemInformation后(Kernel-mode)反调试会有如下图所示的软件断点检测,其实vmp的内存保护一部分的原理和这个一致,代码特征几乎都一样,取出来的HEX字节也是存放在esi寄存器中。所以为了方便,最好下硬件断点,因为硬件断点检查触发的时机都是在SEH函数中,很好拦截。

 

二、反虚拟机

1.CPUID判断ECX最高位31位是否为1,如果是1那么就是在虚拟机中,如果是0那就是在宿主机上。我自己加壳的这个样本有两个CPUID检测点,等它执行后修改ecx最高位为0就行。
不过下面的贴图演示的是使用修改虚拟机的.vmx配置文件的方式,更加方便。

2.使用GetSystemFirewareTable获取系统固件信息,判断其中有无下列字符串:VMware、VirtualBox、Parallels。注意大小写,只需要等GetSystemFirewareTable执行完成后对内存搜索VMware字符串(因为我用的VMware虚拟机),然后填充为0就可以过虚拟机检测了。下面我会贴一个脚本配合OD+StrondOD+DrxProtect使用的,主要就是填充VMware字符串。

三、IAT解密

1.我没有分析它是如何加密的,只是简单的分析了调用函数的解密过程,其实十分简单:进入解密函数后单步f7,当看到类似:lea register,dword ptr[register+imm](register:寄存器,imm:立即数)的语句,在执行完成后register中就是函数,再跟踪几步通过ret一类的就去执行真正的函数了
2.不知有无遗漏。。。

四、内存保护

1.内存保护和上面分析的软件断点几乎一样,对你修改的内存下硬件访问断点,就可以看到在取HEX字节然后运算,不再贴图了,只要把取出来的esi的数值替换为原来的数值就行了

2.不知有无遗漏。。

 

 

 

本文转自:https://bbs.pediy.com/thread-226455.htm

posted @ 2018-10-03 23:29  瓜蛋  阅读(1005)  评论(0编辑  收藏  举报