Android下binary级的一些分析调试方法

来源:互联网 发布:儿童字帖软件 编辑:程序博客网 时间:2024/05/16 18:56

原文地址:http://blog.csdn.net/jinzhuojun/article/details/18080871

 

有源码的情况当然好办,但没有源码想调bug或者想逆向怎么办。本文列举了Android下binary级的一些分析调试工具和方法。

 

Logcat:

很多时候logcat中找不到直接答案,但其中往往能得到继续分析的方向。logcat默认啥都输出在一起,合理用loglevel和filter来使输出更加易读。

参考:

http://developer.android.com/tools/help/logcat.html
http://developer.android.com/tools/debugging/debugging-log.html

 

Java层静态分析

有两种方法:一种是用unzip解压apk包后用dex2jar(http://code.google.com/p/dex2jar/)和jd-gui(http://jd.benow.ca/)逆向成类似Java源码的形式,但毕竟是逆向出来的,经不起细看。有些部分还会出现错误逆向不出来。总体来说适合略读缩小范围。另一种是用Android apktool(http://code.google.com/p/android-apktool/)。这样解压出来的资源和配置文件更可读。如AndroidManifest.xml是可读的,而不像前一种方法解出来是乱码。同时java的代码是smali code形式。smali code比逆向出来的东西更准确,适合精读。

apktool的好处是解压完了还可以压回成apk。有时候应用里其实是有个全局变量(比如叫enable_debug的布尔变量)控制着调试输出的。只要先解压,在smali code中把它设为true,再重新打包回去就能在logcat里看到输出了。注意改了之后打包回去后需要签名http://blog.csdn.net/jinzhuojun/article/details/7654835,否则安装会出错。

参考:Android中apk包的反汇编( http://blog.csdn.net/ariesjzj/article/details/7311340)

 

Java层动态分析:

jdb可以设断点,改变量,查看类信息等等。

参考: Android下的JDB调试 (http://blog.csdn.net/jinzhuojun/article/details/7399249)

 

Native层静态分析

自然是Binutils套件了,如objdump,readelf等都是利器。For arm版的在Android源码的prebuilts目录中,嫌大也可以单独下。

 

Native层动态分析

gdb:不解释,码农界永远的神器。参考: Android下用gdb进行系统级源码调试(http://blog.csdn.net/jinzhuojun/article/details/7375048)

像Mono这样的JIT引擎会动态生成代码,而这些动态生成的代码用静态分析手段是看不到的。但可以用gdb来看,用disassemble或x/ni命令等。

有时候程序一起来就隔儿掉,这时可以用双调试器调试法。先用jdb停住(配合Settings->Developer Options里的Wait for debugger选项),用gdb连上设好断点,再在jdb里继续。参考: Android下双调试器(gdb+jdb)调试应用程序(http://blog.csdn.net/ariesjzj/article/details/7402832)

 

另外一些动态分析工具 

Android作为一个Linux为内核的系统,自然在Linux下的那些动态分析工具大多都能用。如strace可以监视系统调用(如open, mmap等)和信号。tcpdump可以截获网络传输数据等。

/proc/pid/目录下提供了该进程丰富的OS级运行时信息,如maps文件显示进程的虚拟地址空间映射信息,status有内存使用等信息,cmdline和exe可以看到该进程对应的执行文件。net, fd, task目录分别可以看网络,文件,线程信息等。

/data/tombstones/:程序由于错误退出后的“墓碑”,里面记录着程序的“死相”。



Android自带的分析调试工具

Settings->Developer Options:里面有一坨调试分析工具。像显示触摸点坐标和显示应用Layout等功能,都是很实用的。

SDK中的tools/monitor,以前叫DDMS,里面可以看内存,线程,网络等信息,还包括了截图等实用功能。参考:

http://developer.android.com/tools/debugging/ddms.html 

http://developer.android.com/tools/debugging/debugging-memory.html

dumpsys 命令不仅可以输出很多系统信息(如硬件参数等),后面加service名(如SurfaceFlinger)还可以看service的运行时状态。

Dev Tools App包含了一些调试分析功能,其实很多都被移到Developer Options里了。参考: http://developer.android.com/tools/debugging/debugging-devtools.html

Android Emulator:优点是从模拟硬件到API实现都可以改。缺点是arm版本慢且OpenGLES支持稍差,所以不少游戏不能跑。x86版本由于可以虚拟化会快些,另外打开gpu on还可以使用host上的gpu来提高gpu性能。

SDK中的hierarchyviewer可用于分析UI。参考:http://developer.android.com/tools/help/hierarchy-viewer.html

 

性能分析工具 

都是profiling工具:

systrace,参考:http://developer.android.com/tools/help/systrace.html

Traceview,参考:http://developer.android.com/tools/debugging/debugging-tracing.html

Oprofile,参考:http://blog.csdn.net/dongjun7357/article/details/6400549

另外应用来不及响应会产生ANR,log位于/data/anr/trace.txt。

  

OpenGL渲染分析

OpenGL ES tracer:截获所有OpenGL调用。缺点是慢,优点是直观,每一帧,每一条GL命令都有对应的结果图像,因此很容易找出是哪条GL命令出了问题。参考:http://developer.android.com/tools/help/gltracer.html

Settings->Developer Options里Enable OpenGL traces,可以在logcat里输出。优点是快,缺点是输出不直观。

 

一些辅助调试的Android App

Busybox:默认的adb shell功能弱爆了,这个可以让开发者找回一点用Linux的感觉。

Terminal:不用host直接在guest设备就可以用的Android shell。

1 0
原创粉丝点击