严正声明:
- 1、相关破解技术仅限于技术研究使用,不得用于非法目的,否则后果自负。
- 2、笔者仅出于对技术的好奇,无恶意破坏APP,尊重原开发者的劳动成果,未用于商业用途。
0x1、无形之刃,最为致命 => 碎碎念
上一篇文章《因一纸设计稿,我把竞品APP扒得裤衩不剩(上)》是一篇比较简单的:
- jsw => 技师文,呸,
- jsw => 记述文,呸呸,
- jsw => 技术文,呸呸呸,这什么垃圾输入法!
技术文,但是这评论区的风气,貌似有点不对/p>
顺带恭喜下:FPX 3-0 G2,喜提S9总冠军,FPX牛逼!!!破音!!!
- 发现 => 很多童鞋对APP逆向很感兴趣;
- 但是 => 上关于APP逆向文章的比较零散;
- 不知 => 如何入手,毕竟逆向的水可深了;
- 笔者 => 也只是个小白玩家,兴趣使然玩玩而已;
- 分享 => 目前会的一些「Android APP基础逆向姿势」;
- 还望 => 各位真丶逆向大佬轻喷;
- 如有 => 有更好的工具或者方法安利,欢迎评论区指出,谢谢~
顺带分享几个笔者常逛的逆向论坛:
- 看雪论坛:https://bbs.pediy.com/
- 吾爱破解:https://www.52pojie.cn/
- 蚁安 :https://bbs.mayidui.net/
- 逆向大佬姜维:http://www.520monkey.com/
贴心提醒:
此文内容较多,可能会有些枯燥,建议先点赞收藏,茶余饭后再慢慢品尝~
0x2、提莫队长,正在待命 => 硬件准备
在开始折腾Android APP逆向前,你需要:
① APK文件里都有什么/h3>
获取APK的渠道:酷安、应用宝,豌豆荚等应用市场下载,有些还提供「应用历史版本」下载。
APK本质上是一个「压缩包」,把「.apk后缀」改为「.zip后缀」后解压,可以看到如下目录结构 (可能还有其他文件):
② 编译APK和反编译APK
所谓的「编译」,就是把「源码、资源文件等」按照一定的「规则」打包成APK,官 提供了详细的编译构建过程图:
- 男子上进,努力工作,妹子贤惠,料理家务;
- 妹子每天做好饭菜,等男子回来,一起吃饭,满怀憧憬,畅谈以后的二人世界;
- 酒饱饭后,温饱思XX,不可描述一番,却被「居心叵测」的邻居给盯上了;
- 和往常一样,男子出门上班,妹子在家做家务,晾衣服;
- 邻居 上线,用「谎言」诱骗妹子开门,接而挤门而入;
- 用「暴力和胁迫」,无视妹子的やめて和反抗,违背个人意愿;
- 粗暴地把衣服一件件褪去,仅剩下那「万恶的马赛克」;
- 守护着最后的一处「绝对领域」;
- 在几番不可描述后,把妹子占为己有,然后像玩物般戏耍。
看着妹子「因情绪过激而身体抽搐」,哭得「梨花带雨」,不禁让人「心生怜惜」,像我这种感性的蓝孩子:
除了「同情女主」和「斥责坏人」外,应该如何避免这种事情的发生呢/p>
- 1、花点钱,请个「保镖」看门,坏人想进来要先过保镖这一关;
- 2、给妹子「加个锁」,让坏人无法不可描述,只能望而兴叹。
可以把例子中的「妹子」看做是我们编写的「APK」,而「请保镖」和「加锁的操作」则可以看做是「APK加固」,另外加固又称「加壳」,壳的定义:
一段专门负责「保护软件不被非法修改或反编译的程序」,一般先于程序运行,拿到控制权,然后完成它们保护软件的任务。
有「加壳」,自然也有「脱壳」,即去掉这层壳,拿到源码,也称为「砸壳」。
关于加固技术的发展,看雪上有篇:《一张表格看懂:市面上最为常见的 Android 安装包(APK)五代加固技术发展历程及优缺点比较》,不过图不怎么清晰,笔者重新排版了一下,有兴趣的读者可以看看:
加固虽然能在一定程度上「防止反编译和二次打包」,但加固后的APP可能会带来一些问题:
体积增大,启动速度变慢,兼容问题等
上「免费加固」方案有很多,脱壳教程也是烂大街,而且有些恶心的第三方加固还会给你加点料(360加固锁屏广告),而使用「企业级的加固」,则需要支付不菲的费用,所以很多APP直接选择了「裸奔」。先来讲解一下未加固的怎么获取源码吧~
① 未加固(笔者使用的工具:apktool + jadx)
- 使用apktool:获取「素材资源,AndroidManifest.xml以及smail代码」
- 使用jadx:把「classes.dex」转换为「.java」代码
使用Jadx的注意事项:
使用jadx-gui可直接打开apk查看源码,但如果APK比较大(classes.dex有好几个),会直接卡死(比如微信),笔者的做法是命令行一个个dex文件去反编译,最后再把反编译的文件夹整合到同一个目录下。
这样的操作繁琐且重复,最适合批处理了,遂写了个反编译的批处理脚本(取需):
执行前,你需要把apktool相关的东西,丢到jadx/build/jadx/bin目录下,如图所示:
静待片刻后:
按照自己的需要用Android Studio打开其中一个就好了:
- apktool目录:apktool反编译后的内容,主要用于smail动态调试。
- jadx目录:反编译成Java的内容。
② 反混淆(simplefy、Deguard)
代码是拿到了,但是打开代码,「一堆的abcd」,跟到眼花,可以试下「反混淆」,方案有两类,一种是通过「代码逆推」出名字,另一种是通过「统计逆推」出名字。
第一种方案的工具有很多(Jeb2,simplify等),前者付费需破解,Java版本有限制,Mac配置有点麻烦,故笔者用的是后者:「Simplefy」,Github仓库:https://github.com/CalebFenton/simplify,使用方法也很简单:
打开终端依次键入:
编译后完,执行下述指令即可反混淆APK:
静待反混淆完毕,接着反编译批处理脚本走一波,打开MapFragment比对下:
选择需要反混淆的APK后,Upload上传,接着等待处理完成,!!!别关页面!!!
大同小异,另外,反混淆并不能100%还原,而且还可能有些小错误,比如下面的代码:
虽说反编译后的可读性有所提高,但建议还是搭配着混淆的源码看。
③ 脱壳(FDex2,反射助手,dumpDex)
终于来到很多同学期待的脱壳环节,先说明下,笔者只是「工具党」水平,不会Native层的,so文件调试!如果本节的工具,你脱不出来,或者脱出来有问题,笔者也是爱莫能助。看雪有很多帮人脱壳的大佬,可以在上面发个帖子求助下~
只有这么一丢丢点东西,把「待脱壳应用」安装到手机上,接着用FDex2来脱壳
已Root玩家:XposedInstall启用FDex2插件重启后,按如下步骤脱:
- Step 1:FDex2选中待脱壳应用:
- Step 3:把整个目录拉到电脑上,这里直接用adb命令拉取:
- Step 5:使用jadx命令反编译dex,顺带改名,命名规则:按照文件大小降序,示例如下:
- Step 6:删掉没脱壳前反编译项目里的classes,把这几个复制到其中:
如果炮制,只是dex的路径有些不一样。
Step 2:点击中间的六芒星,弹出如下对话框,长按「写出DEX」
Step 4:pull到电脑上用jadx-gui打开看看:
4、dumpDex脱壳(Github:https://github.com/WrBug/dumpDex/releases)
官方仓库的README.md中有一句:
用jadx-gui打开这的dex,一堆这样的错误:
方法指令都被nop(零)替换了,工具党到这里就可以放弃了,要调试so文件。
Tips:本节用到的东西,都有给出比较官方的下载链接!!!你也可以到公
「抠腚男孩」输入000,回复对应序 下载,谢谢~
参考文献:
- Android打包流程
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!