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. git push origin master 提示输入用户名和密码

    今天更换了一台电脑,重新配置了SSH keys:但是在push得时候提示我输入用户名和密码 taodeMacBook-Pro:my_trip_proj tao$ git push origin mas ...

  2. linux 条件语句和逻辑判断

    目录 一.条件判断 二.逻辑判断 三.if和case 四.七个实验 一.条件判断 1.test测试 test [ 条件表达式 ] -e:测试目录是否存在 -d:测试是否为目录    -f:是否为文件 ...

  3. JavaSE线程基础

    1.线程概念 2.线程创建方式 1.继承thread 2.实现runnable runnable使用最多 3.线程的生命周期及线程的状态 新建状态 就绪状态的线程(已获得所有资源,栈堆内存空间),即s ...

  4. Hive执行计划之hive依赖及权限查询和常见使用场景

    目录 概述 1.explain dependency的查询与使用 2.借助explain dependency解决一些常见问题 2.1.识别看似等价的SQL代码实际上是不等价的: 2.2 通过expl ...

  5. 三分钟免费将 Claude API 接入个人服务

    首先我们介绍一下今天的主角 Claude Claude 是最近新开放的一款 AI 聊天机器人,是世界上最大的语言模型之一,比之前的一些模型如 GPT-3 要强大得多,因此 Claude 被认为是 Ch ...

  6. Linux系统基础知识与自学方法

    Linux系统基础知识与自学方法 大部分非计算机相关的朋友也经常使用电脑,所以我们频繁接触的是Windows系统.关于这个系统的评价不一,一部分人觉得简洁快捷,一部分人觉得问题(病毒.弹窗)多多,总之 ...

  7. 如何让ChatGPT高效的理解你的Prompt

    1.概述 ChatGPT是由 OpenAI 开发的一种强大的语言模型,它在许多自然语言处理任务中展现出了惊人的能力.而其中一个关键的技术概念就是 "Prompt".本文将深入探讨 ...

  8. SQL Server 根据一个表数据修改另外一个表数据

    今天在写代码的时候发现一个有趣的问题,同时也暴露了之前写的代码有问题,还好之前没有出现重复的情况,及时发现了这个问题,及时改了回来,不然就GG了 下面先上代码,再给大家解说一下 CREATE TABL ...

  9. JVM GC配置指南

    本文旨在简明扼要说明各回收器调优参数,如有疏漏欢迎指正. 1.JDK版本 以下所有优化全部基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能使用update_191以后版本. 2.如何选择垃圾回 ...

  10. 基于SM4和LSB算法实现图片数字水印加密软件(密码赛)

    一.前言 密码赛和星火杯时做的小项目,密码赛的时候是个半成品,没有过初赛,星火杯之前完善了 设计思路 最开始是想做一个图片水印用作对图片来源的不可否认性做保护,又考虑保护数据完整性,因此选中了易损水印 ...