Android调试的必杀技——反汇编

    今天一个APK的应用老是挂在一个so中,搜集资料发现以下东东有些意思,虽然对我遇到的问题没有作用,不过转给有需要的朋友,迸发下灵感、

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

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

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

  1. I/DEBUG   ( 1417): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***  
  2. I/DEBUG   ( 1417): Build fingerprint: 'generic/sdk/generic/:Eclair/ECLAIR/eng.simon.20100607.133011:eng/test-keys'  
  3. I/DEBUG   ( 1417): pid: 1434, tid: 1460  >>> system_server <<<  
  4. I/DEBUG   ( 1417): signal 11 (SIGSEGV), fault addr 00000000  
  5. I/DEBUG   ( 1417):  zr 00000000  at 00000000  v0 00007265  v1 00193228  
  6. I/DEBUG   ( 1417):  a0 00000001  a1 0000000a  a2 00193228  a3 001f2ccf  
  7. I/DEBUG   ( 1417):  t0 00193228  t1 80000008  t2 8007e8dc  t3 fffffff8  
  8. I/DEBUG   ( 1417):  t4 00030465  t5 00000000  t6 00200073  t7 00000000  
  9. I/DEBUG   ( 1417):  s0 2fa0786c  s1 30564f00  s2 7ef5d990  s3 2fa0786c  
  10. I/DEBUG   ( 1417):  s4 30465000  s5 00100000  s6 7b10a8b4  s7 00000001  
  11. I/DEBUG   ( 1417):  t8 00000000  t9 7ef50d44  k0 00000000  k1 00000000  
  12. I/DEBUG   ( 1417):  gp 7ef6fd60  sp 30564e90  s8 2fa07858  ra 7ef53470  
  13. I/DEBUG   ( 1417):  hi 0000000f  lo 04444444 bva 00007265 epc 7ef534a4  
  14. I/DEBUG   ( 1417):          #00  pc 7ef534a4  /system/lib/libc.so  
  15. I/DEBUG   ( 1417):          #01  ra 7ef53470  /system/lib/libc.so  
  16. I/DEBUG   ( 1417):  
  17. I/DEBUG   ( 1417): code around pc:  
  18. I/DEBUG   ( 1417): 7ef53494 afa7002c afa40030 1040000b afa50028  
  19. I/DEBUG   ( 1417): 7ef534a4 8c4a0000 8c440008 8c590004 8fa2001c  
  20. I/DEBUG   ( 1417): 7ef534b4 0320f809 ac4a0034 8fa9001c 8d220034  
  21. I/DEBUG   ( 1417):  
  22. I/DEBUG   ( 1417): code around lr:  
  23. I/DEBUG   ( 1417): 7ef53460 afbc0010 8f9987c4 0320f809 00808021  
  24. I/DEBUG   ( 1417): 7ef53470 afa2001c 8fa8001c 8fa6001c 8fa3001c  
  25. I/DEBUG   ( 1417): 7ef53480 8d07000c 8cc40010 8c650008 8c420034  
  26. I/DEBUG   ( 1417):  
  27. I/DEBUG   ( 1417): stack:  
  28. I/DEBUG   ( 1417):     30564e50  00000000  
  29. I/DEBUG   ( 1417):     30564e54  00000000  
  30. I/DEBUG   ( 1417):     30564e58  00000000  
  31. I/DEBUG   ( 1417):     30564e5c  00000000  
  32. I/DEBUG   ( 1417):     30564e60  00009004  
  33. I/DEBUG   ( 1417):     30564e64  00000000  
  34. I/DEBUG   ( 1417):     30564e68  00000000  
  35. I/DEBUG   ( 1417):     30564e6c  00000000  
  36. I/DEBUG   ( 1417):     30564e70  00000009  
  37. I/DEBUG   ( 1417):     30564e74  00000000  
  38. I/DEBUG   ( 1417):     30564e78  00000000  
  39. I/DEBUG   ( 1417):     30564e7c  7ef12af4  /system/lib/libc.so  
  40. I/DEBUG   ( 1417):     30564e80  7ef6fd60  
  41. I/DEBUG   ( 1417):     30564e84  00000000  
  42. I/DEBUG   ( 1417):     30564e88  00000000  
  43. I/DEBUG   ( 1417):     30564e8c  7ef53470  /system/lib/libc.so  
  44. I/DEBUG   ( 1417):     30564e90  7ef6fd60  
  45. I/DEBUG   ( 1417):     30564e94  00000000  
  46. I/DEBUG   ( 1417):     30564e98  30564eb4  
  47. I/DEBUG   ( 1417):     30564e9c  00000000  
  48. I/DEBUG   ( 1417):     30564ea0  7ef6fd60  
  49. I/DEBUG   ( 1417):     30564ea4  7b10a8e8  /system/lib/libsqlite.so  
  50. I/DEBUG   ( 1417):     30564ea8  7b10a8b4  /system/lib/libsqlite.so  
  51. I/DEBUG   ( 1417):     30564eac  00193228  [heap]  
  52. I/DEBUG   ( 1417):     30564eb0  2fa07870  
  53. I/DEBUG   ( 1417):     30564eb4  00000000  
  54. I/DEBUG   ( 1417):     30564eb8  0000000a  
  55. I/DEBUG   ( 1417):     30564ebc  001f2ccf  [heap]  
  56. I/DEBUG   ( 1417):     30564ec0  00000001  
  57. I/DEBUG   ( 1417):     30564ec4  7ef537fc  /system/lib/libc.so  
  58. I/DEBUG   ( 1417):     30564ec8  00193228  [heap]  
  59. I/DEBUG   ( 1417):     30564ecc  30564f00  
  60. I/DEBUG   ( 1417):     30564ed0  7ef5d990  /system/lib/libc.so  
  61. I/DEBUG   ( 1417):     30564ed4  2fa0786c  
  62. I/DEBUG   ( 1417):     30564ed8  30465000  
  63. I/DEBUG   ( 1417):     30564edc  00100000  [heap]  
  64. I/DEBUG   ( 1417):     30564ee0  7b10a8b4  /system/lib/libsqlite.so  
  65. I/DEBUG   ( 1417):     30564ee4  00000001  
  66. I/DEBUG   ( 1417):     30564ee8  2fa07858  
  67. I/DEBUG   ( 1417):     30564eec  7ef530ac  /system/lib/libc.so  
  68. I/DEBUG   ( 1417):     30564ef0  7b10a8b4  /system/lib/libsqlite.so  
  69. I/DEBUG   ( 1417):     30564ef4  2fa0786c  
  70. I/DEBUG   ( 1417):     30564ef8  00000000  
  71. I/DEBUG   ( 1417):     30564efc  00000000  
  72. I/DEBUG   ( 1417):     30564f00  30564f00  
  73. I/DEBUG   ( 1417):     30564f04  00193228  [heap]  
  74. I/DEBUG   ( 1417):     30564f08  00000009  
  75. I/DEBUG   ( 1417):     30564f0c  00000000  
  76. I/DEBUG   ( 1417):     30564f10  00000000  
  77. I/DEBUG   ( 1417):     30564f14  00000000  
  78. I/DEBUG   ( 1417):     30564f18  00000000  
  79. I/DEBUG   ( 1417):     30564f1c  00000000  
  80. I/DEBUG   ( 1417):     30564f20  00000000  
  81. I/DEBUG   ( 1417):     30564f24  00000000  
  82. I/DEBUG   ( 1417):     30564f28  00000000  
  83. I/DEBUG   ( 1417):     30564f2c  00000000  
  84. I/DEBUG   ( 1417):     30564f30  00000000  
  85. I/DEBUG   ( 1417):     30564f34  00000000  
  86. I/DEBUG   ( 1417):     30564f38  00000000  
  87. I/DEBUG   ( 1417):     30564f3c  00000000  
  88. I/DEBUG   ( 1417):     30564f40  00000000  
  89. I/DEBUG   ( 1417):     30564f44  00000000  
  90. I/DEBUG   ( 1417):     30564f48  00000000  
  91. I/DEBUG   ( 1417):     30564f4c  00000000  
  92. I/DEBUG   ( 1417):     30564f50  00000000  
  93. I/DEBUG   ( 1417):     30564f54  00000000  
  94. I/DEBUG   ( 1417):     30564f58  00000000  
  95. I/DEBUG   ( 1417):     30564f5c  00000000  
  96. I/DEBUG   ( 1417):     30564f60  00000000  
  97. I/DEBUG   ( 1417):     30564f64  00000000  
  98. I/DEBUG   ( 1417):     30564f68  00000000  
  99. I/DEBUG   ( 1417):     30564f6c  00000000  
  100. I/DEBUG   ( 1417):     30564f70  00000000  
  101. I/DEBUG   ( 1417):     30564f74  00000000  
  102. I/DEBUG   ( 1417):     30564f78  00000000  
  103. I/DEBUG   ( 1417):     30564f7c  00000000  
  104. I/DEBUG   ( 1417):     30564f80  00000000  
  105. I/DEBUG   ( 1417):     30564f84  00000000  
  106. I/DEBUG   ( 1417):     30564f88  00000000  
  107. I/DEBUG   ( 1417):     30564f8c  00000000  
  108. I/DEBUG   ( 1417):     30564f90  00000000  
  109. I/DEBUG   ( 1417):     30564f94  00000000  
  110. I/DEBUG   ( 1417):     30564f98  00000000  
  111. I/DEBUG   ( 1417):     30564f9c  00000000  
  112. I/DEBUG   ( 1417):     30564fa0  00000000  
  113. I/DEBUG   ( 1417):     30564fa4  00000000  
  114. I/DEBUG   ( 1417):     30564fa8  00000000  
  115. I/DEBUG   ( 1417):     30564fac  00000000  
  116. I/DEBUG   ( 1417):     30564fb0  00000000  
  117. I/DEBUG   ( 1417):     30564fb4  00000000  
  118. I/DEBUG   ( 1417):     30564fb8  00000000  
  119. I/DEBUG   ( 1417):     30564fbc  00000000  
  120. I/DEBUG   ( 1417):     30564fc0  00000000  
  121. I/DEBUG   ( 1417):     30564fc4  00000000  
  122. I/DEBUG   ( 1417):     30564fc8  00000000  
  123. I/DEBUG   ( 1417):     30564fcc  00000000  
  124. I/DEBUG   ( 1417):     30564fd0  00000000  
  125. I/DEBUG   ( 1417):     30564fd4  00000000  
  126. I/DEBUG   ( 1417):     30564fd8  00000000  
  127. I/DEBUG   ( 1417):     30564fdc  00000000  
  128. I/DEBUG   ( 1417):     30564fe0  00000000  
  129. I/DEBUG   ( 1417):     30564fe4  00000000  
  130. I/DEBUG   ( 1417):     30564fe8  00000000  
  131. I/DEBUG   ( 1417):     30564fec  00000000  
  132. I/DEBUG   ( 1417):     30564ff0  00000000  
  133. I/DEBUG   ( 1417):     30564ff4  00000000  
  134. I/DEBUG   ( 1417):     30564ff8  00000000  
  135. I/DEBUG   ( 1417):     30564ffc  00000000  
  136. I/DEBUG   ( 1417):     30565000  00000000  
  137. I/DEBUG   ( 1417):     30565004  00000000  
  138. I/DEBUG   ( 1417):     30565008  00000000  
  139. I/DEBUG   ( 1417):     3056500c  00000000  
  140. I/DEBUG   ( 1417):     30565010  00000000  
  141. I/DEBUG   ( 1417):     30565014  00000000  
  142. I/DEBUG   ( 1417):     30565018  00000000  
  143. I/DEBUG   ( 1417):     3056501c  00000000  
  144. I/DEBUG   ( 1417):     30565020  00000000  
  145. I/DEBUG   ( 1417):     30565024  00000000  
  146. I/DEBUG   ( 1417):     30565028  00000000  
  147. I/DEBUG   ( 1417):     3056502c  00000000  
  148. I/DEBUG   ( 1417):     30565030  00000000  
  149. I/DEBUG   ( 1417):     30565034  00000000  
  150. I/DEBUG   ( 1417):     30565038  00000000  
  151. I/DEBUG   ( 1417):     3056503c  00000000  
  152. I/DEBUG   ( 1417):     30565040  00000000  
  153. 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文件来定位。文件内容如下:

 

  1. # 0x7F100000 - 0x7FFF0000 Thread 0 stack  
  2. # 0x7F000000 - 0x7F0FFFFF Linker  
  3.   
  4. # 0x70000000 - 0x7EFFFFFF Prelinked System Libraries  
  5. # 0x60000000 - 0x6FFFFFFF Prelinked App Libraries  
  6. # 0x50000000 - 0x5FFFFFFF Non-prelinked Libraries  
  7. # 0x40000000 - 0x4FFFFFFF mmap'd stuff  
  8. # 0x10000000 - 0x3FFFFFFF Thread Stacks  
  9. # 0x00080000 - 0x0FFFFFFF .text / .data / heap  
  10.   
  11. # core system libraries  
  12. libdl.so                0x7EFF0000  
  13. libc.so                 0x7EF00000  
  14. libstdc++.so            0x7EEF0000  
  15. libm.so                 0x7EE90000  
  16. liblog.so               0x7EE80000  
  17. libcutils.so            0x7EE00000  
  18. libthread_db.so         0x7ED80000  
  19. libz.so                 0x7ED00000  
  20. libevent.so             0x7EC80000  
  21. libssl.so               0x7EC00000  
  22. libcrypto.so            0x7EA00000  
  23. libffi.so           0x7E980000  
  24. libsysutils.so          0x7E900000  
  25.   
  26. # bluetooth  
  27. liba2dp.so              0x7E780000  
  28. audio.so                0x7E700000  
  29. input.so                0x7E680000  
  30. libhcid.so              0x7E600000  
  31. libbluedroid.so         0x7E580000  
  32. libbluetooth.so         0x7E500000  
  33. libdbus.so              0x7E400000  
  34.   
  35. # extended system libraries  
  36. libril.so               0x7E300000  
  37. libreference-ril.so     0x7E000000  
  38. libwpa_client.so        0x7DC00000  
  39. libnetutils.so          0x7DB00000  
  40.   
  41. # core dalvik runtime support  
  42. libandroid_servers.so   0x7D900000  
  43. #libicudata.so           0x7D700000  
  44. libicuuc.so             0x7D500000  
  45. libicui18n.so           0x7D380000  
  46. libandroid_runtime.so   0x7D2a0000  
  47. libnativehelper.so      0x7D200000  
  48. libdvm-MIPS.so          0x7D180000  
  49. libdvm.so               0x7D000000  
  50.   
  51. # graphics  
  52. libpixelflinger.so      0x7CF00000  
  53. libsurfaceflinger.so    0x7CD00000  
  54. libagl.so               0x7CC00000  
  55.   
  56. libGLESv1_CM.so         0x7CB00000  
  57. libGLESv2.so            0x7CA00000  
  58. libOpenVG_CM.so         0x7C900000  
  59. libOpenVGU_CM.so        0x7C800000  
  60. libEGL.so               0x7C700000  
  61.   
  62. libexif.so              0x7C500000  
  63. libui.so                0x7C400000  
  64. libsgl.so               0x7C000000  
  65.   
  66. # audio  
  67. libspeech.so            0x7BA00000  
  68. libaudio.so             0x7B900000  
  69. libsonivox.so           0x7B800000  
  70. libsoundpool.so         0x7B700000  
  71. libvorbisidec.so        0x7B600000  
  72. libmedia_jni.so         0x7B500000  
  73. libmediaplayerservice.so 0x7B480000  
  74. libmedia.so             0x7B400000  
  75. libFFTEm.so             0x7B300000  
  76. libaudioflinger.so      0x7B200000  
  77.   
  78. # assorted system libraries  
  79. libsqlite.so            0x7B100000  
  80. libexpat.so             0x7B000000  
  81. libwebcore.so           0x7A000000  
  82. libutils.so             0x79D00000  
  83. libcameraservice.so     0x79C80000  
  84. libhardware.so          0x79C70000  
  85. libhardware_legacy.so   0x79C00000  
  86. libapp_process.so       0x79B00000  
  87. libsystem_server.so     0x79A00000  
  88. libime.so               0x79800000  
  89. libgps.so               0x79700000  
  90. libcamera.so            0x79680000  
  91. libqcamera.so           0x79400000  
  92.   
  93. # pv libraries  
  94. libpvasf.so                    0x79200000  
  95. libpvasfreg.so                 0x79100000  
  96. libomx_sharedlibrary.so        0x790e0000  
  97. libopencore_download.so        0x79000000  
  98. libopencore_downloadreg.so     0x78f00000  
  99. libopencore_net_support.so     0x78e00000  
  100. libopencore_rtsp.so            0x78d00000  
  101. libopencore_rtspreg.so         0x78c00000  
  102. libopencore_author.so          0x78a00000  
  103. libomx_aacdec_sharedlibrary.so 0x789c0000  
  104. libomx_amrdec_sharedlibrary.so 0x78990000  
  105. libomx_amrenc_sharedlibrary.so 0x78970000  
  106. libomx_avcdec_sharedlibrary.so 0x78958000  
  107. libomx_m4vdec_sharedlibrary.so 0x78930000  
  108. libomx_m4venc_sharedlibrary.so 0x788f0000  
  109. libomx_mp3dec_sharedlibrary.so 0x788d0000  
  110. libopencore_mp4local.so        0x78800000  
  111. libopencore_mp4localreg.so     0x78700000  
  112. libopencore_player.so          0x78400000  
  113.   
  114. # opencore hardware support  
  115. libmm-adspsvc.so              0x783c0000  
  116. libOmxCore.so                 0x783a0000  
  117. libOmxMpeg4Dec.so             0x78370000  
  118. libOmxH264Dec.so              0x78340000  
  119. libOmxVidEnc.so               0x78310000  
  120. libopencorehw.so              0x78300000  
  121.   
  122. libopencore_common.so         0x78180000  
  123. #libqcomm_omx.so               0xA5A00000  
  124.   
  125. # libraries for specific apps or temporary libraries  
  126. libcam_ipl.so           0x6F000000  
  127. libwbxml.so             0x6E800000  
  128. libwbxml_jni.so         0x6E400000  
  129. libxml2wbxml.so         0x6E000000  
  130. libaes.so               0x6DC00000  
  131. libdrm1.so              0x6D800000  
  132. libdrm1_jni.so          0x6D400000  
  133. libwapcore.so           0x6D000000  
  134. libstreetview.so        0x6CC00000  
  135. libwapbrowsertest.so    0x6C800000  
  136. libminiglobe.so         0x6C400000  
  137. libearth.so             0x6C000000  
  138. libembunit.so           0x6BC00000  
  139. libneon.so              0x6B800000  
  140. libjni_example.so       0x6B400000  
  141. libjni_load_test.so     0x6B000000  
  142. libjni_lib_test.so      0x6AC00000  
  143. librunperf.so           0x6A800000  
  144. libctest.so             0x6A700000  
  145. libUAPI_jni.so          0x6A500000  
  146. librpc.so               0x6A400000  
  147. libtrace_test.so        0x6A300000  
  148. libsrec_jni.so          0x6A200000  
  149. libcerttool_jni.so      0x6A100000  
  150. libacc.so               0x6A000000  
  151. libbinder.so            0x69F00000  
  152. libskia.so              0x69000000  
  153. libGLES_android.so      0x68800000  
  154. libRS.so                0x68000000  
  155. libaudiopolicygeneric.so 0x67c00000  
  156. librs_jni.so            0x67800000  
  157.   
  158. # Sigma Designs libraries  
  159. libcore.so                      0x61400000  
  160. libdisplay.so                   0x61000000  
  161. libdrm.so                       0x60c00000  
  162. libhw.so                        0x60800000  
  163. 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相关的模块没有编译进内核引起的问题

 

看完这个文章,我想,如果是单独是某些库没有编译进系统的话,可以用相应版本的ld或ldd工具查看这个库依赖了哪些的库,然后确定自己的系统是不是这些so都有了,或者用相应版本objdump的-T选项看so函数的符号表看看哪些函数比较可疑(笨办法),有个思路,还有什么好的调试技巧大家多多交流啊。

posted @ 2013-05-05 10:21  zzzxzzz  阅读(385)  评论(0)    收藏  举报