VMP加密.Net AOT的强度

1.前言
之前研究过dnguard_hvm,这个东西的强度是可以的。但是破绽也很明显。料想vmp也是如此,不过研究下来。vmp的强度可能更高点,它需要涉及到内核驱动的反调试。本篇来看下。.

2.概括
一:托管的困扰
vmp貌似只能加密exe,但是托管的exe只是一个启动程序(这点可以参考这篇文章:Exe和托管DLL区别是什么),也就是启动clr让clr加载托管dll。所以托管的代码实际上都在dll里面。vmp加密了exe,但是托管dll里面原封不动,所以导致了很容易破解。几乎不费吹灰之力,这里不赘述。只是看下AOT预编译之后的加密。
二.高强度AOT加密
托管的AOT实际上被预编译成了本机机器码,这种东西本身如果不加密的话,就需要非常熟知AOT编译器ILC的运作模式,以及C++引导文件Bootstrap的运作模式。才能够非常容易的逆向和破解它。这点依然不是难点。难点就在于,如果用vmp加密AOT的exe程序。除了上述之外,首先就需要面对的一点就是反调试,而且类似于dnguard_hvm那种补丁式样的破解,是无效果的,不知道vmp是何种机制造成的。
这里用vmp3.7.3版本,它加密全部选择上,比如以下:
内存保护
导入信息保护
资源保护
压缩输出文件保护
输出文件保护
检测调试器
检测虚拟工具
移除调试信息
移除重定位信息
把以上保护全部勾选上,让其最强加密。
三.破除方法
这里有一个比较粗暴的破除方式就是,先把调试标志给禁掉
BegingDebugged
NtGlobalFlags
然后hook以下几个驱动函数
NtQueryInformationProcess
NtSetInformationThread
NtClose
NtQuerySystemInformation
NtQueryInformationThread
把涉及到调试的信息驱动层面能hook掉的全hook掉。

四.做法
通过在ntoskrnl.exe里面搜索特征码,找到回调函数。封装一个函数,通过__readgsqword获取到进程环境块,通过当前进程栈顶和栈底的循环找到回调函数的两个参数索引,和函数地址,传入进去。把封装的函数赋值给回调函数。就可以hook了。

以上也仅为第一步,可以调试了。而后面的分析应该相对于简单些,但是也不容忽视。

以上方法来自于网路,后面验证下这个方法。