无名侠 发表于 2017-6-29 03:15

某安全SDK的ARM级VMP简单分析

本帖最后由 无名侠 于 2017-6-29 03:18 编辑

样本来源于阿里安全SDK,APP为狼人杀,这个样本并不算真正的VMP,但是有VM的影子,非常值得学习。

阿里安全SDK的libsgmainso-5.3.38.so提取方法:
解压APP,定位lib目录,找到libsgmain.so,该so实际是一个apk文件。将该apk解压后,就能在lib目录中找到真实SO。

样本SO ELF文件节表有问题,IDA无法正常打开,进行简单修复即可。

修复方法:
打开010 套模板,Elf32_Half e_shnum置0即可。

运作原理:





其中有一张表,该表记录了opcode对应Handler的偏移地址。

Handler地址计算:
Vm_table 为该表起始地址。
Vm_base 为一个对齐地址等于Vm_table + 1
Offset = vm_table
HandlerAddr = offset + vm_base
Opcode字节码不集中,采用指令链接形式把所有opcode串联起来。

本文样本的解析部分结果(手动计算):
Op Handler
1D CF9D
1E D3B3
10 D264
2B D5F4
25 D4F0
2A D5CC
0C 01F8
29 .....
...       ....
可以根据前面的公式自行写一个脚本提取Opcode。

Op 链接例子:例如0x1E的Handler 0xD3B3中,在主要代码执行后,有一条指令来设置下一条指令的Opcode 0x10。如图:

所以,0x1E的下一条指令为0x10。




分析JNI_OnLoad 函数,单步一小会有如下风景:

我们可以在这里清晰的看到虚拟机入口和第一条指令设置的代码以及VM相关的数据。


函数sub_8ccA0 为重要函数(忽略转移代码)
自行看注释理解吧

梦幻的彼岸 发表于 2017-6-29 06:18

蒙圈了 我还要努力啊楼主学的是c语言吗

emsAron 发表于 2017-6-29 07:26

感觉挺好玩的{:17_1056:}

snccwt 发表于 2017-6-29 08:15

支持楼主的好学

夏雨微凉 发表于 2017-6-29 08:35

感谢分享经验教程!

by92926 发表于 2017-6-29 08:48

感谢楼主分享经验!

yuan71058 发表于 2017-6-29 10:13

夏末moent 发表于 2017-6-29 10:19

感谢发布原创作品,吾爱破解论坛因你更精彩!

zhuzaiting 发表于 2017-6-29 16:38

感谢楼主分享

6767 发表于 2017-6-29 19:17

vmp逐渐要成为更强的android保护机制了
页: [1] 2
查看完整版本: 某安全SDK的ARM级VMP简单分析