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。为了最大强度加密,把它所有加密全选上,如下图:



最后得到一个独立的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,如下图。

结尾

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

.Net8 AOT+VMP简单的逆向分析的更多相关文章

  1. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  2. 技术分享:逆向分析ATM分离器

    文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银 ...

  3. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  4. 一文了解安卓APP逆向分析与保护机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  5. Android逆向分析(2) APK的打包与安装背后的故事

    前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...

  6. 逆向分析一款国外Blackjack Card Counter软件并附上License生成脚本

    没有学过逆向,一时兴起,搞了一下这个小软件,名为“逆向分析”,其实过程非常简单,难登大雅之堂,就当段子看吧.首先介绍一下背景吧.这是一款国外的Blackjack也就是21点算牌软件,我从来不玩牌的,机 ...

  7. 010 Editor v8.0.1(32 - bit) 算法逆向分析、注册机编写

    010 Editor 的逆向分析整体算下来还是比较简单的,将程序拖入OD,通过字符串搜索定位到核心代码,经过分析,主要是如下图所示的两个关键函数,返回正确的值,才算是注册成功. 00409C9B 这个 ...

  8. [工控安全]西门子S7-400 PLC固件逆向分析(一)

    不算前言的前言:拖了这么久,才发现这个专题没有想象中的简单,学习的路径大致是Step7->S7comm->MC7 code->firmware,我会用尽量简短的语言把前两部分讲清楚, ...

  9. SG Input 软件安全分析之逆向分析

    前言 通过本文介绍怎么对一个 windows 程序进行安全分析.分析的软件版本为 2018-10-9 , 所有相关文件的链接 链接:https://pan.baidu.com/s/1l6BuuL-HP ...

  10. Android逆向分析(2) APK的打包与安装

    http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...

随机推荐

  1. 2023-06-06:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言, 其左右子结点分别位于 (row + 1, col -

    2023-06-06:给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列. 对位于 (row, col) 的每个结点而言, 其左右子结点分别位于 (row + 1, col - ...

  2. List转为Map

    List转为Map 1.业务需求,需要将List<SysSetting>转为Map SysSetting是一个对象 @Data @TableName("t_sys_setting ...

  3. Centos6yum源切换

    CentOS 6操作系统版本结束了生命周期(EOL),Linux社区已不再维护该操作系统版本.建议您升级操作系统至CentOS 7及以上,如果您的业务过渡期仍需要使用CentOS 6系统中的一些安装包 ...

  4. 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

    目录 0. 简介 1. 主键 2. 唯一索引 3. 联合索引 4. 索引对数据库操作的影响 5. 其他索引 5.1 普通索引 5.2 全文索引 5.3 前缀索引 6. 总结 7. 参考资料 0. 简介 ...

  5. 【QCustomPlot】使用方法(源码方式)

    说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记.同系列文章目录可见 <绘图库 QCustomPlot 学习笔记>目录.本篇介绍 QCustomPlot 的一种使用方法, ...

  6. 创建springboot工程失败解决 spring initializr Error:cannot download

    创建springboot工程失败解决 问题描述 原因分析: 网络不好,因为springBooT项目的创建时必须联网的 解决方案: 方案一: 将创建 springBoot 工程的地址更换为如下的地址 阿 ...

  7. 记一次线上bug:crontab 被意外清空

    记一次线上bug:crontab 被意外清空 目录 记一次线上bug:crontab 被意外清空 问题概述 问题排查 问题复现 其他测试 总结 又是一次难忘的经历. 问题概述 同事反馈,某台服务器的c ...

  8. 文盘Rust -- FFI 浅尝

    rust FFI 是rust与其他语言互调的桥梁,通过FFI rust 可以有效继承 C 语言的历史资产.本期通过几个例子来聊聊rust与C 语言交互的具体步骤. 场景一 调用C代码 创建工程 car ...

  9. 【小小demo】SpringBoot+Layui登录

    easy-login 基于layui 注册.登录简单实现,并他通过拦截器拦截未登录请求. 项目地址文章末尾 登录拦截器 SystemInterceptor preHandle在 Controller ...

  10. 音视频开发进阶——YUV与RGB的采样与存储格式

    在上一篇文章中,我们带大家了解了视频.图像.像素和色彩之间的关系,还初步认识了两种常用的色彩空间,分别是大家比较熟悉的 RGB,以及更受视频领域青睐的 YUV.今天,我们将继续深入学习 RGB.YUV ...