首页 > 其他分享 >.Net8 AOT+VMP简单的逆向分析

.Net8 AOT+VMP简单的逆向分析

时间:2023-09-10 15:22:42浏览次数:44  
标签:__ 00 00000000 00000001 AOT vmp Net8 Test VMP

1.前言

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

2.概述

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

namespace Test_{
    internal class Program{
        static void Main(string[] args) {
            Console.WriteLine("hello, World!");
            Console.ReadLine();
        }
    }
 }

把这段代码编译成AOT:

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

编译完成之后在路径

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

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

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

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

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

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

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

Test__Test__Program__Main

看下它的内容:

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

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

这里看下,hello World字符串

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

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

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

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

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

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

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

lea rcx 后面跟立即数的

结果如下:

000000014067AA6D: 48 8D 0C 06    lea   rcx,[000000014067B101]
地址:000000014067AAE4如下:

000000014067B101: 93                 xchg        eax,ebx
000000014067B102: 32 C0              xor         al,al
000000014067B104: CB                 retf
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

标签:__,00,00000000,00000001,AOT,vmp,Net8,Test,VMP
From: https://www.cnblogs.com/tangyanzhi1111/p/17691283.html

相关文章

  • .Net native aot简单体验(一)
    .netnativeaot可以在发布时将IL代码编译为本地代码,从而提高应用程序的性能和效的发布方式,其主要优点有:缩小磁盘占用降低启动时间减少内存需求如果用于个人发布的小程序来说,还有如下两个优点:不用安装防止反编译虽然.net7就已经支持nativeaot了,但只能用......
  • [Bread.Mvc] 开源一款自用 MVC 框架,支持 Native AOT
    Bread.MvcBread.Mvc是一款完全支持NativeAOT的MVC框架,搭配同样支持AOT的Avalonia,让你的开发事半功倍。项目开源在Gitee,欢迎Star。1.Ioc容器IoC容器是MVC框架的核心,为了支持AOT,Bread.Mvc框架选择使用ZeroIoC作为IoC容器。ZeroIoC是一款摒弃了反射的IoC......
  • 反混淆VMProtect.NET之Mutation
    title:反混淆VMProtect.NET之Mutationdate:2019-08-09updated:2023-04-11lang:zh-CNcategories:-[.NET逆向]tags:-.NET-逆向工程-脱壳-VMProtect-变异toc:true文章首发于https://wwh1004.com/deobfuscating-mutation-of-vmprotect_net/本文介绍了VMPro......
  • 关闭防火墙,主机与虚拟机VMnet8在同一网段,主机无法ping通虚拟机问题解决
    因需要进行oss数据迁移至eos,需要liunx环境,于是在本机上使用虚拟机安装了centos7,安装后ifconfig查看虚拟机ip,网络模式是NAT然后ping主机以及百度网,均可ping通,说明虚拟机网络正常  但是使用xshell后,一直无法连接,主机ping虚拟机,请求超时,以为是虚拟机防火墙问题,关闭虚拟机防火......
  • vs2022无法创建.net8项目
      如图,使用dotnet--list-sdks查询到已经安装了.net8,但是创建项目的时候,找不到.net8框架。 原因是没有开启"使用.NETSDK预览版",在工具-管理和预览功能处,可开启。  打开之后,重新打开vs,就有了。   参考:https://anthonygiretti.com/2023/06/10/net-8-wh......
  • VMPWN的入门级别题目详解(二)
    实验四VMPWN4题目简介这道题应该算是虚拟机保护的一个变种,是一个解释器类型的程序,何为解释器?解释器是一种计算机程序,用于解释和执行源代码。解释器可以理解源代码中的语法和语义,并将其转换为计算机可以执行的机器语言。与编译器不同,解释器不会将源代码转换为机器语言,而是直接执......
  • linux静态ip | 配置vmnet8的ip
    摘要目的:linux虚拟机固定ip,不要每次登录都由DHCP分配设置vmnet的子网ip本文是同时更改了vmnet8的ip,可以更好地理解虚拟机ip与vmnet8的联系,如果不想该vmnet8的话,可以参考这篇博客一、要求要求:将linux的ip地址配置为192.168.200.130二、步骤该步骤配置了vmnet8的ip信......
  • 查看虚拟机网络ip信息:vmnet8的ip
    摘要目的:查看虚拟机虚拟网络的ip,网关等(也可以设置)查看/设置主机虚拟网络1.VMWare查看首先点击虚拟网络编辑器然后点击更改设置然后就可以设置了虚拟网络的子网了点击DHCP设置有起始和结束的IP设置设置网关如下当然也可以用另一种方式查看2.主机查看查......
  • 我喜欢的.NET8 Preview 1功能
    .NET8的第一个预预览版发布了,又开启了一波新技术的学习和研究。简单过了一下.NET8Preview1,中间有两个功能是我的痛点,先睹为快。在项目中,数据从前端UI到后端(后端也分为好几层),再到数据库端,每个端或层的命名规则不尽相同,所以在端之间的数据项命名转换就个痛点,C#中,帕斯卡命......
  • 我喜欢的.NET8 Preview 1功能
    .NET8的第一个预预览版发布了,又开启了一波新技术的学习和研究。简单过了一下.NET8Preview1,中间有两个功能是我的痛点,先睹为快。在项目中,数据从前端UI到后端(后端也分为好几层),再到数据库端,每个端或层的命名规则不尽相同,所以在端之间的数据项命名转换就个痛点,C#中,帕斯卡命......