吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 3620|回复: 46
上一主题 下一主题

[.NET逆向] 粗略分析一下NET的vm虚拟机

  [复制链接]
跳转到指定楼层
楼主
梦游枪手 发表于 2019-8-13 02:26 回帖奖励
本帖最后由 梦游枪手 于 2019-8-13 22:35 编辑

前言
vmp3.4版本发布有一段时间了,这个版本更新不但支持了NET,还把巨恶心的虚拟机移植到NET了。出于好奇,我分析了一下NET的vm虚拟机,并整理一下当成分析笔记。
准备
dnspy,脱过vmp壳的NET程序样本(从wwh1004大佬的帖子下载的)
分析
用dnspy载入样本,找到Main入口。

2B1B6FC1是vm虚拟机类,3FE73680是vm_dispatch,它的部分代码如下。

这时候需要默念一句VM大法好,把它们的名字尽量还原。(其实是人肉分析handle,变量名和函数名不一定对。)

可以跟图里同样的地方下断点,运行程序,停下后按F11就能跳转到handle了,直接下到handle()那里是没用的。
下面我挑几个地方说一下。
1.栈
搞过vm的都知道vm虚拟机是栈式虚拟机,它所有的操作,包括计算,都要通过堆栈来进行。NET版同样是栈式虚拟机。



NET版的vm虚拟机,vm_stack字段就是它的栈,用它来模拟普通环境下的堆栈操作。还有寄存器,vm_eip,handle表也都是用字段来模拟。

2.handle
handle表是在vm虚拟机类的构造方法里填充的。

这段代码大致上是读取handle的指针,然后转换成vm的handle类,再写到handle表里。我们在dispatch里面下断看看填充完的handle表。

一共256条handle,有耐性的同学可以把handle表全部搞定,不过我是没这个耐性了。
3.数值计算
以vm_add handle为例子。

vm_add会从堆栈弹出两个操作数

再把相加后的结果压回堆栈。

与普通环境的区别就是没有标志位,其他的计算handle也是这样。
4.条件跳转
跟普通环境下相似,分别压入两个地址,用vm_cmp的结果计算target。
运行样本,在vm_cmp处下断,输入6,回车,观察vm_stack。

走完cmp,看下栈顶

stack[2]>stack[1],所以栈顶值为1。
然后对cmp结果做一些运算后,计算target。







cmp的结果经过什么handle可以自己去跟一下,我总结一下就是
a1=neg((flag>>1)&1)&addr1
a2=(~neg((bool)a1))&addr2
target=a1+a2
精简过后
input < ‘4’ ? a1 : a2
修改cmp(不是vm_cmp,dnspy修改不了字段的值)的返回值就能改变流程了。
5.方法调用和字段获取
vm虚拟机里会用token获取需要用到的资源,比如字符串

方法体并反射调用

字段等等

由于样本代码太少,所以这部分就没怎么分析,我真的不想去分析壳的虚拟机。
总结
NET环境和普通环境的vm虚拟机大致相同,NET环境的vm虚拟机总体强度比普通环境要弱一些。普通环境的vmp3.x会打散handle表,没有统一的dispatcher,但是NET环境有handle表和dispatcher,也没有普通环境那么强的代码混淆程度,应该是为了稳定做的妥协。不过即使是这般削弱过的vmp,强度其实也足够了。我分析这个小样本就够呛的了,更别说用非人肉方法把vm还原回C#代码,难度很高,不是我这种小菜鸟能够搞定的了,还是收拾一下洗洗睡吧。

附上分析的样本和重命名过的样本,样本本身有点问题,输入一次数字后就会崩溃,这个是vm虚拟机在处理switch结构的时候出了问题。
附件已经更新,重命名版也可以运行了,我在能运行的前提下尽量修改了方法名和字段名。在此感谢wwh1004大佬的指点。
ConsoleApp1.zip (303.47 KB, 下载次数: 14)

免费评分

参与人数 23威望 +2 吾爱币 +30 热心值 +20 收起 理由
34度4 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
JPK + 1 + 1 用心讨论,共获提升!
lookerJ + 1 热心回复!
jnez112358 + 1 + 1 谢谢@Thanks!
大叶公园 + 1 谢谢@Thanks!
dns2018 + 1 热心回复!
笙若 + 1 + 1 谢谢@Thanks!
学习使我快乐鸭 + 1 + 1 我很赞同!
taobing + 1 + 1 我很赞同!
slx1074009615 + 1 + 1 热心回复!
LOLQAQ + 1 + 1 我很赞同!
zixiao520 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
取次花丛懒回顾 + 1 热心回复!
aldhr2017 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
pcjy + 1 + 1 谢谢@Thanks!
wwh1004 + 3 + 1 我很赞同!
li57933298 + 1 + 1 谢谢@Thanks!
Chenzi + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Hmily + 2 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
evea + 1 + 1 我很赞同!
drakpj + 1 + 1 谢谢@Thanks!
Je11y + 1 + 1 谢谢@Thanks!
天天爱你 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
wwh1004 发表于 2019-8-13 09:36
其实重命名有办法运行
https://www.52pojie.cn/forum.php ... 16&pid=27376490
你用VMPDumper把那个最新的样本dump一次,可以解密IL,顺便会自动hook掉CreateFile,默认就是过检测的
重命名之后,写入文件记得选混合模块

保存之后可以运行
推荐
 楼主| 梦游枪手 发表于 2019-8-13 22:31 <
wwh1004 发表于 2019-8-13 14:21
那个vmp bug,不知道为什么,用了sdk,加出来的程序就不能运行

这个是vm虚拟机在处理switch结构的时候出了问题。它把读到的字节无脑减去0x31(记为offset),再判断是否大于3,offset>3会跳到default分支处理,其他情况就全交给switch表处理了。其实就是少了一个offset<0的判断,导致(switch+offset)的offset有可能为负数,这样switch会跳转到不可预估的区域,然后就崩了。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
wwh1004 + 1 + 1 过几天有时间了看看

查看全部评分

4#
xinxirong 发表于 2019-8-13 05:43
5#
xiatian5200 发表于 2019-8-13 07:12
不错学习了
6#
a3322a 发表于 2019-8-13 07:31
够详细,支持一下!
7#
yqht3z 发表于 2019-8-13 07:34
学习了,,,。
8#
Je11y 发表于 2019-8-13 07:40
net反破解也越来越强力了
9#
miocaro507 发表于 2019-8-13 07:50
谢谢分享,学习一下~!
10#
chen950316 发表于 2019-8-13 08:42
感谢楼主分享谢谢
11#
brp0503 发表于 2019-8-13 08:58
感谢分享。。。。。。。
12#
美美木耶 发表于 2019-8-13 09:17
厉害了我的哥哥
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:禁止回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2019-12-11 15:12

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表