Android下binary级的一些分析调试方法
2016-10-09 14:27
330 查看
http://blog.csdn.net/jinzhuojun/article/details/18080871
原文地址: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。
原文地址: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。
相关文章推荐
- Android下binary级的一些分析调试方法
- Android下binary级的一些分析调试方法
- android下的一些调试方法
- 关于Android主线程(ActivityThread)源代码分析以及一些特殊问题的非常规方法
- android默认开启adb调试方法分析
- 记录的一些Android调试方法
- 昨天客户拿过来7G的oracle数据让分析,体会到了一些编写软件的方法....
- 一個抄來的關于如何讀取網絡上一些網頁內容以及相應處理的方法 , 近日在分析這方面的技術點, 以下這一小部分, 作為一個sample代碼先留下
- 分析的一些方法
- 一些VC的快捷键以及调试方法技巧
- Android调试工具及方法
- 一些VC的快捷键以及调试方法技巧
- Windbg/KD驱动调试点滴–将平时调试的一些小方法共享给大家 --------- 转
- PostgreSQL SQL的性能调试方法2--数据库log分析
- hibernate中PO对象的三种状态分析以及session中的一些方法的区别
- 一些VC的快捷键以及调试方法技巧
- 防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
- 调试逻辑错误由一些方法和技巧
- 在摄影实践中,现将经验不足的初学者,常会出现一些失误。初学者常见的18种失误分别列出,并简要分析失误原因,提出防止方法。
- Android下图片处理的的一些方法