首页
社区
课程
招聘
[原创]逆向学习sgavmp篇
2020-5-29 13:03 18962

[原创]逆向学习sgavmp篇

2020-5-29 13:03
18962

sgavmp篇

觉着降生

也许在业界中sgavmp算是一个比较高的点了;它让很多人望而生畏,特别是对于我这种菜鸡来说,它简直是一个无法跨越的屏障。和猫一样人也对一些事物充满好奇,但往往催生你欲望的不是好奇而是外界事物。前不久有一个阿里安全部的面试邀请,记得最后一面的时候面试官几次问到了我他们avmp的实现原理,在当时我几乎除了听过其名字外对此一无所知,这便燃起了我的好奇心。

聊到sgavmp就不得不聊聊liteVM,不过我并不想在这里过多的描述它,我会单独在写一篇liteVM的文章。在逆sgavmp早期litevm并没有引起我的过多注意,从sdk中我知道有它的存在,但是它是怎样的存在就不得而知了;然而你想逆sgavmp你就不得不过litevm这一关,它出现的机率不亚于sgavmp;早期的时候它经常会乱入,随着我们把坑慢慢填满,才终于发现原来litevm是这样的一个存在,它作为一个附属大礼包免费送给你了。

逆向sgavmp过程是极其煎熬和富有挑战的,因为它确实有难度;做逆向的人应该最喜欢流水式的程序,你不用思考,很多时候静态分析就解决了大半工作,剩下的部分只需看着伪代码在模糊点调试一下即可。困难和恐惧来自未知,当程序打破流水式的时候,你会发现即使有伪代码你仍看不懂,程序不在有连续性,它的走向是未知的;在未知中给你添加几个小黑盒,黑盒隐藏了大部分逻辑,当你兴高采烈的弄明白黑盒子时,你发现原来它只是个盒子,盒子里面的东西才是你想要的;当你再次高兴的把里面看清楚时,你发现原来你想要的东西还是在外面,你永远不会知道下一步等待你的是什么。代码风格好的程序也是逆向者的最爱,因为数据结构清晰,我们几乎不用动脑就能轻松的还原;如果编程者刻意隐藏结构之间的关系,让本来存在直接关系的结构变成间接关系,那想必会增加逆向难度。一个巨大的数据结构也会增加逆向的难度,想想如果你去逆向linux内核(假设没有源码),想还原task_struct结构你需要花特别多的力气,一个是它自身大,另外是和它存在关系的结构也非常巨大,想正确的还原每个结构的每个属性还是比较难的。

追寻正法

       对于sdk类或者插件类程序,我并不喜欢直接调试或者逆向它的宿主程序,原因有三;一、sdk或者插件本身就已经很复杂,和宿主融合到一起后会更加复杂,无疑增加逆向程成本,二、需要找到sdk或者插件的调用入口点,三、需要绕过宿主的对抗。当一个宿主程序包罗万象大的夸张的时候,你千万别高估自己的定位能力,也千万别高估自己的耐心。

       对抗sdk或者插件我的思路是从最小化集成到完全集成,通俗讲就是你来作为它的宿主,你负责它生命周期管理,需要什么集成什么,我也确是这么做的。

       你的宿主可以很轻量化,并且能随时定制,仅提供你所需要的功能即可。

下图是我定制的宿主的view,它提供了我所需要的功能。


多道

sgmain、sgavmp、sgsecuritybody等前身是百川sdk下的无线保镖,最早由聚安全开发,同时对外对内都提供安全能力,对外提供低版本的5.x,对内提供更具安全能力的6.x版本;5.x版本不具备avmp、litevm功能,也不具备其他插件的能力。

如某内部app集成了无线保镖,它将拥有如下图所示部分(具体看实即集成):


就sgavmp来说,libsgavmp.so是一个压缩包,是一个完整的apk,而带版本号的so才是真正的so文件。


这些插件中,sgmain是主插件,其他插件强依赖这个插件,sgmain对其他插件可能存在弱依赖关系,也就是说sgmain可以独立运行,但其他插件不可以,sgmain插件的某些功能被单独拿出实现成了其他插件,因此对其他插件可能存在弱依赖。

sgmain插件:

sgavmp插件:

我之所以这么了解,是因为在逆向过程中遇到了解决不了的问题,我还特意注册申请了该sdk,详细的了解了文档中我想关注的地方;但很遗憾申请到的sdk版本是5.x的,上面也提到了它没有avmp,最终它也没能解决我的问题;但通过了解文档相关信息我更加了解这个sdk了,它对我最终逆向是有益的;因此提醒大家有些时候收集信息真的很重要,千万不要陷入埋头的怪圈。

       我用的版本是sgmain6.4.176, sgavmp6.4.38,但为了保密性,我在文中隐藏了一些关键点,希望见谅。该文档仅仅用来学习交流,用来提高安全门槛,不能用来做恶意事情,否则后果自付!

初禅

当sgmain插件启动之后,我们就可以创建avmp了,来让我们通过sdk代码捋一下它的创建过程:

1、首先调用createAVMPIntance函数

2、内部类调用doCommand(60901)

3、so层先准备command, 它的JNI_OnLoad函数大致如下图:

4、创建avmp实例

创建过程还是比较复杂的,对应结构也比较复杂,我以简单的图示来来展示一下重要的创建过程(图示中的名称都是我自己命名的,不代表真实情况):

菩提证果

经过了漫长的逆向它慢慢的展现在我面前,我这里把一些结构的部分截图展示一下:

AvmpInst

AvmpInstVcode

XorAvmpInst

还有很多复杂的结构,我就不一一展示了,感兴趣的同学可以自己逆向挑战一下。

它有自己的内存管理,这个可能是大多vmp不具备的功能,外层数据需要下沉两层;一层是vmp内存数据对应的偏移,一层是真正的vmp内存。数据全程加密,当你使用数据时先进行解密,读取数据后在加密回去。

       很多数据操作、交换、算法单单靠vmp指令实现是不现实的(代码膨胀的厉害、很多依赖关系无法解决),avmp依赖两种外部调用实现;一种是封装libc库函数(叫封装可能不贴切,叫引用更合适),我把此类函数称作innerFunc,它可以完成内外部数据的交换等操作,如memcpy,另一种调用也或多或少包含库函数,但除此之外它还可能调用sgmain中的相

关逻辑甚至是lvm,我把此类函数称之为handler,此类handler共13种,在初始化时会用200xx这样的编号进行注册。

 

如某个handler逻辑中包含调用command的逻辑;这两种外部函数对应其vmp指令类型

相同,关于创建我就说这么多把。

轮转法轮

波罗奈城

创建avmp实例后我们就可以进行vmp调用了,调用其大多是为了实现数据签名,我们来看一下sdk代码,调用avmp是通过doCommand(60902)来实现的,long型参数就是

创建avmp实例时返回的,它大概调用序列如下图:

摩揭陀国

创建avmp实例时我们会得到字节码,字节码的前8个字节用来匹配解释器,目前avmp实现了三种解释器;调用哪个算法是通过匹配模块符号来确定的,字节码9-16字节用来确定模块符号,通过模块符号匹配定位模块索引,最终我们就可以找到字节码了。

 

释迦国

指令解析,就如同arm指令一样它定义了一套自己的指令集,指令长度同样为4字节,它大概如下图的样子(并不能十分准确):

做逆向可以直接通过逆向工具看到汇编代码(它向我们隐藏了解码过程),对于指令的解析,运行时cpu直接译码,静态时反编译器帮助我们解码;在实现自定义指令或者vmp时,解码工作是我们实现解释器的重要功能,解释器负责按照指令定义格式一个指令一个指令的一步一步解析,先加载指令;

接着解析指令;

 

我们以avmp某个指令为例(如指令 000C7BC2,指令类型为2):

1、 取指令类型

2、 取11-15位, 原寄存器索引, 原寄存器Rn, 取16-27位shift

3、取指令第29、30位, 条件码(这里作为偏移的一部分用)

4、影响标志位,shift2 = offset | CPSR[29] | CPSR[30] , 同时更新cpsr寄存器

5、load加载vmp实例原寄存器Rn对应的双字的值

6、指令>>16 & 0xc000, 取条件码(这里作为偏移的一部分用)对应指令第31, 32位

7、影响标记位,SHIFT = shift2 | CSPR[31-32], 同时更新cpsr寄存器

8、val = Rn + SHIFT

9、取指令6-11位为目标寄存器Rd

10、stroe val, Rd #  保存数据到目标寄存器

此指令似乎是完成 Rd <- [Rn] + offset, 这里指令的高4位用作立即数(偏移)的一部分,至此一条指令执行完成。

指令解析还是比较复杂的,解释器是由n多这样的块组成,最终完成各种指令的解析。

FFFFFFFE类似是pop指令

FFFFFFEE类似是mov指令

xxxxxxxA指令类似ldr r0,  [[base + off], addv], add r0, off + shift,  str r0 [base + rd]

FFFFFFFA类似是mov指令把内存值移动到寄存器, ldr r0,  [[base + off], addv], str r0, rd

00000014指令会调用innerfunc或者handler

……

我们需要特别关注一些类型为14的指令,因为它负责调用外部例程(上面提到的),如调用innerFunc:

在例如调用handler,先根据注册类型查找handler:

查找到handler后调用相应的handler:

舍卫城

avmp主要用来实现签名算法的,其逻辑十分复杂,从上面的调用序列我们可以得到执行逻辑除vmp指令外,它还在lvm和securitybody之间穿梭;即使不存在vmp指令这套算法逻辑还是很复杂的,它的复杂不再于最后计算算法的本身,而是在于对抗逆向上,想彻底搞明白它的算法,还原它的算法还是很难的。

对于签名算法我想说的是,如就sign算法:

首先它由三部分构成(三个部分拼接而成),算法外层分为两大类,算法内部每套都调用了三种密码学类算法(两套公用了四种密码学算法)。

其次你更多的需要关注handler,有一个handler特别重要,每次它都是进入lvm的入口,也是最终调用算法的入口。

再次最终算法和securitybody有关,它会间接的进入lvm。

娑罗双树

金刚经

       说了这么多,其实我觉得了解它的vmp指令或者还原它的指令、算法意义不大,我们应该更多的学习别人的优点,学习他们怎么做加固对抗的;另外补充说明他们真的很强大,做的东西真的很牛逼。

法华经

       展示结果,1调试获取

2、程序黑盒

结果

涅槃经

不过是个东西就有利有弊,我也肤浅的提出一些自己的看法,又不对的地方还请原谅:

优点: 全程加密;复杂、特别复杂,完全是指令级别的vmp,有自己的指令集,设计过于复杂;拥有自己的内存管理,数据在内部保密性好;拥有多层数据管理,数据分散,保密性好。

缺点: 有独立内存也恰巧给了别人窥视的机会;很多复杂算法如加密算法(不是指vmp的内部数据加密)都是最终调用的外部实现这给了别人可乘之机;内部加解密也给了别人观看数据的机会;浪费空间浪费内存,内部内存太大,大多都用不到,一般小内存手机根本跑不起来,频繁的vmp内存操作,影响效率。

虽然这么说,但我自己可能连vmp都实现不了,哈哈,因为它确实已经非常优秀了,该有的都有,你能想到的它都有。

       再次声明:该文档仅仅用来学习交流,用来提高安全门槛,不能用来做恶意事情,否则后果自付!

 

       本人该项目github地址: https://github.com/ylcangel/crack_sgavmp

会不会提交某些数据结构看个人心情,你千万别指望我会这么做,谢谢!

 

转载需标明出处,否则发现必究!!!

 

 



[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2020-7-13 12:52 被angelToms编辑 ,原因:
收藏
点赞19
打赏
分享
打赏 + 22.00雪花
打赏次数 2 雪花 + 22.00
 
赞赏  愚公   +20.00 2020/09/28 感谢分享~
赞赏  orz1ruo   +2.00 2020/05/29 感谢分享~
最新回复 (31)
雪    币: 75
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
daliands 2020-5-29 13:38
2
0
学习一下
雪    币: 1791
活跃值: (1032)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
yezheyu 2020-5-29 14:03
3
0
学习了,膜拜大佬
雪    币: 2719
活跃值: (1507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 2020-5-29 14:17
4
0
这个  弄出来  可以  去阿里 要个 P8  是没啥 问题的把 
雪    币: 3515
活跃值: (2877)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
StriveMario 2020-5-29 14:52
5
0
太强了叭...
雪    币: 19586
活跃值: (60148)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2020-5-29 14:56
6
0
666 感谢分享
雪    币: 4207
活跃值: (1144)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
passself 2020-5-29 15:07
7
0
p8+了
雪    币: 2719
活跃值: (1507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 2020-5-29 15:56
8
0
阿里的工程师   默默的 把  闹钟 调到了  3点钟
雪    币: 657
活跃值: (68)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
Fireeye 2020-5-29 16:37
9
0
666
雪    币: 5233
活跃值: (3255)
能力值: ( LV10,RANK:175 )
在线值:
发帖
回帖
粉丝
挤蹭菌衣 1 2020-5-29 16:55
10
0
向大佬献出膝盖
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
万抽抽 2 2020-5-29 16:58
11
1

给楼主点赞,AVMP 是16年一位大佬和我一块写的,这是目前看过分析得最深入的文章了。不过AVMP还有不少核心安全能力大家可以继续深入研究一下哈。

当前团队致力于研发业界顶级的安全攻防产品(研发 vmp 并逆向分析其他 vmp),处于高速发展阶段,亟需编译器、逆向攻防人才,欢迎有兴趣的同学联系 yuanchun.wyc @ alibaba-inc.com。

最后于 2020-5-29 17:05 被万抽抽编辑 ,原因:
雪    币: 3040
活跃值: (1151)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
angelToms 2 2020-5-29 17:10
12
0
难得糊涂~
雪    币: 174
活跃值: (3646)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
TUGOhost 2020-5-29 18:03
13
0
强啊,师傅.
雪    币: 12103
活跃值: (15504)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2020-5-29 22:17
14
1
mark,楼主辛苦了
雪    币: 2719
活跃值: (1507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 2020-5-29 22:18
15
0
万抽抽 给楼主点赞,AVMP 是16年一位大佬和我一块写的,这是目前看过分析得最深入的文章了。不过AVMP还有不少核心安全能力大家可以继续深入研究一下哈。当前团队致力于研发业界顶级的安全攻防产品(研发 vmp ...
这玩意  攻破了  可以 要个 p8  不    
雪    币: 36
活跃值: (991)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
芃杉 2020-5-29 23:51
16
0
mark
雪    币: 63
活跃值: (433)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hemdacker 2020-6-1 10:50
17
0
跟VMProtect比是什么水平?
雪    币: 3040
活跃值: (1151)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
angelToms 2 2020-6-1 17:01
18
0
hemdacker 跟VMProtect比是什么水平?
这个你得at 万抽抽大佬问问他,他是项目的开发者, 我也坐等大佬回复
雪    币: 205
活跃值: (759)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zmguozi 2020-6-2 09:31
19
0
牛,真牛,非常牛
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZwCopyAll 2020-6-2 10:25
20
0
666
雪    币: 866
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
jack.zhang 2020-6-2 18:52
21
0
超级 666    
雪    币: 274
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
愚公 2020-6-5 16:09
22
0
有3个问题想请教大佬:
1.关于x-sign,是否用了AES白盒?
2.如何定位AES白盒的入口和出口?
3.关于wua,wua最后的签名是最难的吗,能否提供一点提示和方向?
//12年了,第一次回帖!
雪    币: 3040
活跃值: (1151)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
angelToms 2 2020-6-5 17:36
23
0
愚公 有3个问题想请教大佬: 1.关于x-sign,是否用了AES白盒? 2.如何定位AES白盒的入口和出口? 3.关于wua,wua最后的签名是最难的吗,能否提供一点提示和方向? //12年了,第 ...
第六感告诉我你好像都知道,要不能问这么有深度的问题,哈哈,本来我不想回答,不过既然你这么庄重的问了,我也就随便说一下吧,哈哈,另外我不知道你说的AES白盒,AES后面特别加这两个白盒啥意思,哈哈,我才疏学浅
1、首先这篇文章主要针对sgavmp,而x-sign算法调用的是sgmain插件的ISecureSignatureComponent的signRequest方法,最终调用command(10401), 我没研究过x-sign算法,它是否会走入sgavmp中我不知道,那我就不确定它是否调用了AES,我关注点不在它的签名算法。
2、你第二个问题我都不知道你想问什么,如何定位,什么叫如何定位,你是想暗示我"你们、他们"用的AES加密实即是包装了AES嘛,不能把它当作纯AES嘛?
3、wua最终调用的就是sgavmp的sign算法,提示就是你去跟invokeAVMP的逻辑,这里有没有调用AES,你倒是可以研究研究,哈哈
希望我的回答能让你满意,哈哈
雪    币: 274
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
愚公 2020-6-5 18:54
24
0
谢谢回答!
这几个问题都困扰了我很久。承认自己arm汇编和调试能力不足。
现在一直无法确定计算x-sign的其中一步是否使用AES白盒加密。如果可以确定,我肯定是没有能力分析出key的。
(这属于密码学攻击范畴)论坛有一篇文章《一种还原白盒AES秘钥的方法》(https://bbs.pediy.com/thread-254042.htm)。
这篇文章《【密码篇】白盒加密基本思想》https://zhuanlan.zhihu.com/p/21273220?refer=bitsecurity
我对AES白盒加密的理解是:魔改后的AES算法,利用查表计算AES。牺牲一点空间。(也不知道理解错了没有)它的key和算法融为一体了,所以在内存中不会出现明文key。
所以更hook不到key。不像那个libsgmain.so的switch{}里:0x10,0x11,0x12是AES,0x17是hmac-sha1,0x18是sha1一样。这些都可以通过hook得到key,而AES白盒加密算法不能。
我想通过找到入口和出口,直接通过 AndroidNativeEmu 调用 .so文件里处理白盒的函数。而我没有能力找到这个位置。
大佬如果哪天得闲了。确定了so里使用了AES白盒,相信以你的能力应该能分析出里面的逻辑。甚至能还原出key来。
雪    币: 3040
活跃值: (1151)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
angelToms 2 2020-6-5 19:22
25
0
愚公 谢谢回答! 这几个问题都困扰了我很久。承认自己arm汇编和调试能力不足。 现在一直无法确定计算x-sign的其中一步是否使用AES白盒加密。如果可以确定,我肯定是没有能力分析出key的。 (这属 ...
牛逼,我还真没研究过什么白盒加密,即使曾经遇到过估计也不知道,这确实是一个好的思路; 等哪天我闲了研究研究;另外听说很多人都把这个算法逆了,没特别听说什么白盒不白盒,当然我只是道听途说,确实我还真没关注过这些签名算法,哈哈,如果你搞定了,倒是愿闻其详,哈哈
游客
登录 | 注册 方可回帖
返回