查看原文
其他

Android逆向之动态调试

2017-02-07 闵海钊 计算机与网络安全

信息安全公益宣传,信息安全知识启蒙。

加微信群回复公众号:微信群;QQ群:16004488

加微信群或QQ群可免费索取:学习教程


要调试smali源码,是因为apk用apktool反编译之后,会生成一个smali的文件夹,这里存放了apk对应的smali源码。所以我们需要调试的就是反编译之后的smali源码,这里用到的调试工具是IDEA,用的示例是阿里CTF比赛中的一个题目。


获取smali代码

要调试apk的smali代码,第一步要获取反编译之后的smali代码,这里用的apktool这个程序。这个程序在这里先不细说,会再补充一个apk逆向常见工具使用的章节。利用下面这个命令获取到了apk的smali源码

apktool.bat d AliCrackme_01.apk

导入smali代码到idea中

获取到smali源码之后,第二步就是将源码导入的idea的程序,然后运行此smali代码进行动态调试。

需要将smali文件夹下的文件导入工程

以debug模式启动apk


导入smali程序到idea,apk安装到手机之后,然后就可以动态调试了。

在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am

启动的方法为:am start -n {包(package)名}/{包名}.{活动(activity)名称}

这里需要加-D这个参数,表示enable debugging

程序的入口类可以从每个应用的AndroidManifest.xml的文件中得到。

利用apktool除了可以得到smali代码,还可以得到一个非常重要的文件,相当于是apk的配置文件AndroidManifest.xml,从此文件中可以得到包名和活动名,此apk的包名是com.example.simpleencryption,主活动名是MainActivity,所以可以用

adb shell am start -D -n com.example.simpleencryption/ com.example.simpleencryption.MainActivity来启动程序,也可以将后面的包名省略用

adb shell am start -D -n com.example.simpleencryption/.MainActivity

来启动程序。成功启动后,如下图所示。


配置调试选项

既然是动态调试,肯定要查看程序的端口,这里用ddms这个程序查看即可,DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。


打开ddms查看端口信息,ddms都是以apk的包名显示程序的,这里可以看出需要调试的apk监听了8618端口。


下一步就是添加远程调试了,在idea的运行->编辑结构


添加一个新的远程调试,端口要和ddms的对应,修改为8618,名称就写smali即可。

Attach

远程调试配置完成后,就可以调试smali代码了,点击调试


出现下图表示成功,idea提示connected,ddms的小蜘蛛由红色变为绿色,apk程序进入到正常的登录界面。




在关键地方下段

程序输入密码,然后再点击登录,在点击的过程中会会发onClick函数,所以在onClick函数处下断,左击一次左边的空白处即可。

在apk中输入测试密码qqqq,然后点击登录


发现已经运行到断点处,并在idea的下方看到变量值


idea跟OD的使用基本类似,F7步入函数,按F8步过,

在程序的右下角还可以添加监视变量,这个对我们分析程序时非常方便的。

我们添加监视v3、v5、v2、v4



通过table、pw、enPassword的变量发现,table是密码表,pw是真正的密码,enPassword是输入的密码

重新在登录的窗口处输入123456789,得到数字与密码表的对应获得密码


▼ 点击阅读原文,查看更多精彩文章。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存