吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 33268|回复: 30
收起左侧

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

  [复制链接]
qtfreet00 发表于 2016-1-15 12:20
本帖最后由 世事繁华皆成空 于 2016-1-16 15:00 编辑

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

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

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

QQ截图20160115112025.png

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

jd-gui效果:
QQ截图20160115113247.png
结构及其混乱,友好度非常低,简直无法直视

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

看看我们大杀器,jadx:

QQ截图20160115113542.png

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

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

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

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

代码结构如图
QQ截图20160115114032.png

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

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

QQ截图20160115114416.png

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

QQ截图20160115114700.png

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

QQ截图20160115114833.png


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

QQ截图20160115115250.png

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

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

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

QQ截图20160115115552.png

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

QQ截图20160115115642.png

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

QQ截图20160115120239.png

在这里我们看到了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的内容相同

QQ截图20160115120943.png

恢复后个结果如图

QQ截图20160115121932.png

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

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

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

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

jadx:https://github.com/skylot/jadx
test.zip (95.36 KB, 下载次数: 166)








免费评分

参与人数 12威望 +2 吾爱币 +3 热心值 +12 收起 理由
从0开始的小小怪 + 1 + 1 谢谢@Thanks!
52pojie61022109 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
siuhoapdou + 1 + 1 谢谢@Thanks!
redABC + 1 我很赞同!
xueyudon + 1 该顺便更新一下导航帖
挥汗如雨 + 1 我很赞同!
wnagzihxain + 1 猜notification那部分好评!!!
阳光下疗心 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
GodIand + 1 这么好的教程为何没有人评分,十分不解
ai枫 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.
spguangz + 1 我很赞同!
Ericky + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩.

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

刺蝴蝶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 来自手机
谢谢,学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表