Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试

所谓的动态调试其实是逆向的一种方式,一般逆向有两种方式,一种是静态分析,就是把dex转换为smali代码,或者dex转化为jar(.class)然后再转化为java代码。smali可以直接回编译而java则不行。
第二种就是动态分析,动态分析基于第一种静态分析获取的smali或者java源码来进行的调试分析。

名词解释:
smali是Davlik的寄存器语言,Davlik是android上的jvm实现。反编译出来的smali都是没有语法糖的,所以代码的逻辑可能与源码不太一样,反编译出来的java代码亦然,可以看到很多类似 for(;;) 的语法。Android Studio是谷歌基于社区版IntelliJ IDEA定制开发的android集成开发环境。DDMS是Android 开发环境中的Dalvik虚拟机调试监控服务工具。IdeaSmali是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码。


开始教程


1.获取smali代码

(1) 你可以使用apktool,android killer ,apkdb之类的工具反编译apk获取smali代码。
以apkdb为例,安装完apkdb后,右击apk选择【使用APKDB编译】
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享
(2) 在打开的对话框中直接敲回车开始反编译
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享
(3) 获得一个反编译后的文件夹,文件夹的名字和apk的名字一致
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享

2.Android Studio 导入smali代码

(1) 打开android studio ,点击菜单【File】-> 【new】-> 【import project】 在弹出的选择对话框中选择刚才反编译出来的文件夹,选中文件夹后弹出设置向导,一路点击下一步即可。
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享
(2) 点击菜单 【run】 -> 【edit configurations】打开运行配置对话框
点击左上角的【+】然后在弹出菜单选择【remote】,此时会新增一个remote配置,将配置中的端口号改成8700
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享

3.启用调试

(1)因为这个不是完整的android项目,所以studio菜单里没有显示android的调试工具选项,我们需要手动打开ddms工具。ddms存放在【sdk文件夹\tools\lib\monitor-x86_64\monitor.exe】,双击打开。
(2)现在我们需要修改下被调试的apk,再次反编译apk,然后修改清单文件 AndroidManifest.xml ,在 application 上新增一个属性 android:debuggable="true"
如下图,然后重新编译安装到手机上。只有包含debuggable="true"标记,app才能被调试,否则会报错。
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享
(3) 安装后手动打开app,这个时候ddms上应该能显示这个app的进程信息,手动选中。
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享


4.开始调试

(0) 为了看到项目中的smali代码,需要修改工程目录的组织方式,选则 project file
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享
(1) 在android studio中打开需要调试的smali文件,然后打上断点。
(2) 在android studio选则之前添加的remote配置,点击调试按钮开始调试
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享
(3) 让app执行到断点的代码,不出意外的话,会直接进入断点。
Android Studio&DDMS&IdeaSmali 实现Smali级别的动态调试-我的技术分享