[Android]腾讯应用加固的脱壳分析和修复

上传人:ni****g 文档编号:521198704 上传时间:2023-08-17 格式:DOCX 页数:10 大小:440.08KB
返回 下载 相关 举报
[Android]腾讯应用加固的脱壳分析和修复_第1页
第1页 / 共10页
[Android]腾讯应用加固的脱壳分析和修复_第2页
第2页 / 共10页
[Android]腾讯应用加固的脱壳分析和修复_第3页
第3页 / 共10页
[Android]腾讯应用加固的脱壳分析和修复_第4页
第4页 / 共10页
[Android]腾讯应用加固的脱壳分析和修复_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《[Android]腾讯应用加固的脱壳分析和修复》由会员分享,可在线阅读,更多相关《[Android]腾讯应用加固的脱壳分析和修复(10页珍藏版)》请在金锄头文库上搜索。

1、Android腾讯应用加固的脱壳分析和修复 By ZzAge0x1:腾讯云加固:http:/ http:/ 用ApkTool反编译加固后的APK, 出现反编译不过去,错误日志如下:1.通过下面日志能看出来是apktool解析AndroidManifest.xml时出错,注意绿色下划线的name=fasten,这里TX加固是利用android系统解析axml的一个特点来导致apktool反编译时,在解析AndroidManifest.xml时出错。关于利用AndroidManifest.xml这块的技术点可以参考一下万抽抽大神的文章:http:/ http:/ Editor模板https:/ 利

2、用axml模版在010Editor解析AndroidManifest.xml能看到,有一个属性结构的name成员的值是25, 该值指向是string的索引,同时也是res ID的索引。属性结构:String索引:Res ID 索引:为什么这样做,哈哈哈,我懒,所以直接截图引用万抽抽大神的解释:嗯,属性结构的name成员的值是即是string索引,又是ResID索引,所以:Name=25String25=fastenResIDs25=0x01017FFF再次引用抽抽大神文章里的一段话:Android系统在解析AXML的属性的时候,是通过该属性的res id号而非属性名定位的。所谓的AXML就是A

3、ndroidManifest.xml对应的二进制文件,APK包中存储的就是AXML。比如属性: 它的属性名为name,id号为0x01010003。所以fasten这个字符串可以随意改,关键还是ResID的值,TX加固对AndroidManifest.xml处理,是插入一下非法的属性ID (在Android的attr里没有一个ID为0x01017FFF),因为是非法的属性ID,Android是不会去解析,但ApkTool却会去解析,所以导致反编译出错了。修复方法:知道怎么回事,修复起来就很简单了,只要把非法的属性ID=0x0101FFFF改成一个合法的属性ID,比如把0x0101FFFF改成n

4、ame的属性ID=0x01010003,然后再把修改后的AndroidManifest.xml再替换加固后apk里的AndroidManifest.xml,然后用apktook就可以顺利的成功的反编译出来。附件有我用官网最新版的ApkTool 2.0.0 RC3源码编译,修改了一下,修复非法属性ID无法反编译。如果懒得手动去修改AndroidManifest.xml,可以直接用我这个修改过的apktool进行反编译。反编译后,看加固修改后的AndroidManifest.xml和原版的AndroidManifest.xml多这三条:1. 2. android:fasten=meta-data3

5、. 0x2:a,ApkTool反编译可以成功,那接下来看一下TX加固是怎么对Dex进行加密的1. 新增了2个smail文件comtencentStubShellProxyShell.smalicomtencentStubShell ShellHelper.smali2. Smail代码的变化(对指定方法进行加密)从截图能看到,加固后的dex,通过apktool反编译后的smali代码变化。(1)新增静态代码块:(只要加载此类,就会先执行该代码块,作用是用来动态恢复被加固的方法).method static constructor ()V .locals 2 .prologue const-st

6、ring v0, com.boco.nfc.activity const/16 v1, 0x0 invoke-staticv0,v1,Lcom/tencent/StubShell/ShellHelper;-StartShell(Ljava/lang/String;I)Zreturn-void.end method用JEB转成代码如下:static ShellHelper.StartShell(com.boco.nfc.activity, 0);(2)原始方法:.method public constructor (Landroid/content/Context;)V改为native属性,并且

7、隐藏字节码:.method public native constructor (Landroid/content/Context;)V被加固后的Method数据:从这里能看到关键是在StartShell函数,这个StartShell函数专门负责在执行时动态恢复被加固的方法,TX加固这种方式没办法直接通过dump来进行脱壳,它机制是需要运行到某个类,加载这个类时才会修复一下该类被加固的方法,但你又不能保证所有类你都能执行到,所以还是得找原始数据来进行修复dex。public static boolean StartShell(String packageName, int iIndex)从St

8、artShell函数第二个参数iIndex来看,应该是要修复那个函数的编号。所以,可以猜测肯定会有一份原始的数据供给修复,所以从StartShell函数入手,就能找到修复的原始数据。StartShell函数会先判断如果没有初始化过则执行InitProxyShell函数,InitProxyShell函数作用其实就是加载libshell.so, 最后,调用libshell.so的load(ShellHelper.strPackageName, iIndex);来进行修复,这里调用具体过程就不说了,哈哈,TX加固还有log可以看,方便大家理思路,大家想了解自己可以去看看,。从这里能看到,关键是lib

9、shell.so的load函数在负责动态修复功能,下面就用IDA把libshell.so分析一下load函数。(1) 看一下libshell.so的JNI_OnLoad函数主要就是做一些初始化的时,看来没什么,我们直接主题,找load函数。(2) Load函数在0xC630的偏移ART模式下的修复就先不看了,有兴趣的朋友自己去看吧, libshell的代码流程再加上有log信息辅助,流程可以很清晰这里我大概说一下func_ShellFixDexMethod这个函数处理,详细的可以自己看下附件的libshell.idb吧。1. 通过/proc/(getpid)/maps 打开自身进程的内存映射,

10、查找classes.dex的内存地址。2. TX加固会把所有被加固过的Method的原始数据存一份在文件尾部。定位Method的原始数据存放地址的方法:原始数据偏移 = DexDataOff + DexDataSize有多少个Method需要修复 = (DexFileSize (DexDataOff + DexDataSize)/0x12每一个Method方法的原始数据是用一个0x12大小的结构来保存的,结构如下:typedef struct TXFixDexData DWORD dwClassDefItem; /Class_defs的索引id DWORD dwMethodIdx; /DexM

11、ethod结构里的methodIdx值 DWORD dwaccessFlags; /DexMethod结构里的dwaccessFlags值 DWORD dwDexCodeOff; /DexMethod结构里的codeOff WORD wProtoIdItem; /proto_ids的索引idTXFixDexData;3. 已经可以知道Method的原始数据,接下来就看怎么修复。关键就是要怎么定位到哪个Method是需要修复的。如果熟悉Dex结构的,应该就比较容易如何修复。我的修复方法:先通过Class_defs的索引id(TXFixDexData-dwClassDefItem)定位到需要修复的

12、Method所在的类,再取该类的所有Method,把每个Method的DexMethod-methoIdx值等于TXFixDexData-dwMethodIdx,就确定是需要修复的Method, 然后把该Method的DexMethod结构的accessFlags和codeOff修复就OK。下面修复TX加固的classes.dex的工具, 附件有Bin和Src,代码比较挫,大伙将就看下思路就行了:最后,把修复完的classes.dex放到apk,再反编译下,能看到被隐藏Method的代码回来了,但是还需要做一些扫尾的事,才能算完全脱壳成功。1.搜索一下所有smali文件的下面这一句代码,然后全部替换为空:invoke-static v0, v1, Lcom/tencent/StubShell/ShellHelper;-StartShell(Ljava/lang/String;I)Z2.删除掉AndroidManifest.xml这三个地方:a. b. android:fasten=meta-datac. 最后再重新打包APK,至此,脱壳完毕!PS:写文档真累人,比分析脱壳还累,写到后面

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 法律文献 > 国际贸易法

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号