本帖最后由 世事繁华皆成空 于 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版本,那估计就是这个了,直接看下后面对应的方法
[Java] 纯文本查看 复制代码 a(context.getString(R.string.is_running, new Object[]{context.getString(R.string.app_name)}))
这里引用了一个string值,目测就是设置标题栏了,用setContentTitle进行替换,果然,没问题,接着
[Java] 纯文本查看 复制代码 a((int) R.drawable.ic_notification)
又是一个图标,这里目测就是显示正文处的图标了,用SetSmallIcon替换,搞定
[Java] 纯文本查看 复制代码 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
test.zip
(95.36 KB, 下载次数: 166)
|