.Net 7 的AOT的程序比托管代码更容易破解?
2024-10-20 21:25:10
楔子
.Net 7的一个重要功能是把托管的源码编译成Native Code,也就是二进制文件。此举看似增加了程序反编译难度,实际上是减少了程序的破解难度。本篇在不触及整个程序架构的前提下,以简单的例子来修改Native AOT exe文件的输出字符串。
例子
Console.WriteLine("Hello, World!");
Console.ReadLine();
搞一个简单的HelloWorld example,来举例下非常简单的破解之道。
UltraEdit
这里需要用到一个16进制的编辑器工具:UltraEdit.这个东西可以去搜索引擎搜索下就可以得到。
把以上简单的代码编译成Native AOT文件之后,生成一个exe文件。把这个exe文件拖到UltraEdit里面去。
破解
下拉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!。如下图所示。
没修改前:
修改后
原理
它的原理也非常简单,只要看下.Net 程序的Console.WriteLine函数的参数地址是多少,一般在汇编层面是用RCX寄存器来表示。所以你只要找到RCX寄存器的地址,注意它在哪个Section,进行相应的计算就可以找到字符串Hello World在二进制文件里面的地址。进而进行修改。
结尾
这种修改还有很多地方,比如修改函数的跳转,修改功能性的缺失,修改整个程序的架构。整个程序像个筛子。
作者:江湖评谈
最新文章
- java中List对象列表去重或取出以及排序
- MFC 获取图像的大小
- Android WebView与JavaScript交互操作(Demo)
- codeforcese 498C. Array and Operations 网络流
- [转] iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- 作业还是作孽?——Leo鉴书79
- Android - 位置定位(Location)服务(Service)类的基本操作
- Linux文件挂载命令mount
- Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】
- Docker Register安装与基本认证
- C# 实现邮件发送
- [supervisor] 使用小记(入门教程)
- JAVA -数据类型与表达式---变量与赋值
- concrrent类下 BlockingDeque 下 自己实现代码编写
- X-PACK详解
- 有限状态机FSM
- Qt ------ 添加某个功能,比如(QSerialPort)注意事项
- Misha and Palindrome Degree CodeForces - 501E (回文串计数)
- asp.net mvc2+nhibernate实体类映射问题之“尝试创建Controller类型的控制器时出错请确保控制器具有无参数公共构造函数”
- 安装MongoDB 到服务器