基本技能-调试(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. APKdebug模式解包

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, 配置IDEdebug 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 说明

目前为止并不清楚apktooldebug模式下的原理,可以看到的是解包生成的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

好像只支持IDEAAndroid 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.jarsmali.jar的版本(在更新过程中部分类的命名风格也变了)没对,总是有找不到方法的编译错误,到目前为止还没有编译成功。

 

3.     Apktools不支持中文路径

原文地址:https://www.cnblogs.com/alka1d/p/8094910.html