<返回更多

VMP加密.Net AOT的强度

2023-08-30    opendotnet
加入收藏

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了。

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

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

结尾

关键词:.Net      点击(10)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多.Net相关>>>