楔子

.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在二进制文件里面的地址。进而进行修改。

结尾

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

作者:江湖评谈

最新文章

  1. java中List对象列表去重或取出以及排序
  2. MFC 获取图像的大小
  3. Android WebView与JavaScript交互操作(Demo)
  4. codeforcese 498C. Array and Operations 网络流
  5. [转] iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
  6. 作业还是作孽?——Leo鉴书79
  7. Android - 位置定位(Location)服务(Service)类的基本操作
  8. Linux文件挂载命令mount
  9. Mybatis第八篇【一级缓存、二级缓存、与ehcache整合】
  10. Docker Register安装与基本认证
  11. C# 实现邮件发送
  12. [supervisor] 使用小记(入门教程)
  13. JAVA -数据类型与表达式---变量与赋值
  14. concrrent类下 BlockingDeque 下 自己实现代码编写
  15. X-PACK详解
  16. 有限状态机FSM
  17. Qt ------ 添加某个功能,比如(QSerialPort)注意事项
  18. Misha and Palindrome Degree CodeForces - 501E (回文串计数)
  19. asp.net mvc2+nhibernate实体类映射问题之“尝试创建Controller类型的控制器时出错请确保控制器具有无参数公共构造函数”
  20. 安装MongoDB 到服务器

热门文章

  1. HBase(1/5)
  2. OSS对象存储
  3. 在开发中关于javaweb中的路径问题小结
  4. RAID5 IO处理之重构代码详解
  5. 9.MongoDB系列之创建副本集(二)
  6. 后端框架的学习----mybatis框架(6、日志)
  7. Springboot+Vue实现将图片和表单一起提交到后端,同时将图片地址保存到数据库、再次将存储的图片展示到前端vue页面
  8. java中的栈(利用数组实现栈)
  9. Python基础之模块:2、包的使用和软件开发目录规范及常用内置模块
  10. SpringCloud(七) - 微信支付