3

.Net 7 的AOT的程序比托管代码更容易破解? - 江湖评谈

 1 year ago
source link: https://www.cnblogs.com/tangyanzhi1111/p/17015708.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

.Net 7的一个重要功能是把托管的源码编译成Native Code,也就是二进制文件。此举看似增加了程序反编译难度,实际上是减少了程序的破解难度。本篇在不触及整个程序架构的前提下,以简单的例子来修改Native AOT exe文件的输出字符串。

Console.WriteLine("Hello, World!");
Console.ReadLine();

搞一个简单的HelloWorld example,来举例下非常简单的破解之道。

UltraEdit

这里需要用到一个16进制的编辑器工具:UltraEdit.这个东西可以去搜索引擎搜索下就可以得到。
把以上简单的代码编译成Native AOT文件之后,生成一个exe文件。把这个exe文件拖到UltraEdit里面去。

image

下拉UltraEdit到地址0046F09C处,可以看到:48 00 65 00 这四个byte。十六进制的0x48和0x65是上面.Net程序输出的语句的Hello, World! 前面的He两个字符串的ASSIC码。

右键UltraEdit修改,把48 00 66 00修改成:49 00 66 00,如上图所示。然后再打开native AOT的exe文件发现本来的Hello, World!变成了Ifllo, World!。如下图所示。

没修改前:

image

修改后

image

它的原理也非常简单,只要看下.Net 程序的Console.WriteLine函数的参数地址是多少,一般在汇编层面是用RCX寄存器来表示。所以你只要找到RCX寄存器的地址,注意它在哪个Section,进行相应的计算就可以找到字符串Hello World在二进制文件里面的地址。进而进行修改。

这种修改还有很多地方,比如修改函数的跳转,修改功能性的缺失,修改整个程序的架构。整个程序像个筛子。

作者:江湖评谈

image

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK