Android腾讯应用加固的脱壳分析和修复
更新时间:2023-10-07 09:42:01 阅读量: 综合文库 文档下载
- 腾讯云应用加固推荐度:
- 相关推荐
[Android]腾讯应用加固的脱壳分析和修复 By ZzAge 0x1:
腾讯云加固:http://www.qcloud.com/product/appup.html
加固示例原版APK:http://pic.hzt360.com/downfile/beijing/elechongNFC.apk
a,首先,看一下原APK和通过腾讯云应用加固后的文件相关变化
加固后的文件列表变化: 新增2个so文件: libmain.so libshell.so 修改:
AndroidManifest.xml classes.dex
b, 用ApkTool反编译加固后的APK, 出现反编译不过去,错误日志如下: 1.通过下面日志能看出来是apktool解析AndroidManifest.xml时出错,注意绿色下划线的name=fasten,这里TX加固是利用android系统解析axml的一个特点来导致apktool反编译时,在解析AndroidManifest.xml时出错。
关于利用AndroidManifest.xml这块的技术点可以参考一下万抽抽大神的文章:http://www.cnblogs.com/wanyuanchun/p/4084292.html
2.下面来分析和修复AndroidManifest.xml
分析前,还是得先了解一下AndroidManifest.xml的二进制格式,可以参考下列文章: AndroidManifest二进制文件格式分析 http://bbs.pediy.com/showthread.php?t=194206
辅助分析AndroidManifest.xml的二进制格式可以使用下面的: AXML的010 Editor模板
https://github.com/strazzere/010Editor-stuff/tree/master/Templates
利用axml模版在010Editor解析AndroidManifest.xml能看到,有一个属性结构的name成员的值是25, 该值指向是string的索引,同时也是res ID的索引。 属性结构:
String索引:
Res ID 索引:
为什么这样做,哈哈哈,我懒,所以直接截图引用万抽抽大神的解释:
嗯,属性结构的name成员的值是即是string索引,又是ResID索引,所以: Name=25
String[25]=fasten
ResIDs[25]=0x01017FFF
再次引用抽抽大神文章里的一段话:
Android系统在解析AXML的属性的时候,是通过该属性的res id号而非属性名定位的。所谓的AXML就是AndroidManifest.xml对应的二进制文件,APK包中存储的就是AXML。比如属性:
所以fasten这个字符串可以随意改,关键还是ResID的值,TX加固对AndroidManifest.xml处理,是插入一下非法的属性ID (在Android的attr里没有一个ID为0x01017FFF),因为是非法的属性ID,Android是不会去解析,但ApkTool却会去解析,所以导致反编译出错了。 修复方法: 知道怎么回事,修复起来就很简单了,只要把非法的属性ID=0x0101FFFF改成一个合法的属性ID,比如把0x0101FFFF改成name的属性ID=0x01010003,然后再把修改后的AndroidManifest.xml再替换加固后apk里的AndroidManifest.xml,然后用apktook就可以顺利的成功的反编译出来。 附件有我用官网最新版的ApkTool 2.0.0 RC3源码编译,修改了一下,修复非法属性ID无法反编译。如果懒得手动去修改AndroidManifest.xml,可以直接用我这个修改过的apktool进行反编译。 反编译后,看加固修改后的AndroidManifest.xml和原版的AndroidManifest.xml多这三条: 1. 3. a,ApkTool反编译可以成功,那接下来看一下TX加固是怎么对Dex进行加密的 1. 新增了2个smail文件 com\\tencent\\StubShell\\ProxyShell.smali com\\tencent\\StubShell\\ShellHelper.smali 2. Smail代码的变化(对指定方法进行加密) 从截图能看到,加固后的dex,通过apktool反编译后的smali代码变化。 (1) 新增静态代码块: (只要加载此类,就会先执行该代码块,作用是用来动态恢复被加固的方法) .method static constructor const-string v0, \const/16 v1, 0x0 invoke-static {v0,v1},Lcom/tencent/StubShell/ShellHelper;->StartShell(Ljava/lang/String;I)Z return-void .end method 用JEB转成代码如下: static { ShellHelper.StartShell(\ } (2) 原始方法: .method public constructor .method public native constructor 被加固后的Method数据: 从这里能看到关键是在StartShell函数,这个StartShell函数专门负责在执行时动态恢复被加固的方法,TX加固这种方式没办法直接通过dump来进行脱壳,它机制是需要运行到某个类,加载这个类时才会修复一下该类被加固的方法,但你又不能保证所有类你都能执行到,所以还是得找原始数据来进行修复dex。 public static booleanStartShell(String packageName, intiIndex) 从StartShell函数第二个参数iIndex来看,应该是要修复那个函数的编号。所以,可以猜测肯定会有一份原始的数据供给修复,所以从StartShell函数入手,就能找到修复的原始数据。 StartShell函数会先判断如果没有初始化过则执行InitProxyShell函数,InitProxyShell函数作用其实就是加载libshell.so, 最后,调用libshell.so的load(ShellHelper.strPackageName, iIndex);来进行修复,这里调用具体过程就不说了,哈哈,TX加固还有log可以看,方便大家理思路,大家想了解自己可以去看看,。 从这里能看到,关键是libshell.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 打开自身进程的内存映射,查找classes.dex的内存地址。 2. TX加固会把所有被加固过的Method的原始数据存一份在文件尾部。 定位Method的原始数据存放地址的方法: 原始数据偏移 = DexDataOff+DexDataSize 有多少个Method需要修复 = (DexFileSize– (DexDataOff + DexDataSize))/0x12 每一个Method方法的原始数据是用一个0x12大小的结构来保存的,结构如下: typedefstructTXFixDexData { DWORDdwClassDefItem; //Class_defs的索引id DWORDdwMethodIdx; //DexMethod结构里的methodIdx值 DWORDdwaccessFlags; //DexMethod结构里的dwaccessFlags值 DWORDdwDexCodeOff; //DexMethod结构里的codeOff WORDwProtoIdItem; //proto_ids的索引id }TXFixDexData; 3. 已经可以知道Method的原始数据,接下来就看怎么修复。关键就是要怎么定位到哪个 Method是需要修复的。如果熟悉Dex结构的,应该就比较容易如何修复。 我的修复方法:先通过Class_defs的索引id(TXFixDexData->dwClassDefItem)定位到需要修复的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)Z 2.删除掉AndroidManifest.xml这三个地方: a. 最后再重新打包APK,至此,脱壳完毕! PS:写文档真累人,比分析脱壳还累,写到后面都不知道自己在写什么,文章比较乱成浆糊,可能也有一些东西没说到,见谅,因为我已晕死… 最后,提前预祝一下大家春节快乐!!!
正在阅读:
寻找罗含的湘中记11-19
杭州 陈氏太极拳练和养 - 图文05-01
汕头礼仪、汕头标识,首选联谊礼仪标识06-03
2014课改总结文档01-29
《民俗文化中的牛》阅读附答案04-27
关于歌颂党的作文题目03-12
赛尔公司爆炸物品管理规定(DOC)04-02
航空气象复习题(2010年1月)11-30
ADAMSView基础 - 图文12-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 脱壳
- 腾讯
- 加固
- 修复
- Android
- 应用
- 分析
- 2017-2023年中国轧辊钢行业市场发展现状及投资前景预测报告(目录)
- 一年级心理健康教案
- 几何光学
- 花园自动灌溉系统
- 专业觉醒是发展的前提
- 银行排队叫号系统软件需求设计说明书
- 早会流程
- 基于光电传感器的直流电机转速测量系统设计-课设报告 - 图文
- 浅谈数学课堂教学如何激发学生的学习兴趣
- 神华神东电力公司神木店塔电厂2 - 660MW工程
- 120个重点文言实词及例句翻译
- xx县公安局指挥中心2011年工作总结及2012年工作计划
- 全国郭氏字辈大全,郭家人快收藏(贵州、云南、山西、河北、陕西)
- 统计学考查试卷(DZ财务10)12-13-1
- 市政工程工程量清单项目及计算规则
- 高压钠灯与LED植物灯的对比 - 图文
- 自编路基填筑方案
- 《传感技术》期末试卷AB(含答案)
- 水电监控及通信监督标准规程目录(2016)
- 管理信息系统期末复习 - 图文