Android动态调试

本文最后更新于:2020年3月11日 晚上

Android动态调试支持

  • dalvik实现了JDWP(Java Debug wire Protocol,Java调试有线协议),可直接使用支持此协议的调试器来调试Android程序。
  • dalvik为JDWP的实现加入了DDM(Dalvik Debug Monitor,Dalvik调试监视器)。具体的实现有DDMS(Dalvik Debug Monitor Server,调试监视器服务)和Eclipse ADT插件。
  • 系统属性ro.debuggable为1时所有程序都会开启调试(adb shell getprop ro.debuggable检查),若为0,则会判断AndroidManifest.xml中的debuggable属性。

DDMS的使用

Logcat、文件浏览、Method Profiling等。

Logcat视图相当于adb logcat -s com.droider.jnimethods:V

1
adb logcat -s TagName:Type

定位关键代码

代码注入法

通过Log输出定位关键代码,甚至破解程序。

栈跟踪法

1
2
3
4
5
6
7
java代码:
new Exception("print trace").printStackTrace();
smali代码:
new-instance v0, Ljava/lang/Exception;
const-string v1, "print trace"
invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V

栈跟踪信息是WARN级别的log

Method Profiling

相当于Ollydbg的trace功能,跟踪信息。

通过方法设置跟踪的开始和停止:

image-20200311221443847

smali代码如下:

image-20200311221616231

此方法会在文件下生成trace文件,可以使用SDK目录下的traceview工具打开,使用此方法还需要有SD卡写入权限。

IDA调试原生程序

1
2
3
4
5
6
7
启动android_server文件
转发端口 adb forward tcp:23946 tcp:23946
设置等待调试 adb shell am start -D -n 包名/类名
IDA attach进程
jdb附加 jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
列出进程 ps -aux
杀死进程 kill -s 9 PID (其中-s 9 制定了传递给进程的信号是9。强制、尽快终止进程。)

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!