首页
社区
课程
招聘
[分享]VMPStudio-UraniumVM采样编辑器用户手册
2021-7-30 12:32 8314

[分享]VMPStudio-UraniumVM采样编辑器用户手册

2021-7-30 12:32
8314

VMPStudio用户手册

版本 日期 内容
V1.0 2021-07-28 UraniumVM采样编辑器初始文档编写;

简介

VMPStudio(全称Virtual Machine and Protection Studio),是一款基于函数虚拟机的交互式二进制动静态分析器。它主要包括LightIDA静态反汇编器、UraniumVM采样编辑器、UrDecompiler动态反编译器、PhoneVMP虚拟机保护操作台这四大部分。

 

名词解释

名称 说明
函数虚拟机 用软件模拟CPU指令集的运算,将进程函数运行在该模拟指令集之下。
二进制 CPU指令集的二进制编码,比如arm、x86、arm64、x64、risc-v二进制代码。
动静态分析 从文件或进程入手,分析程序的代码、数据。
反汇编器 将CPU指令集的二进制编码格式化为指令助记符的形式,提高二进制代码可读性。
反编译器 将汇编函数分析、重构为C伪代码的形式,提高汇编函数可读性。
采样器 记录、保存函数虚拟机运行过程中的指令、地址、内存。
虚拟机保护 用函数虚拟机运行加密后的函数代码,达到隐藏函数逻辑,提高逆向、破解的门槛。

LightIDA静态反汇编器

UraniumVM采样编辑器

简介

UraniumVM采样编辑器(UraniumVM Sampling Editor,简称UVMSE),是函数虚拟机UraniumVM的前端操作台。提供UVM采样数据浏览、编辑、导入、导出等功能。

部署设置

iOS手机端环境部署

1.安装Textobot

Textobot主要用于提供脚本化的iPhone手机管理功能,下载地址。安装完成后,服务就自动处于运行状态。如果手机重启过,那么需要在ssh命令行使用tbsvr手动重启服务,如下:

1
2
3
iPhone:~ root# ls -l /usr/bin/tbsvr
lrwxr-xr-x 1 mobile staff 15 Jan 11  2021 /usr/bin/tbsvr -> textobot-server*
iPhone:~ root# tbsvr
2.安装UVMDbg

UVMDbg主要提供函数虚拟机运行时liburaniumvm.dylib,下载地址。安装完成后,相应的文件就已经存放好了。

3.安装UVMFire

UVMFire主要提供UVMSE采样运行时支持,下载地址。安装完成后,服务自动处于运行状态。如果手机重启过,那么需要在ssh命令行使用uvmserver手动重启服务,如下:

1
2
3
iPhone:~ root# which uvmserver
/usr/bin/uvmserver
iPhone:~ root# uvmserver
4.服务检测

UVMSE采样过程,依赖上述步骤提供的服务或文件,我们可以通过如下方式检测依赖是否正常。

1
2
3
4
5
6
7
8
9
iPhone:~ root# ps -ef|grep server
    0 20305     1   0 12Jul21 ??         0:01.14 /usr/bin/uvmserver
    0 21721     1   0 12Jul21 ??         1:26.09 /usr/libexec/hybrage-iserver
    0 21724 21721   0 12Jul21 ??         0:06.17 /usr/libexec/frida-server -l 0.0.0.0
    0 23258 23250   0  3:20PM ttys000    0:00.01 grep server
iPhone:~ root# ls -l /usr/lib/liburaniumvm.dylib
-r-xr-xr-x 1 root wheel 591296 Jul 27 08:48 /usr/lib/liburaniumvm.dylib*
iPhone:~ root# ls -l /usr/lib/uvmfire.dylib
-r-xr-xr-x 1 root wheel 973392 Jul 26 13:47 /usr/lib/uvmfire.dylib*

进程hybrage-iserver、frida-server说明Textobot环境正常。进程uvmserver、文件/usr/lib/uvmfire.dylib说明UVMFire环境正常。文件/usr/lib/liburaniumvm.dylib说明UVMDbg环境正常。

Android手机端环境部署

1.Attach支持

将UVMFire相关文件放在/data/local/tmp/目录下面,ARM32位下载地址ARM64位下载地址。安装好之后,目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
angler:/data/local/tmp # ls -l ./uvm-server
total 26900
-rwxrwxrwx 1 shell shell 17833720 2021-03-05 10:53 frida-inject
-rwxrwxrwx 1 shell shell   824264 2021-07-26 14:09 liburaniumvm.so
-rwxrwxrwx 1 shell shell  4748136 2021-07-26 16:54 libuvmfire.so
-rwxrwxrwx 1 shell shell   107596 2021-07-26 16:47 libuvmzygote.so
-rwxrwxrwx 1 shell shell   140980 2021-03-21 15:33 unzip
-rwxrwxrwx 1 shell shell  4508072 2021-07-26 16:47 uvmserver
-rwxrwxrwx 1 shell shell   193168 2021-03-21 15:33 zip
angler:/data/local/tmp # ls -l ./uvm-server64                                                      
total 51744
-rwxrwxrwx 1 shell shell 41596296 2021-03-05 10:54 frida-inject
-rwxrwxrwx 1 shell shell   748032 2021-07-26 14:09 liburaniumvm.so
-rwxrwxrwx 1 shell shell  5375368 2021-07-26 16:54 libuvmfire.so
-rwxrwxrwx 1 shell shell    20784 2021-07-26 16:47 libuvmzygote.so
-rwxrwxrwx 1 shell shell   145520 2021-03-21 15:33 unzip
-rwxrwxrwx 1 shell shell  4829480 2021-07-26 16:47 uvmserver
-rwxrwxrwx 1 shell shell   199576 2021-03-21 15:33 zip

根据要采样的进程架构,请保持对应的uvmserver一直处于运行状态,如下:

1
2
angler:/data/local/tmp # ./uvm-server64/uvmserver                                                  
Running uraniumvm tcp server at port 30334.
2.LaunchAPK支持

LaunchAPK的主要作用是优先于目标App获得进程控制权。因为如果目标进程使用Ptrace先于Attach操作Attach自身,那么Attach操作将会失败。目前,UVMSE LaunchAPK的实现基于Magisk/Riru模块,下载地址。下载后,将uvmzygote和riru模块放至/sdcard/Downloads目录,然后使用Magisk模块管理App依次安装riru、uvmzygote即可。

1
2
3
4
angler:/sdcard/Download # ls -l
total 110140
-rw-rw---- 1 root sdcard_rw     16974 2021-07-27 08:37 cn.yunyoo.uvmzygote.zip
-rw-rw---- 1 root sdcard_rw    204431 2021-03-22 22:14 riru-v25.zip

 

接下来,非常关键的一步设置:关闭SELinux。这样才能让沙盒App旁加载UVMFire采样运行时:

1
2
3
angler:/ # setenforce 0
angler:/ # getenforce                                                                              
Permissive

当SELinux的状态是Permissive时,LaunchAPK才能正常工作。

桌面端初始设置

如果要采样iOS目标进程,那么将如下iOS的IP地址设置为配置好环境的iPhone WiFI IPv4地址:

 

 

如果要采样Android目标进程,那么将如下Android的IP地址设置为127.0.0.1,并点击adb按钮选择Android SDK里面的adb路径:

 

专业版授权设置

1.免费版与专业版的区别
功能 免费版 专业版
采样编辑器 Yes Yes
基本CFG Yes Yes
高级CFG No Yes
动态反编译器 No Yes
OLLVM还原 No Yes
二进制导出 No Yes
2.授权模式

UVMSE授权模式是,9000元/目标架构/台/年,也即一个授权只支持1台电脑,有效期1年,过期后自动转为免费版。目标架构是指arm、arm64,也即一个授权可以同时支持macOS/iOS/Android的同一种架构。

3.生成设备HWID

想好你要绑定的电脑(原则上在授权有效期内不能重新绑定新电脑),下载HWID生成器并在要绑定授权的电脑上运行之,下载地址

1
2
VMPStudio@MacBook-Pro licensehwid % ./arm64-mac/vmphwid
YunYoo license arm macos vmphwid : A1W+yv1z8gvcvEsj

字符串A1W+yv1z8gvcvEsj即是当前电脑的硬件唯一标识符。

 

剩余步骤请参见完整pdf用户手册。

4.....
5.....

使用流程

我们使用ollvmdebug这个简单的样例来完整说明UVMSE的使用过程。ollvmdebug是一个控制台程序,它接受字符输入,当输入r字符时就调用do_main函数,当输入q字符时就退出程序。源码如下,下载地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void do_main(int argc, const char *argv[]) {
  if (!getenv("NO_ANTIDBG")) {
    anti_debug();
  }
 
  for (int i = 0; i < argc; i++) {
    bool dbg = am_I_being_debugged();
    printf(
      "Running %s, I'm being debugged(%s).\n",
      argv[0],
      dbg ? "true" : "false");
 
    if (dbg) {
      // infinity loop if under control
      i = 0;
    }
    sleep(2);
  }
 
  // what a nice day...
  puts("Have fun with UraniumVM Studio~"); 
}
 
int main(int argc, const char *argv[]) {
  printf("Input 'q' to quit and 'r' to run the ollvm main entry.\n");
  while (true) {
    char ch = getchar();
    if (ch == 'q') break;
    if (ch == 'r') do_main(argc, argv);
  }
  return 0;
}

我们使用ollvm的bcf、fla、sub以及hikari的strencrypt混淆do_main函数,分别得到ARM macOS、iOS、Android的三个ollvmdebug控制台程序,三个都一样,只是运行目标平台不一样而已。本文以ARM macOS为例进行下面的流程介绍。

1.确定采样目标

本例子中,我们的采样目标是上述ollvmdebug程序的do_main函数,运行它如下:

1
2
VMPStudio@MacBook-Pro armmac % ./ollvmdebug
Input 'q' to quit and 'r' to run the ollvm main entry.
2.使用LightIDA加载采样模块

3.Attach采样进程

 

 

如果当前LightIDA加载的模块在目标进程中,那么切换到UraniumVM窗口就会得到如下成功的输出日志,反之会输出找不到当前模块的信息:

 

4.对采样地址下无痕断点

切换回LightIDA窗口,在do_main函数右键,执行Sample Function菜单,即可设置无痕软件断点:

 

5.操作目标进程触发断点

在ollvmdebug控制台输入r字符并回车,得到如下信息:

1
2
3
4
5
6
VMPStudio@MacBook-Pro armmac % ./ollvmdebug
Input 'q' to quit and 'r' to run the ollvm main entry.
r
not P_TRACED.
Running ./ollvmdebug, I'm being debugged(false).
Have fun with UraniumVM Studio~

这样就对目标进程的目标函数实现了一次采样。

6.浏览采样数据

切换回UraniumVM窗口,我们可以看到如下采样数据和采样日志:

 

 

在这里,我们就可以浏览、编辑采样回来的指令等数据了,比如,我们可以对比一下静态CFG、动态CFG、重写CFG。

 

 

静态CFG:

 

 

动态CFG:

 

 

重写CFG:

 

7.动态反编译

有了采样数据,我们切换到UrDecompiler窗口,就可以看看动态反编译和静态反编译的区别了。

 

 

静态反编译:

 

 

动态反编译:

 

8.导出还原后的二进制文件

当然,现阶段VMPStudio的静态分析能力远远没有IDA那么优秀,所以,我们可以将简化还原后的二进制文件导出给IDA使用。

 

9.保存采样数据

对于一些复杂的样本,反复研究运行时数据,是有必要的,所以我们可以将采样数据保存,然后任何时候都可以重新加载它们。

 

 

 

上述图片中的*.sdb文件,即是剥离进程存档的采样数据库文件。

10.简化还原文件二次利用

我们将简化还原后的文件继续在IDA里面分析,得到更加优质的反编译代码:

 

界面功能

1.LightIDA

 

Sample Function:附加目标进程后,设置无痕软件断点;

 

Sample Stop:撤销无痕软件断点;

 

Dynamic Decompile:使用采样数据对选择的函数进行动态反编译,反编译结果在UrDecompiler窗口浏览;

2.UraniumVM

 

Restore Instruction:恢复当前选中的指令到编辑之前的值;

 

Edit Instruction:编辑当前选中的指令;

 

BasicBlocks to here:跳转至当前选中指令的基本块;

 

Jump to BasicBlocks:当前选中指令要跳至的基本块;

 

Reassemble to file:简化还原采样过的函数并重写至新的二进制文件中;

 

Reassemble to file with code clear:简化还原采样过的函数、清零未采样的函数并重写至新的二进制文件中;

 

Dyndecompile to file:简化还原采样过的函数、清零未采样的函数并重写至新的二进制文件中,然后利用该文件生成动态反编译数据库文件供A64Dbg专业版C伪代码级调试使用;

 

Select sample data:选择采样数据,如果多次或者多个采样函数数据,那么可以通过它切换当前操作的采样数据;

 

Differ samples data:对两次采样数据进行差分计算,找出差异化的部分;

 

Combine samples data:对多次采样数据进行合并计算;

 

CFG for static:基于文件Opcodes静态分析得到的控制流程图,属于基本CFG;

 

CFG for executed:基于采样数据得到的控制流程图,属于基本CFG;

 

CFG for combined:基于采样数据得到的合并、简化控制流程图,属于高级CFG;

 

CFG for rewrited:基于采样数据得到的合并、简化、重写控制流程图,属于高级CFG,如果采样函数不是ollvm混淆的,则与CFG for combined一样;

3.UrDecompiler

 

Dynamic Decompile:使用采样数据对选择的函数进行动态反编译;

4.主菜单和工具栏

 

 

Attach:选择要采样的目标进程;

 

Launch APK:选择安装在手机端要采样的目标APK,自动拉起并控制目标进程;

 

Detach:停止控制目标进程;

采样数据管理

 

当我们对同一个函数做了多次采样或者我们对同一模块的不同函数进行了采样,那么我们就可以通过这三个采样去选择、差分、合并采样数据。其中差分、合并只能是对同一个函数的采样数据进行计算。

 

 

Index:采样序列;

 

PC Chains:PC执行链,同一地址可能出现多次,比如循环;

 

Address Hit:函数被执行过的指令地址,这就是我们在UraniumVM窗口看到的反汇编代码地址;

二进制导出

1.直接导出

Reassemble to file,除了采样函数重写、data区块用内存数据重写之外,其他部分保持不变。

2.清零导出

Reassemble to file with code clear,采样函数重写、data区块用内存数据重写、非采样函数清零,其他部分保持不变。该选项对于一些几十MB,甚至几百MB的文件尤其有用。这样可以大大提高IDA分析新二进制文件的速度。

3.反编译导出

Dyndecompile to file,采样函数重写、data区块用内存数据重写、非采样函数清零,其他部分保持不变。然后对新二进制文件采样过的函数实施动态反编译,并将结果存储。这样A64Dbg专业版就可以对复杂二进制文件的复杂函数进行C伪代码级的调试了。

 

 

上述图片中以-dyndec结尾的文件夹即是动态反编译数据库文件,其中*.c是C伪代码、rva.map是采样函数地址重写前后的映射表(供A64Dbg专业版加载使用)。

UrDecompiler动态反编译器

PhoneVMP虚拟机保护操作台


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞3
打赏
分享
最新回复 (19)
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2021-7-30 12:42
2
2
看雪现在成免费广告论坛了嘛?
随便翻翻论坛帖子,动不动就是一篇广告贴

如果你要买广告位置顶,请联系论坛管理员买广告位,别整天发广告帖

雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-7-30 13:08
3
0
海风月影 看雪现在成免费广告论坛了嘛? 随便翻翻论坛帖子,动不动就是一篇广告贴 如果你要买广告位置顶,请联系论坛管理员买广告位,别整天发广告帖
请注意标题前缀:【分享】,表明这就是一个工具分享的帖子,且这个工具具有一定的免费使用价值,不一定非要花钱买专业版。
如果我发的帖子对你造成了困扰,那我向你道个歉:对不起,打扰到你了,请见谅。
雪    币: 6266
活跃值: (1276)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xmhwws 2021-7-30 14:17
4
0
你这工具似乎全英文化?如果面向国内,最好界面语言可选择汉语
雪    币: 6790
活跃值: (8540)
能力值: ( LV17,RANK:797 )
在线值:
发帖
回帖
粉丝
无名侠 12 2021-7-30 15:32
5
0
感觉就是把一些乱七八糟的trace塞在一起了,然后做了一个ui
雪    币: 8041
活跃值: (2637)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
layerfsd 4 2021-7-30 15:32
6
0
为啥都要用别人的名字?ida,vmp
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-7-30 20:19
7
0
xmhwws 你这工具似乎全英文化?如果面向国内,最好界面语言可选择汉语
嗯,现在先主要做功能,等功能相对稳定了再加汉语。
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-7-30 20:21
8
0
无名侠 感觉就是把一些乱七八糟的trace塞在一起了,然后做了一个ui
大侠666,我们团队坚持做了1.5年,从底层虚拟CPU开始自研,前端UI用了x64dbg也遵照开源协议开源了的,你一个感觉就评价完了,好歹先用用或者看看啊。
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-7-30 20:22
9
0
layerfsd 为啥都要用别人的名字?ida,vmp
因为这些名字很酷。
雪    币: 12500
活跃值: (3043)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
白菜大哥 2021-7-31 09:58
10
0
用过免费版的,工具不错,就是能不能把用户体验优化一下。。好多手册没有,然后就是用户猜测怎么用。。而且遇到程序崩溃什么的,建议能输出一些关键信息,因为用户不可能调试一个app,遇到问题就找你吧。你也不可能7*24小时当客服吧。。
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Rprop 2021-7-31 13:25
11
0
你的指令模拟是unicorn还是用qemu做的呢
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-7-31 16:05
12
0
白菜大哥 用过免费版的,工具不错,就是能不能把用户体验优化一下。。好多手册没有,然后就是用户猜测怎么用。。而且遇到程序崩溃什么的,建议能输出一些关键信息,因为用户不可能调试一个app,遇到问题就找你吧。你也不可 ...
感谢支持。才刚把产品主题体系做完,后续会逐步更新相应的用户手册。
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-7-31 16:07
13
0
都不是,要想走得远,这种基础核心模块必须自研:https://gitee.com/yunyoo/UraniumVCPU
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-7-31 16:10
14
0
Rprop 你的指令模拟是unicorn还是用qemu做的呢
大侠可以用用我们这个指令模拟模块,个人私用是免费的。
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Rprop 2021-7-31 21:09
15
0
GeekNeo 都不是,要想走得远,这种基础核心模块必须自研:https://gitee.com/yunyoo/UraniumVCPU
看UraniumVCPU只提供了so和dylib,是直接在终端上模拟?在手机上跑x86代码?
雪    币: 3835
活跃值: (4169)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
krash 4 2021-8-1 15:52
16
0

基于开源项目实现了一个原理类似的,有兴趣的朋友可以下载回来玩:sim-trace

雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
Rprop 2021-8-1 16:51
17
0
krash 基于开源项目实现了一个原理类似的,有兴趣的朋友可以下载回来玩:sim-trace
之前看vixl的文档,提了simulator只支持vixl自己能生成的指令,似乎有少数指令是不支持的?
雪    币: 3835
活跃值: (4169)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
krash 4 2021-8-1 19:32
18
0
Rprop 之前看vixl的文档,提了simulator只支持vixl自己能生成的指令,似乎有少数指令是不支持的?
这个我也不太清楚。机制如果没问题,添加指令支持应该不是什么问题。机制有问题,那可能就无解了。
雪    币: 2132
活跃值: (6726)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
爱吃菠菜 2 2021-8-2 14:32
19
0

 之前我用的你的东西,我自己写了个"采样器"

最后于 2021-8-2 14:33 被爱吃菠菜编辑 ,原因:
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
GeekNeo 2 2021-8-3 12:16
20
0
爱吃菠菜 &nbsp;之前我用的你的东西,我自己写了个&quot;采样器&quot;
大侠666.
游客
登录 | 注册 方可回帖
返回