qtfreet00 发表于 2016-1-15 12:20

吾爱破解安卓逆向入门教程(八)---java分析工具jadx,jeb双管齐下

本帖最后由 世事繁华皆成空 于 2016-1-16 15:00 编辑

原帖名为:是时候该了解下jadx了,记一次proguard混淆的app的整理笔记
个人觉得这个也偏于基础,就列为第八课吧

样本是一个不错滴可用于逆向分析时的app,叫做当前Activity,开启后可以实时显示当前运行应用的活动名和包名,当时开始整理这个App代码的起因就是了解下这个app到底如何实现这个功能的

还有个关键的原因是他非常的小,才0.1M,相信代码量也不会大,本文呢,主要是面向一些有开发基础和分析经验的小伙伴,因为不涉及native,所以难度也不大



那既然本文标题中说道是时候该了解jadx了,那jadx又是什么鬼,众所周知,在我们把smali转成java源码时通常是借助d2j+jd-gui,或者是jeb1,这两个软件都有各自的优势和缺陷,前者反编译能力较弱,抗干扰能力很弱,对于一些嵌套循环的反编译展示能力很差,后者反编译能力极强,能够代码跟踪,添加备注,方法重命名等等,相对于jd-gui,代码逻辑性较强,比较友好,但也许是因为是老版本的缘故,毕竟新版依然是2.0,部分情况下,jeb的代码结构有点烂,其次变量名不友好,都是以v0,v1_1这样展示的,需要手动修改,不太方便,那这个时候就出来一个jadx了,我们直接对比下

jd-gui效果:

结构及其混乱,友好度非常低,简直无法直视

jeb1效果:

goto是什么鬼,在java中早已摒弃了goto关键字,在c中,goto也是非常不推荐使用的,虽然逻辑感还不错,但在恢复工程时,就有点头疼了

看看我们大杀器,jadx:



强大的逻辑性,对于需要分析app的人员来说,这简直太TM棒了,优雅的代码展示效果,有意义的变量名,让人一看结构就非常清晰,然而

jadx也是有不少缺陷的:
1:稳定性不够高,依赖于jre,在反编译大型apk时,容易假死和崩溃
2:不支持中文unicode显示
3:抗干扰能力也一般,如下图


所以在分析app时,我通常的做法是jeb+jadx双管齐下

那今天主要的内容是如何恢复这个app工程

代码结构如图


很显然,作者在编译时已然选择了proguard进行混淆,proguard在默认情况下会将非四大组件(Activity,Service,Broadcast,Content Provider)的类进行重命名为abcd这类无意义的字母,从而增大app的逆向难度

这次就是要同时使用jadx和jeb工作在恢复工程,最终的展示效果



首先,当然是需要使用Android Studio来新起一个工程,如果你还在使用Eclipse开发安卓的话,就out拉,然后我们逐步对类进行恢复



我们首先要做的就是对逐个变量进行重命名,jeb派上用处了,如下图




然而我们发现在下方getBoolean处显示的是2131034112,这显然是个索引值,可以在R.java中找到,但这样就浪费了我们查找的时间,我们看看jadx



jadx在反编译时就已经帮我们查找到每个对应的索引,这个时候观察起来就非常的直观

整个恢复过程,我们需要做的就是将jeb中的每个资源文件,Manifest文件拷贝到新的工程中,基本没有什么需要修改的,准确性很高,我们主要需要做的就是理解代码作用,整理代码

这个工程没有什么难度,我挑一个这里面最难的进行分析



在分析的过程中在广播类中我们看到了一个av类,这个类引用自v4兼容包,跟踪之后



发现这里面也已经全部被混淆,这个时候只能根据自己的经验判断了,在代码中我们看到实例化了NotificationManager类,那声明了这个,就一定有一个与之对应的Notification类要出现,但我们发现,常规的Notification是引用自import android.app.Notification; 显然于我们看到的是不符合的,这个时候就需要我们去“猜”了,我们来到app文件夹下,观察是否有类似的方法



在这里我们看到了NotificationCompat类,这是一个兼容类,可以适用于较大跨度的api版本,那估计就是这个了,直接看下后面对应的方法

a(context.getString(R.string.is_running, new Object[]{context.getString(R.string.app_name)}))

这里引用了一个string值,目测就是设置标题栏了,用setContentTitle进行替换,果然,没问题,接着

a((int) R.drawable.ic_notification)

又是一个图标,这里目测就是显示正文处的图标了,用SetSmallIcon替换,搞定

b(context.getString(R.string.touch_to_open)).b(-1960480).c(-1).a(!z);


剩下的一起丢上来,b方法调用了一个string值,那应该就是正文内容了,毕竟在观察原版app的时候,正文就是显示的一个固定字符串,不放心的也可以去看下touch_to_open对应的字符串是否与原版app的内容相同



恢复后个结果如图



基本上只要理清了所有的调用关系和逻辑关系,就能够将工程恢复出来,当然只是时间问题了

一个有意义,直观的方法,内容可以很好的帮助我们分析程序,比如在分析木马时就可以很好的理解其具体的作用

最后奉上完成工程和jadx地址

工程:https://github.com/Qrilee/WatchActivity

jadx:https://github.com/skylot/jadx









刺蝴蝶De箫启灵 发表于 2016-1-15 13:57

前排出售瓜子,西瓜,可乐,泡泡糖,槟榔,有需要的给我加分。立马送到!

windwing1883 发表于 2016-1-15 16:11

支持楼主,比较基础,适合入门

hellokits 发表于 2016-1-15 19:49

不是呵呵 发表于 2016-1-16 16:11

很久没有看到你了

smile1110 发表于 2016-1-16 22:46

敢不敢快点更新呢,再拖更打死你丫的

cpwinner 发表于 2016-1-17 11:43

谢谢分享,学习了

Hmily 发表于 2016-1-19 00:38

居然更新了,明天推送一下,下次主动发我下,方便我及时推送。

449219454 发表于 2016-1-20 10:54

学习了,赶紧看看.

dai55555 发表于 2016-1-20 19:21

谢谢,学习了
页: [1] 2 3 4
查看完整版本: 吾爱破解安卓逆向入门教程(八)---java分析工具jadx,jeb双管齐下