点击上方蓝字 江湖评谈设为关注/星标
前言
最近一直搞编译器,都快忘记了本业是软件安全。.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化的二进制可执行文件。无论它如何加密和代码虚拟化。
更多高端软件安全防护技术,可以参考个人知识圈:
往期精彩回顾