反汇编调试Android

https://code.google.com/p/android/issues/detail?id=73076

http://my.unix-center.net/~Simon_fu/?p=527

在移植Android过程中会遇到很多Crash的情况,尤其是启动Android过程中。一般这些问题都可以通过看代码能解决,当然也有一些比较“妖娆”的问题,非常难找到头绪,在logcat日志也只会打印一些崩溃的堆栈,这些信息很难帮助我们定位问题。根据个人一个实例来介绍一下在Android移植过程中反汇编的用法。

首先先看一下我遇到的一个logcat关于Crash的打印信息:

I/DEBUG   ( 1417): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( 1417): Build fingerprint: ‘generic/sdk/generic/:Eclair/ECLAIR/eng.simon.20100607.133011:eng/test-keys‘
I/DEBUG   ( 1417): pid: 1434, tid: 1460  >>> system_server <<<
I/DEBUG   ( 1417): signal 11 (SIGSEGV), fault addr 00000000
I/DEBUG   ( 1417):  zr 00000000  at 00000000  v0 00007265  v1 00193228
I/DEBUG   ( 1417):  a0 00000001  a1 0000000a  a2 00193228  a3 001f2ccf
I/DEBUG   ( 1417):  t0 00193228  t1 80000008  t2 8007e8dc  t3 fffffff8
I/DEBUG   ( 1417):  t4 00030465  t5 00000000  t6 00200073  t7 00000000
I/DEBUG   ( 1417):  s0 2fa0786c  s1 30564f00  s2 7ef5d990  s3 2fa0786c
I/DEBUG   ( 1417):  s4 30465000  s5 00100000  s6 7b10a8b4  s7 00000001
I/DEBUG   ( 1417):  t8 00000000  t9 7ef50d44  k0 00000000  k1 00000000
I/DEBUG   ( 1417):  gp 7ef6fd60  sp 30564e90  s8 2fa07858  ra 7ef53470
I/DEBUG   ( 1417):  hi 0000000f  lo 04444444 bva 00007265 epc 7ef534a4
I/DEBUG   ( 1417):          #00  pc 7ef534a4  /system/lib/libc.so
I/DEBUG   ( 1417):          #01  ra 7ef53470  /system/lib/libc.so
I/DEBUG   ( 1417):
I/DEBUG   ( 1417): code around pc:
I/DEBUG   ( 1417): 7ef53494 afa7002c afa40030 1040000b afa50028
I/DEBUG   ( 1417): 7ef534a4 8c4a0000 8c440008 8c590004 8fa2001c
I/DEBUG   ( 1417): 7ef534b4 0320f809 ac4a0034 8fa9001c 8d220034
I/DEBUG   ( 1417):
I/DEBUG   ( 1417): code around lr:
I/DEBUG   ( 1417): 7ef53460 afbc0010 8f9987c4 0320f809 00808021
I/DEBUG   ( 1417): 7ef53470 afa2001c 8fa8001c 8fa6001c 8fa3001c
I/DEBUG   ( 1417): 7ef53480 8d07000c 8cc40010 8c650008 8c420034
I/DEBUG   ( 1417):
I/DEBUG   ( 1417): stack:
I/DEBUG   ( 1417):     30564e50  00000000
I/DEBUG   ( 1417):     30564e54  00000000
I/DEBUG   ( 1417):     30564e58  00000000
I/DEBUG   ( 1417):     30564e5c  00000000
I/DEBUG   ( 1417):     30564e60  00009004
I/DEBUG   ( 1417):     30564e64  00000000
I/DEBUG   ( 1417):     30564e68  00000000
I/DEBUG   ( 1417):     30564e6c  00000000
I/DEBUG   ( 1417):     30564e70  00000009
I/DEBUG   ( 1417):     30564e74  00000000
I/DEBUG   ( 1417):     30564e78  00000000
I/DEBUG   ( 1417):     30564e7c  7ef12af4  /system/lib/libc.so
I/DEBUG   ( 1417):     30564e80  7ef6fd60
I/DEBUG   ( 1417):     30564e84  00000000
I/DEBUG   ( 1417):     30564e88  00000000
I/DEBUG   ( 1417):     30564e8c  7ef53470  /system/lib/libc.so
I/DEBUG   ( 1417):     30564e90  7ef6fd60
I/DEBUG   ( 1417):     30564e94  00000000
I/DEBUG   ( 1417):     30564e98  30564eb4
I/DEBUG   ( 1417):     30564e9c  00000000
I/DEBUG   ( 1417):     30564ea0  7ef6fd60
I/DEBUG   ( 1417):     30564ea4  7b10a8e8  /system/lib/libsqlite.so
I/DEBUG   ( 1417):     30564ea8  7b10a8b4  /system/lib/libsqlite.so
I/DEBUG   ( 1417):     30564eac  00193228  [heap]
I/DEBUG   ( 1417):     30564eb0  2fa07870
I/DEBUG   ( 1417):     30564eb4  00000000
I/DEBUG   ( 1417):     30564eb8  0000000a
I/DEBUG   ( 1417):     30564ebc  001f2ccf  [heap]
I/DEBUG   ( 1417):     30564ec0  00000001
I/DEBUG   ( 1417):     30564ec4  7ef537fc  /system/lib/libc.so
I/DEBUG   ( 1417):     30564ec8  00193228  [heap]
I/DEBUG   ( 1417):     30564ecc  30564f00
I/DEBUG   ( 1417):     30564ed0  7ef5d990  /system/lib/libc.so
I/DEBUG   ( 1417):     30564ed4  2fa0786c
I/DEBUG   ( 1417):     30564ed8  30465000
I/DEBUG   ( 1417):     30564edc  00100000  [heap]
I/DEBUG   ( 1417):     30564ee0  7b10a8b4  /system/lib/libsqlite.so
I/DEBUG   ( 1417):     30564ee4  00000001
I/DEBUG   ( 1417):     30564ee8  2fa07858
I/DEBUG   ( 1417):     30564eec  7ef530ac  /system/lib/libc.so
I/DEBUG   ( 1417):     30564ef0  7b10a8b4  /system/lib/libsqlite.so
I/DEBUG   ( 1417):     30564ef4  2fa0786c
I/DEBUG   ( 1417):     30564ef8  00000000
I/DEBUG   ( 1417):     30564efc  00000000
I/DEBUG   ( 1417):     30564f00  30564f00
I/DEBUG   ( 1417):     30564f04  00193228  [heap]
I/DEBUG   ( 1417):     30564f08  00000009
I/DEBUG   ( 1417):     30564f0c  00000000
I/DEBUG   ( 1417):     30564f10  00000000
I/DEBUG   ( 1417):     30564f14  00000000
I/DEBUG   ( 1417):     30564f18  00000000
I/DEBUG   ( 1417):     30564f1c  00000000
I/DEBUG   ( 1417):     30564f20  00000000
I/DEBUG   ( 1417):     30564f24  00000000
I/DEBUG   ( 1417):     30564f28  00000000
I/DEBUG   ( 1417):     30564f2c  00000000
I/DEBUG   ( 1417):     30564f30  00000000
I/DEBUG   ( 1417):     30564f34  00000000
I/DEBUG   ( 1417):     30564f38  00000000
I/DEBUG   ( 1417):     30564f3c  00000000
I/DEBUG   ( 1417):     30564f40  00000000
I/DEBUG   ( 1417):     30564f44  00000000
I/DEBUG   ( 1417):     30564f48  00000000
I/DEBUG   ( 1417):     30564f4c  00000000
I/DEBUG   ( 1417):     30564f50  00000000
I/DEBUG   ( 1417):     30564f54  00000000
I/DEBUG   ( 1417):     30564f58  00000000
I/DEBUG   ( 1417):     30564f5c  00000000
I/DEBUG   ( 1417):     30564f60  00000000
I/DEBUG   ( 1417):     30564f64  00000000
I/DEBUG   ( 1417):     30564f68  00000000
I/DEBUG   ( 1417):     30564f6c  00000000
I/DEBUG   ( 1417):     30564f70  00000000
I/DEBUG   ( 1417):     30564f74  00000000
I/DEBUG   ( 1417):     30564f78  00000000
I/DEBUG   ( 1417):     30564f7c  00000000
I/DEBUG   ( 1417):     30564f80  00000000
I/DEBUG   ( 1417):     30564f84  00000000
I/DEBUG   ( 1417):     30564f88  00000000
I/DEBUG   ( 1417):     30564f8c  00000000
I/DEBUG   ( 1417):     30564f90  00000000
I/DEBUG   ( 1417):     30564f94  00000000
I/DEBUG   ( 1417):     30564f98  00000000
I/DEBUG   ( 1417):     30564f9c  00000000
I/DEBUG   ( 1417):     30564fa0  00000000
I/DEBUG   ( 1417):     30564fa4  00000000
I/DEBUG   ( 1417):     30564fa8  00000000
I/DEBUG   ( 1417):     30564fac  00000000
I/DEBUG   ( 1417):     30564fb0  00000000
I/DEBUG   ( 1417):     30564fb4  00000000
I/DEBUG   ( 1417):     30564fb8  00000000
I/DEBUG   ( 1417):     30564fbc  00000000
I/DEBUG   ( 1417):     30564fc0  00000000
I/DEBUG   ( 1417):     30564fc4  00000000
I/DEBUG   ( 1417):     30564fc8  00000000
I/DEBUG   ( 1417):     30564fcc  00000000
I/DEBUG   ( 1417):     30564fd0  00000000
I/DEBUG   ( 1417):     30564fd4  00000000
I/DEBUG   ( 1417):     30564fd8  00000000
I/DEBUG   ( 1417):     30564fdc  00000000
I/DEBUG   ( 1417):     30564fe0  00000000
I/DEBUG   ( 1417):     30564fe4  00000000
I/DEBUG   ( 1417):     30564fe8  00000000
I/DEBUG   ( 1417):     30564fec  00000000
I/DEBUG   ( 1417):     30564ff0  00000000
I/DEBUG   ( 1417):     30564ff4  00000000
I/DEBUG   ( 1417):     30564ff8  00000000
I/DEBUG   ( 1417):     30564ffc  00000000
I/DEBUG   ( 1417):     30565000  00000000
I/DEBUG   ( 1417):     30565004  00000000
I/DEBUG   ( 1417):     30565008  00000000
I/DEBUG   ( 1417):     3056500c  00000000
I/DEBUG   ( 1417):     30565010  00000000
I/DEBUG   ( 1417):     30565014  00000000
I/DEBUG   ( 1417):     30565018  00000000
I/DEBUG   ( 1417):     3056501c  00000000
I/DEBUG   ( 1417):     30565020  00000000
I/DEBUG   ( 1417):     30565024  00000000
I/DEBUG   ( 1417):     30565028  00000000
I/DEBUG   ( 1417):     3056502c  00000000
I/DEBUG   ( 1417):     30565030  00000000
I/DEBUG   ( 1417):     30565034  00000000
I/DEBUG   ( 1417):     30565038  00000000
I/DEBUG   ( 1417):     3056503c  00000000
I/DEBUG   ( 1417):     30565040  00000000
W/SyncManager( 1434): Updating for new accounts...

通过这个log信息我们可以看到libc.so崩溃了,再研究堆栈发现是libsqilte.so引起的,那么具体是哪一个函数崩溃了呢?这里面没有信息。另外内核加载动态库是动态加载的,就算我们反汇编出来libc.so和libsqlite.so,符号表也没有办法和log中地址对应上,除非我们能知道内核加载libc.so和libsqlite.so的基地址,这样我们就可以通过偏移找到相应的函数了。很幸运,Android确实规定了系统中的大部分库的内核加载地址。文件的位置在build/core下,有对应平台的map文件,比如:Arm平台文件名叫做prelink-linux-arm.map,Mips平台叫做prelink-linux-mips.map。我是在Mips平台出的问题,所以应该用prelink-linux-mips.map文件来定位。文件内容如下:

# 0x7F100000 - 0x7FFF0000 Thread 0 stack
# 0x7F000000 - 0x7F0FFFFF Linker

# 0x70000000 - 0x7EFFFFFF Prelinked System Libraries
# 0x60000000 - 0x6FFFFFFF Prelinked App Libraries
# 0x50000000 - 0x5FFFFFFF Non-prelinked Libraries
# 0x40000000 - 0x4FFFFFFF mmap‘d stuff
# 0x10000000 - 0x3FFFFFFF Thread Stacks
# 0x00080000 - 0x0FFFFFFF .text / .data / heap

# core system libraries
libdl.so                0x7EFF0000
libc.so                 0x7EF00000
libstdc++.so            0x7EEF0000
libm.so                 0x7EE90000
liblog.so               0x7EE80000
libcutils.so            0x7EE00000
libthread_db.so         0x7ED80000
libz.so                 0x7ED00000
libevent.so             0x7EC80000
libssl.so               0x7EC00000
libcrypto.so            0x7EA00000
libffi.so	        0x7E980000
libsysutils.so          0x7E900000

# bluetooth
liba2dp.so              0x7E780000
audio.so                0x7E700000
input.so                0x7E680000
libhcid.so              0x7E600000
libbluedroid.so         0x7E580000
libbluetooth.so         0x7E500000
libdbus.so              0x7E400000

# extended system libraries
libril.so               0x7E300000
libreference-ril.so     0x7E000000
libwpa_client.so        0x7DC00000
libnetutils.so          0x7DB00000

# core dalvik runtime support
libandroid_servers.so   0x7D900000
#libicudata.so           0x7D700000
libicuuc.so             0x7D500000
libicui18n.so           0x7D380000
libandroid_runtime.so   0x7D2a0000
libnativehelper.so      0x7D200000
libdvm-MIPS.so          0x7D180000
libdvm.so               0x7D000000

# graphics
libpixelflinger.so      0x7CF00000
libsurfaceflinger.so    0x7CD00000
libagl.so               0x7CC00000

libGLESv1_CM.so         0x7CB00000
libGLESv2.so            0x7CA00000
libOpenVG_CM.so         0x7C900000
libOpenVGU_CM.so        0x7C800000
libEGL.so               0x7C700000

libexif.so              0x7C500000
libui.so                0x7C400000
libsgl.so               0x7C000000

# audio
libspeech.so            0x7BA00000
libaudio.so             0x7B900000
libsonivox.so           0x7B800000
libsoundpool.so         0x7B700000
libvorbisidec.so        0x7B600000
libmedia_jni.so         0x7B500000
libmediaplayerservice.so 0x7B480000
libmedia.so             0x7B400000
libFFTEm.so             0x7B300000
libaudioflinger.so      0x7B200000

# assorted system libraries
libsqlite.so            0x7B100000
libexpat.so             0x7B000000
libwebcore.so           0x7A000000
libutils.so             0x79D00000
libcameraservice.so     0x79C80000
libhardware.so          0x79C70000
libhardware_legacy.so   0x79C00000
libapp_process.so       0x79B00000
libsystem_server.so     0x79A00000
libime.so               0x79800000
libgps.so               0x79700000
libcamera.so            0x79680000
libqcamera.so           0x79400000

# pv libraries
libpvasf.so                    0x79200000
libpvasfreg.so                 0x79100000
libomx_sharedlibrary.so        0x790e0000
libopencore_download.so        0x79000000
libopencore_downloadreg.so     0x78f00000
libopencore_net_support.so     0x78e00000
libopencore_rtsp.so            0x78d00000
libopencore_rtspreg.so         0x78c00000
libopencore_author.so          0x78a00000
libomx_aacdec_sharedlibrary.so 0x789c0000
libomx_amrdec_sharedlibrary.so 0x78990000
libomx_amrenc_sharedlibrary.so 0x78970000
libomx_avcdec_sharedlibrary.so 0x78958000
libomx_m4vdec_sharedlibrary.so 0x78930000
libomx_m4venc_sharedlibrary.so 0x788f0000
libomx_mp3dec_sharedlibrary.so 0x788d0000
libopencore_mp4local.so        0x78800000
libopencore_mp4localreg.so     0x78700000
libopencore_player.so          0x78400000

# opencore hardware support
libmm-adspsvc.so              0x783c0000
libOmxCore.so                 0x783a0000
libOmxMpeg4Dec.so             0x78370000
libOmxH264Dec.so              0x78340000
libOmxVidEnc.so               0x78310000
libopencorehw.so              0x78300000

libopencore_common.so         0x78180000
#libqcomm_omx.so               0xA5A00000

# libraries for specific apps or temporary libraries
libcam_ipl.so           0x6F000000
libwbxml.so             0x6E800000
libwbxml_jni.so         0x6E400000
libxml2wbxml.so         0x6E000000
libaes.so               0x6DC00000
libdrm1.so              0x6D800000
libdrm1_jni.so          0x6D400000
libwapcore.so           0x6D000000
libstreetview.so        0x6CC00000
libwapbrowsertest.so    0x6C800000
libminiglobe.so         0x6C400000
libearth.so             0x6C000000
libembunit.so           0x6BC00000
libneon.so              0x6B800000
libjni_example.so       0x6B400000
libjni_load_test.so     0x6B000000
libjni_lib_test.so      0x6AC00000
librunperf.so           0x6A800000
libctest.so             0x6A700000
libUAPI_jni.so          0x6A500000
librpc.so               0x6A400000
libtrace_test.so        0x6A300000
libsrec_jni.so          0x6A200000
libcerttool_jni.so      0x6A100000
libacc.so               0x6A000000
libbinder.so            0x69F00000
libskia.so              0x69000000
libGLES_android.so      0x68800000
libRS.so                0x68000000
libaudiopolicygeneric.so 0x67c00000
librs_jni.so            0x67800000

# Sigma Designs libraries
libcore.so                      0x61400000
libdisplay.so                   0x61000000
libdrm.so                       0x60c00000
libhw.so                        0x60800000
libplayback.so                  0x60000000

从这个map文件我们可以查询到每个lib库的加载基地址。比如libc.so将会被内核加载到0x7EF00000,libsqlite.so加载到0x7B100000。我们可以对照一下Crash的log信息也对应的上,说明这个文件在Android加载过程中起了作用。

下一步我们需要反汇编libc.so和libsqlite.so。一般交叉编译器都提供了反汇编的工具,我的mips平台提供了mips-linux-gnu-objdump命令来进行反汇编。

mips-linux-gnu-objdump -dS libc.so > libc.dump
mips-linux-gnu-objdump -dS libsqlite.so > libsqlite.dump

这样就可以得到libc和libsqlite的符号表。然后通过符号表,Android加载动态库的基地址,log信息就可以定位到那个函数出问题了,如果你对对应平台汇编语言熟悉的话可以阅读汇编代码找出问题。本文就不具体讲怎样利用这个三个文件信息了。有了这个三个文件,稍一研究就可以明白怎样分析了。

一般情况下,Crash都不是Android源码的问题,最有可能的是内核有些模块没有编译进去。本例中就是和Mutex相关的模块没有编译进内核引起的问题。

以上是个人摸索出来的方法,如果你有更好的方法或者我的方法有错误,请你不吝指教。

时间: 2024-07-29 15:09:04

反汇编调试Android的相关文章

Chapter8——动态调试Android程序

DDMS DDMS(Dalvik Debug Monitor Server)就是动态调试的一个工具(不知Android L之后会不会改名--!).DDMS提供文件浏览.Logcat.Method Profiling等功能. 定位关键代码 1.代码注入法 用Apktool反编译得到smali,查找onClick(),比如要找程序注册码,仔细阅读之后发现比对注册码与用户输入的函数 invoke-virtual {v1, v0},Ljava/lang/String;->equalsIgnoreCase

利用 Chrome 开发者工具远程调试 Android 中的原生 WebView

之前写过一篇关于 Android Studio 断点调试技巧 的文章,但都是针对 Native 代码的调试,对于 Hybrid 开发模式下的 WebView 却无从下手.幸运的是,PC 中的 Chrome 浏览器提供的开发者工具能够帮助我们远程调试 Android 中的 WebView 加载的网页. Android 4.4 (KitKat) 开始,使用 Chrome 开发者工具可以帮助我们在原生 Android 应用中远程调试 WebView 网页内容.一起来看看怎么操作吧. 第一步,设置 We

调试 Android* x86 应用程序的方法以及要使用的工具

作者:Xiaodong Wang 1.简介 众所周知,Android* 开发人员头顶许多称呼:设计员.程序猿等,并且通常会不可避免地被称为故障检修工.代码中的错误无法避免,因此无论您是否一开始就造成错误,了解调试工具以及如何迅速而有效地跟踪并解决错误都很重要.鉴于此,如今的 Android 开发人员必须掌握有效的调试技巧.本文提供了 Android 应用程序调试工具的简单教学,用于帮助 Android SDK 以及相关工具的新手迅速入门,并在 Android x86 平台上更有效地解决故障. 2

在 Chrome 中调试 Android 浏览器

最近需要使用 Chrome Developer Tools 调试 Android 浏览器,但是官方指南并不是很好使,经过一番折腾,终于调试成功了,在此把经验分享给需要的朋友. Chrome Developer Tools 是前端工程师必不可少的工具,它极大的提高了我们的开发调试效率.在移动开发的时代,我们也必须掌握手机浏览器在 Chrome 中调试的方法.本篇仅介绍 Android. 环境 不同的环境可能存在一些差异,我的环境是: Windows 10 电脑 Chrome 50.0.2661.7

gdb 远程调试android进程 -转

什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停住.(断点可以是表达式) 程序被停住后,可以查看此时程序中发生的事. 动态改变程序的执行环境. GDB远程调试原理图 如图上所示,我们需要使用gdbserver依附到我们要调试的进程上,gdb通过adbd和手机上的gdbserver 进行socket通信. 远程调试实战 在手机上启动gdbserve

mac 下真机调试 android 手机

第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType     可以查看连接的usb设备的信息 比如我的usb信息如下(部分内容): Spreadtrum phone: Product ID: 0x5d04 Vendor ID: 0x1782 Version:  2.29 Serial Number: 19761202 Speed: Up to 480 Mb/sec Manufacturer: Spreadtrum Location ID: 0xf

调试android chrome web page简明备忘

必备工具 adb tools.android chrome 先开启手机调试模式 adb forward tcp:9919 localabstract:chromedevtoolsremote 成功会提示 * daemon not running. starting it now on port 5037 * * daemon started successfully * 不成功的话用这个命令再试 adb kill-server 接着打开下面的链接,这里的9919是上面adb命令中指定的 http

IDA 调试 Android

最近都在学一些反编译安卓相关的东西,其实网上有很多教程关于用 IDA 调试 Android 的过程,主要记录一下我遇到的坑 首先 Android手机要是root过的 还要注意的一点是apk中的 AndroidManifest.xml 中debuggable要为true 1.将 apk 装到手机上,然后执行命令行: adb shell am start -D -n "com.gabo.test/com.unity3d.player.UnityPlayerActivity" 最后一个参数是

Eclipse替代ndk-gdb断点调试Android NDK程序

一 概述: Eclipse调试NDK程序的操作并不难,难的是环境的搭建.光是安装Eclipse就有不少问题,真是"大错不犯,小过不断"不胜期烦.在网上,已经有先行者记录下了Eclipse断点调试Android NDK程序的方法: <Eclipse + ADT(包括NDK Plugin) + CDT 搭建Android NDK开发环境>网址:http://blog.sina.com.cn/s/blog_48ed03c80101nhei.html 我遇到的情况与上文有些不同,上