首页
社区
课程
招聘
[原创]阿里聚安全技术分享之APK无源码调试
2014-12-18 14:42 59386

[原创]阿里聚安全技术分享之APK无源码调试

2014-12-18 14:42
59386

前言
这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。静态分析越来越不靠谱了,apktool、ApkIDE、jd GUI、dex2jar等等等等已经无法满足大家的需求了。那么问题就来了,小伙伴们真正需要的是什么?好的,大家一起呐喊出你内心的欲望吧,我们的目标是——“debug apk step by step”。
那些不靠谱的工具
先来说说那些不靠谱的工具,就是今天吭了我小半天的各种工具,看官上坐,待我细细道来。
IDA pro
IDA pro6.6之后加入了dex动态调试功能,一时间普天同庆、喜大普奔。兴奋之后你才会发现IDA这东西在动态调试方面真的是很挫,就算他是静态反编译之王,我也不得不说他的动态调试功能还非常需要加强。先说说使用ida调试dex的方法。
IDA pro调试dex流程:
1.        用apktool反编译apk,添加android:debuggable=”true”,重打包apk并签名
2.        从apk文件中扣出class.dex文件,不管你用什么方法,7zip、unzip…whatever
3.        用ida打开这个dex文件,直到output window窗口显示“xxxx finished”
4.        设置debugger选项,debugger->debugger options->set specific options,按如图1所示进行设置,然后一路确定返回
5.        找到要下断点的位置,光标移到要下断点的那一行,按f2下断点
6.        手机开启调试选项,链接usb到电脑
7.        选中IDA pro窗口,按f9走起,不出意外的话应该会出现如图2的画面,成功啦~

图 1 ida debug配置

图 2 ida动态调试apk
触发断点,在watch view和Locals窗口都能看到内存变量的值,简直就是画美不看啊,是不是有点小兴奋?!我只能说高兴的太早了,小伙伴们还是太天真了,仔细观察下,就算你勾选了“Hex display”,你还是无法以hex格式显示变量的值,就是说不可显示字符你都看不到值是什么,而且我找了很久也没找到类似windbg、od、vc6、gdb、lldb那样以各种姿势或者命令直接查看某内存地址值的功能,然后就出现了如图3的画面……WTF!我特么忙活了半天居然还不如直接logcat来得痛快!

图 3  Locals窗口
apktool+eclipse
其实小生一直还是很支持eclipse的,毕竟伴我度过了无数不眠之夜和懵懂的年华(当然苍老师和windbg可能占的更多),可是这次我真的有点小失望哈。由于使用apktool+eclipse和apktool+android studio的调试方法跟apktool+idea一样,调试方法后面一起说,这里我就纯吐槽了先。
当小伙伴们成功设置调试选项,带着嗨翻的心情进入调试界面的时候,我们看到了如图4的画面,细细观察和各种尝试之后,我保证你的心里一定有一万头草泥马奔腾而过!!!。

图 4 eclipse单步调试apk
我们都看到了啥:
        debug窗口表示命中第30行的断点
        variables窗口没有任何本地变量的值,寄存器的值也没有
        单步步入、单步步过等调试按钮都是灰色的,快捷键F5678都没反应
我就想知道这你让我怎么debug,难道我要设无限个断点,拼命f9来调试?就算是这样,我该去哪儿看变量的值?
apktool+android studio
android studio这个东西本来是蛮不错的,就是稍微有点卡,习惯了也还好。其实android studio本身就是用idea改的,但是好像给改挫了。调试方法还是后面再说,直接上成功挂载到调试界面的图,如图5。

图 5 android studio单步调试apk
这次情况是这样的:
        可以看到现在程序停在哪一行,虽然不明显
        本地变量能看到,但是寄存器还是木有啊
        单步按钮还有单步快捷键都能用了,看起来好多了啊
我还是想说,问题是寄存器的值还是没法直观的看到啊,对于有强迫症的我还是无法接受这种设定啊,想当年vc6、od、windbg、gdb、lldb是多么的给力,多么的好用!
apktool+idea
正菜来了,apktool 2.0bete9版本推出了-d选项,专门用来重打包apk进行单步调试的,给力!apktool+idea无源码debug apk step by step简直不要太好用,这也是我跟小波请教之后才弄好的,这个选项也是小波等人建议apktool作者这样做的,不禁感叹一句,波神你为何这么屌!
3.1调试基础
本小节内容引用自看雪论坛@火翼[CCG]的文章,原文链接:
http://www.kanxue.com/bbs/showthread.php?p=1291716
根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:
1.        apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
2.        /default.prop中ro.debuggable的值为1
由于正常的软件发布时都不会把android:debuggable设置为false(当然也不排除某些很2的应用偏偏就是true),所以要达成条件1需要对app进行重新打包,这不仅每次分析一个apk都重复操作,而且很多软件会对自身进行校验,重打包后执行会被检测到,所以想办法满足第2个条件是个一劳永逸的办法。
由于default.prop是保存在boot.img的ramdisk中,这部分每次重新启动都会重新从rom中加载,所以要到目的必须修改boot.img中的ramdisk并重新刷到设备中。修改步骤如下(我没试过,有兴趣的倒腾下):
1.        从Google官方网站下载到boot.img
2.        使用工具(abootimg,gunzip, cpio)把boot.img完全解开,获取到default.prop
3.        修改default.prop
4.        把修改后的文件重新打包成boot_new.img
5.        使用fastboot工具把boot_new.img刷入设备(fastboot flash boot boot_new.img)
3.2调试方法
这里我们还是用第一种方法来进行测试:
1.下载apktool2.0b9版本,下载地址:
http://connortumbleson.com/2014/02/06/apktool-2-0-0-beta-9-released/
2.使用apktool反编译apk:
java -jar apktool_2.0.0b9.jar d -d xxx.apk -o out
加上-d选项之后反编译出的文件后缀为.java,而不是.smali,每个.java文件立马都伪造成了一个类,语句全都是“a=0;”这一句,smali语句成为注释,小伙伴们自己看看打开就知道了,做这些都是为了后面欺骗idea、eclipse、android studio这些ide的;
3.加入android:debuggable=”true”选项;
4.重打包apk,一定记得也使用-d选项:
java -jar apktool_2.0.0b9.jar b -d out -o debug.apk
5.对apk进行签名并安装apk到调试设备(这个不用我说怎么操作吧);
6.下载安装并打开idea,新建一个空的java项目,本例中项目名为“DebugOnly”,将apk反编译后的smali目录下的所有文件拷贝到刚才新建的java项目的src/目录下,刷新,如图6;

图 6 拷贝文件

图 7 命令运行效果
此时在调试设备上会显示等待调试器接入:

图 8 调试设备状态
8.从android device monitor上发现需要调试的程序已经显示在列表里面了,记下端口号,本例中为8700;

图 9 android device monitor
9. 新建远程调试:依次点击run-> edit configuration->“+”号->Remote,选中第6步中新建的项目,填写第8步中获得的端口号,如图10;

图 10 debug设置
10.找到相应位置设置断点(在想设断点的位置前后多设置几个断点),点击run->debug->unnamed,其中unnamed是第9步中新建的远程调试的名字;

图 11 远程调试名字
11.不出意外的话,小伙伴们应该能看到如图12所示的画面,恭喜你,已经成功了!此时此刻兴奋之情简直能以言表哈~good luck! have fun! enjoy~

后语
另外,阿呆曾经提到一篇文章用jdb远程调试android程序的文章,链接为:http://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/,我没有尝试过,主要是我比较懒,用apktool+idea已经够用了,就没去倒腾,有兴趣的小伙伴请自行倒腾,别忘了分享!
最后,其实我也不确定ida是不是真的不能以hex格式显示变量值,或许是我不会用ida咧;我也不确定eclipse到底能不能看寄存器的值,单步按钮和快捷键到底能不能用,或许是我eclipse版本的问题咧;我也不确定android studio到底能不能看到寄存器的值,或许是我android studio版本的问题咧,再或者我用的调试设备有问题咧,再或者我的脸有问题咧……以上问题,如果哪位小伙伴知道怎么解,跪求告知!

阿里聚安全jaq.alibaba.com是面向开发者,以移动应用安全为核心的开放平台,主要功能包括:恶意代码检测漏洞扫描安全组件应用加固仿冒监测

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

最后于 2019-9-27 10:33 被kanxue编辑 ,原因:
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (27)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
QEver 5 2014-12-18 14:50
2
0
图呢~~~
而且能重打包的话,还用什么调试啊,随便搞就行了
雪    币: 159
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
PEYlxZ 2014-12-18 14:56
3
0
我能看到图啊
雪    币: 188
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
JackJoker 2014-12-18 14:57
4
0
楼主厉害,学习。
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OnlyEnd 2014-12-18 15:02
5
0
Netbean结合Apktool调试apk 也是可以看到寄存器值的。
雪    币: 159
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
PEYlxZ 2014-12-18 15:34
6
0
来一篇文章吧
雪    币: 25
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Zeusnet 2014-12-18 15:43
7
0
我用eclipse记得好像也是可以看到值的啊,不过有段日子了,不太确定,NetBean是肯定可以的
雪    币: 107
活跃值: (311)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Fido 2014-12-18 16:41
8
0
强势插入....顶撸主....
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Maiunjour 2014-12-18 17:01
9
0
新手 跟着学习啦!:)
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OnlyEnd 2014-12-18 17:28
10
0
Google吧
雪    币: 88
活跃值: (131)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
chenwitch 2014-12-18 19:27
11
0
netbeans不需要那么复杂的设置,可以看变量,还可以改变量,堆栈所指的代码处都可以看变量。eclipse对那种混淆得比较厉害的apk,error太多,跑不起来
雪    币: 1675
活跃值: (594)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
djxh 2014-12-20 17:14
12
0
试了一下,好像只能对启动的activity的.java文件代码下断点呀,楼主,如果要在别的文件里下断点,要如何操作呢?
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jikefeng 2014-12-24 09:50
13
0
这年头,apk全都是加密啊,加壳啊,反调试啊,小伙伴们表示已经不能愉快的玩耍了。
雪    币: 7
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Hippocrate 2015-1-23 12:26
14
0
boot.img在哪里下载,找不到
雪    币: 163
活跃值: (1288)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
学编程 1 2015-2-3 17:59
15
0
这个能看到p0,p1,p2的变量吗?
界面看起来和apktool+netbeans差不多。
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
天易love 18 2015-2-3 18:57
16
0
ida当然可以显示bad type,而且还可以改内容。只要打开watch view窗口,然后add watch,输入(int)v0 或(String)v0,刚学也就知道这点。
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flyworm 2015-2-11 09:38
17
0
为什么我用eclipse和netbeans都加不上断点啊,是不是要把smali先转成java再调啊,请大神指导一二。
雪    币: 216
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
potop 2015-2-12 13:08
18
0
1、用IDA6.6,出现 "the file can't be loaded by the debugger plugin ",不知什么原因?
上传的附件:
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pqqop 2015-2-13 15:17
19
0
好久没来了~ 冒个泡!
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
garysunny 2015-2-26 17:27
20
0
jaq.alibaba.comjaq.alibaba.comjaq.alibaba.comjaq.alibaba.comM艾瑞克
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
elianmeng 1 2015-4-23 17:31
21
0
mark一下
雪    币: 111
活跃值: (113)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
Tensm 1 2015-4-27 11:03
22
0
就算源码也有调试的必要
雪    币: 723
活跃值: (1261)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
skyun 3 2015-4-27 15:56
23
0
正解
雪    币: 147
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fanweiriu 2015-4-30 09:11
24
0
太棒了  我一直都是插代码打log的
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiiiiao 2015-9-10 14:19
25
0
楼主,对于动态载入的类有没有解决的办法,我把加载的.jar pull了出了,反编译成smali跟别的代码放到一起,但是断点始终进不去
游客
登录 | 注册 方可回帖
返回