基本技能-调试(android)
2017.12.23:写了一些基本的内容搭了一个壳子以及怎么使用apktool debug模式调试 apk
2017.12.31: 完成了IDEA 调试smali ,添加了一些坑,希望有生之年能填完。
一、 基本配置
1. 启用调试APP的调试属性
AndroidManifest.xml文件中的Application节点的属性中设置 android:debuggable=true (没有填写的情况下,允许调试)
二、 DDMS
我在安装完 IDEA后,已经有DDMS了。 Tools-> Android-> Android Device Monitor
部分调试相关的设置,位于Windows -> preferences
其他的一些功能,暂时并不了解。
三、 调试
1. Apktool/Shakaapktool 的 smalidebugging
1.1 使用方法
1. 将APK按debug模式解包
java -jar apktool.jar d -d -o source_dir file_Apk
2. 开启debug属性后,重新打包回去
Java -jar apktool.jar b -d -o new_apk source_dir
3. 重新签名apk,否则无法安装
Java – jar signapk.jar publickey.x509[.pem] privatekey.pk8 input.jar output.jar
4. 用java的相关IDE新建java项目,项目的根目录设置到debug模式下解包生成的目录下或者采用导入的方式导入。
5. 运行DDMS, 配置IDE中debug configuration,选择remote,端口号为DDMS中挂载的端口号。之后就可以正常的进行调试。
1.2 IDE
只要按照java调试的方法进行调试就好。所以只要支持java的IDE都是支持的。
1.2.1 IDEA
打开IDEA,导入之前apktool debug模式下的解包生成的源代码。
Import project
Create project from existing source
Next … Next .. Nect..
选择java 作为项目的SDK
Next… Finish.
配置debug设置, Run -> Edit Configuration
点击 + ,添加remote, 配置相关内容后,应用
之后在android中运行想要调试的程序,选择Run -> debug “添加的remote配置的名字”
挂上断点就可以调试了,如下图:
之后的调试操作与其他的没有什么不同。
1.2.2 Ecplise
与IDEA中的操作基本一致,以后会补充更新。或者可以查看参考。
1.3 说明
目前为止并不清楚apktool的debug模式下的原理,可以看到的是解包生成的smali后缀的文件全部变成了.java的文件,smali的原来的内容被写到了注释中且每一行代码为a=0(默认)。大致上猜测应该是为了与底层的代码在行数上保持一致,方便调试器在相应位置打入中断指令。
另外由于代码被转成了java来调试,所以在局部变量方面似乎没有办法进行跟踪,IDE中只有a=0的代码,那么调试中的类信息应当是来自于DDMS。目前并不清楚,DDMS会反馈哪些信息。
由于不能显示局部变量,所以在调试上终究有点束手束脚。
2. IDEA/Android Studio 调试smali代码
2.1 使用方法
1. Apktool / shakaapktool 解包APK
Java -jar apktool.jar d -o source_dir apk
2. 开启debug属性后,重新打包回去(若已经开启debug属性则不需要)
Java -jar apktool.jar b -o new_apk source_dict
3. 重新签名apk,否则无法安装
Java – jar signapk.jar publickey.x509[.pem] privatekey.pk8 input.jar output.jar
2.2 IDE
好像只支持IDEA和Android Studio,这两个处理android差不多。
2.2.1 IDEA/Android Studio
跟之前(smalidebugging中的IDEA的导入操作)一样导入项目,简单截图举例。
Ok
Next
Next
Next
完成导入操作。这里调试的文件和之前采用smalidebugging中的不一样,不再是.JAVA,而直接是smali。
接下来配置远程调试信息
在android虚拟机中启动应用(下图有或没有都不影响)
已经可以调试了,另外点击绿的小加号,可以查看/修改临时变量,在修改字符串的时候会比较蛋疼。
2.3 说明
现在应该大多采用这个方式进行调试了,能看到局部变量也能修改局部变量。最蛋疼的应该是修改字符串了,一位一位地改(估计原因可能和栈有关,大小有限制,为了保证程序执行不会出差所以在长度上要保持一致。这仅仅是一个猜测,我并不清楚。)。希望造轮子的人搞个插件出来,编辑字符串。
3. Smali插入日志输出
这种方法需要直接在smali中插入代码,我本人对于smali的语法比较陌生,看代码没什么问题,直接修改代码,也是照着别人的改还没去瞅瞅smali的语法。
一般应用场景下,应该是通过之前所述的方法,调试完毕确定了流程,插入代码用于打印出重要的信息,避免之后每次都需要挂到IDEA上调试,直接根据log日志进行判断。
四、 反调试
先挖个坑,有生之年系列。
五、 脱壳
先挖个坑,有生之年系列。
六、 参考
HowTo: Debug Android APKs with Eclipse and DDMS
http://blog.dornea.nu/2014/08/21/howto-debug-android-apks-with-eclipse-and-ddms/
查询到的许多资料,暂未记录
七、 遇到的坑
1. 参考:http://blog.csdn.net/geeker_12/article/details/46564453
2. SmaliDebugging has been removed in 2.1.0 onward. Please see: https://github.com/
iBotPeaches/Apktool/issues/1061
高版本的apktools已经不支持文中所述的方式了,只能下个2.0.x的用。另外我在编译git上的源码时,bug不断,似乎是baksmali.jar和smali.jar的版本(在更新过程中部分类的命名风格也变了)没对,总是有找不到方法的编译错误,到目前为止还没有编译成功。
3. Apktools不支持中文路径