.NET AOT之后就安全了吗?

文摘   2024-09-18 19:37   湖北  

点击上方蓝字 江湖评谈设为关注/星标




前言

最近一直搞编译器,都快忘记了本业是软件安全。.NET本身是托管代码,Dnspy/ILSpy这些软件反编译下就出来了,如果编译成AOT二进制代码是否安全了?其实远远不够,即使用上VMP,VBP,DNG这些加密软件,也依然不够。本篇带你了解下。

简单的例子

这里提供一个.NET AOT化之后,最简单的字符串修改破解之法,例子也是最简单的,当做演示:

C#代码:

namespace ConsoleApp1{    internal class Program    {        static void Main(string[] args)        {            Console.WriteLine("Hello Call Main");        }
}}

Windows上,AOT之后,它生成一个独立可执行ConsoleApp1.exe文件。把这个exe拖入到十六进制编辑器,比如WinHex,UltraEdit等,这里用的是HxD。

拖入进去之后,它是一堆的十六进制代码:

我们的C#代码main函数里面调用 Console.WriteLine("Hello Call Main");字符串Hello Call Main的ASCII码是:

48 00 65 00 6C 00 6C 00 6F 00 20 00 43 00 61 00 6C 00 6C 00 20 00 4D 00 61 00 69 00 6E

注意它这个ASCII码每一个字符之间都有一个00占据一个字节,进行字符相隔。比如H的ASCII码是48,e的ASCII码是65,它们之间有个00占据了一个字节。按照这种规律对字符串Hello Call Main进行ASCII码编码。Hello Call之间有个空格,空格的ASCII码是20,所以上面是00 20。最终形成上面的格式。

然后我们在HxD里面搜索这串十六进制ASCII码,Ctrl+F选择字节序列搜索,如下图:

双击搜索到的结果,定位到Hello Call Main所在字符串地方

然后我们就可以修改ASCII码,以改变Console.WriteLine输出的结果。比如把H改成G,G的ASCII是47,刚定位的地方把48改成47。如下图:

保存之后,我们再次运行下ConsoleApp1.exe。结果如下:

变成了Gello Call Main。

扩展

第三方加密软件的混淆,虚拟机加密,代码虚拟化,等高端技术。

以上非常简单例子只是修改了下字符串,如果用加密软件进行加密。字符串被加密成别的形式存放在二进制字节里面,只需要按照一定的逻辑找到字符串对应的二进制字节,依然可以轻松修改。

.NET托管DLL能直接被Dnspy这类软件反编译成C#代码,皆因IL代码跟C#代码一一对应。用一个引擎根据相应的逻辑,就可以反编译出来。AOT其实也一样,.NET代码被C#的ILC(AOT编译器)编译成了目标文件之后,会被C++引擎Bootstrap调用链接器链接成机器的目标文件。

这里呢,我们只需要掌握BootStrap引擎(参考:.Net8的AOT引导程序BootStrap)规律,即可全面破解AOT化的二进制可执行文件。无论它如何加密和代码虚拟化。

更多高端软件安全防护技术,可以参考个人知识圈:

往期精彩回顾

.Net虚拟机(CLR/JIT)加密原理(版权保护)


江湖评谈
记录,分享,自由。
 最新文章