经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.Net8 AOT+VMP简单的逆向分析
来源:cnblogs  作者:江湖评谈  时间:2023/9/10 15:22:27  对本文有异议

1.前言

测试下VMP加密.NET的强度,选了最新的.Net8+AOT编译,用VMP给它加壳。最后逆向下,简单的分析,本篇看下。

2.概述

一.前奏
首先一段简单的C#代码:

  1. namespace Test_{
  2. internal class Program{
  3. static void Main(string[] args) {
  4. Console.WriteLine("hello, World!");
  5. Console.ReadLine();
  6. }
  7. }
  8. }

把这段代码编译成AOT:

  1. 1.csproj里面添加 <PublishAot>true</PublishAot>
  2. 2.dotnet publish -r win-x64 -c Release

编译完成之后在路径

  1. bin\release\net8.0\win-x64\publish

找到Test_.exe,然后对它进行VMP加密。这里用的是VMP3.7.1。为了最大强度加密,把它所有加密全选上,如下图:
image
最后得到一个独立的Exe文件Test_.vmp.exe。把这个Exe运行之后,拍摄一个内存快照,它的堆栈如下

  1. 00 00000000`0014fad8 00007fff`00cc65cb ntdll!NtReadFile+0x14
  2. 01 00000000`0014fae0 00000001`40140e2b KERNELBASE!ReadFile+0x7b
  3. 02 00000000`0014fb50 00000001`401419d9 Test__vmp+0x140e2b
  4. 03 00000000`0014fc10 00000001`401418d1 Test__vmp+0x1419d9
  5. 04 00000000`0014fc60 00000001`40143bed Test__vmp+0x1418d1
  6. 05 00000000`0014fca0 00000001`400e0796 Test__vmp+0x143bed
  7. 06 00000000`0014fd00 00000001`400e0857 Test__vmp+0xe0796
  8. 07 00000000`0014fd50 00000001`401440ce Test__vmp+0xe0857
  9. 08 00000000`0014fda0 00000001`401413d2 Test__vmp+0x1440ce
  10. 09 00000000`0014fde0 00000001`4007b455 Test__vmp+0x1413d2
  11. 0a 00000000`0014fe10 00000001`4016bc0b Test__vmp+0x7b455
  12. 0b 00000000`0014fe40 00000001`4006e15e Test__vmp+0x16bc0b
  13. 0c 00000000`0014fea0 00000001`400694b4 Test__vmp+0x6e15e
  14. 0d 00000000`0014fef0 00007fff`029426ad Test__vmp+0x694b4
  15. 0e 00000000`0014ff30 00007fff`0370aa68 kernel32!BaseThreadInitThunk+0x1d
  16. 0f 00000000`0014ff60 00000000`00000000 ntdll!RtlUserThreadStart+0x28

因为它停在了ReadLine()这个托管函数上面,又因为托管代码进行了AOT,所以它这里的堆栈其实就是非托管栈。

注意这个堆栈里面的第10行,也即编号09哪一行

  1. 09 00000000`0014fde0 00000001`4007b455 Test__vmp+0x1413d2

这里就是.Net8预编代码AOT的托管Main入口的非托管表现。

  1. Test__Test__Program__Main

看下它的内容:

  1. 00000001`4007b440 4883ec28 sub rsp,28h
  2. 00000001`4007b444 488d0d6dc52200 lea rcx,[Test__vmp+0x2a79b8 (00000001`402a79b8)]
  3. 00000001`4007b44b e8905f0c00 call Test__vmp+0x1413e0 (00000001`401413e0)
  4. 00000001`4007b450 e86b5f0c00 call Test__vmp+0x1413c0 (00000001`401413c0)
  5. 00000001`4007b455 90 nop
  6. 00000001`4007b456 4883c428 add rsp,28h
  7. 00000001`4007b45a c3 ret
  8. 这里刚好的是托管示例的机器码调用,注意它只是内存里面的表现

二:虚拟机原理
这里需要简单了解下虚拟机的原理,虚拟机会根据传递进来的代码,对这些代码进行,解析,组合,变形等等之后,组合成新的机器码在机器上运行。这里的VMP本身就是个虚拟机,它把AOT的汇编代码,进行解析,组合,变形之后形成汇编代码运行。了解了这一点,我们就知道上面的内存快照只不过是它运行时候的表现,而实际上Exe里面的代码未必会是这种表现。

这里看下,hello World字符串

  1. 00000001`4007b444 488d0d6dc52200 lea rcx,[Test__vmp+0x2a79b8 (00000001`402a79b8)]

它指向的就是字符串实例的MethodTable,hello world字符串清晰可见:

  1. 00000001`402a79b8 88 41 20 40 01 00 00 00-0d 00 00 00 48 00 68 00 .A @........h.e.
  2. 00000001`402a79c8 6c 00 6c 00 6f 00 2c 00-20 00 57 00 6f 00 72 00 l.l.o.,. .W.o.r.
  3. 00000001`402a79d8 6c 00 64 00 21 00 00 00-00 00 00 00 00 00 00 00 l.d.!...........

但是这些代码只是内存的表现,而实际上存储在Exe里面可能是加密过的字符串,这里是解析之后,最后运行的结果。如果想要修改掉这串字符,那么得找到这串字符ASCII单个byte加密的地方。

三:特征码
我们可以看到字符串的操作取地址lea指令后面是立即数:

  1. 00000001`4007b444 488d0d6dc52200 lea rcx,[Test__vmp+0x2a79b8 (00000001`402a79b8)]

一般来说,这种取地址不会混淆,所以这里在Test_.vmp.exe的整个汇编里面搜索一下特征

  1. lea rcx 后面跟立即数的

结果如下:

  1. 000000014067AA6D: 48 8D 0C 06 lea rcx,[000000014067B101]
  2. 地址:000000014067AAE4如下:
  3. 000000014067B101: 93 xchg eax,ebx
  4. 000000014067B102: 32 C0 xor al,al
  5. 000000014067B104: CB retf
  6. 000000014067B105: 02 68 B0 add ch,byte ptr [rax-50h]

可以看到地址:000000014067B106有个0x68,还记得上面的hello World字符串嘛,首字母h的ASCII就是0x68。

OK,要找的就是这个地方了,在十六进制编辑器里面把它改成0x67,然后保存运行下Test_.vmp.exe。字符串hello World变成了gello World,如下图。
image


结尾

非常简单的一个例子,如果你对以上感兴趣,可以扫描下面卡片关注我。带你玩好玩的技术。
image

原文链接:https://www.cnblogs.com/tangyanzhi1111/p/17691283.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号