工具选择与使用
一般Android运行的HW有:
- 32Bit的ARM
- 64Bit的ARM64
- X86
- X64
对于Intel/AMD的X86/X64, 可选的工具比较多, 因为ELF运行的Host是Android, 使用静态反汇编工具Hopper Disassemble与IDA是比较好的选择.
对于32位ARM的ARM, IDA与Hopper Disassemble都可以完成, 但是对于ARM64就只有Hopper Disassemble了, 当然最新的IDA Pro也可以,但是一般难以获取得到.
剩下的方式就是用readelf + Android中的Toolchain中的objdump来完成.
一般情况下, 多种工具需要一起结合使用.
如何快速定位
得到了我们需要反汇编与patch的ELF文件后, 将其拖入到Disassemble工具中, 就可以看到其Disassemble后的不同Section了, 例如Text, Code段. 那么要完成patch, 我们需要找到patch的位置. 对此, 个人总结有3种方式来帮助我们快速定位.
根据字符串来快速定位
一般程序运行的时候会有log输出, 提示是何种错误, 例如对于在servicemanager中的add_service, 那么如果我们的service不在service list中,那么会提示权限不足"Permission Denied", 那么这个字符串就是很好的切入点.
在IDA中我们直接使用Search中的Text即可找到.
编译带有符号的ELF来辅助定位
对于Android代码, 不同板子或者Android设备的ROM一般都是基于AOSP做的修改, 因此绝大地方的代码和AOSP的代码是一样的. 因此我们可以借助AOSP代码来帮助我们定位.
对此第一步是需要获取Android设备上面Android的版本, 这个在关于界面, 或者使用getprop, 或者在/system/build.prop中可以获取tag以及version.
然后我们就可以根据这些信息去下载对应版本的AOSP, 然后选择对应的Arch编译, 编译后, 在out目录中会有一个带有symbol的可供调试用的ELF文件. 这个一般位于:
out/target/product/XXX/symbols/
然后我们可以将这里面的对应的ELF文件拖入到IDA Pro或者其他Disassemble工具中进行查看, 此时因为有Debug 信息, 反汇编的代码与变量等变得很容易被识别, 很容易让我们定位. 例如下面是对bluedroid stack的反汇编:
图片1