另外可以参考一个乌云drops的安卓APP动态调试-IDA实用攻略
在看apk逆向的题时,看到这个writeup,它谈到可以用frida来动态插桩,使用Frida你能够在包括安卓在内的许多平台上使用JavaScript来 hook 代码。
参考:
http://www.jianshu.com/p/ca8381d3e094
Frida是一款基于python + javascript 的hook框架,通杀android\ios\linux\win\osx等各平台,基于脚本的交互。
先在你的主力机上安装frida
pip install frida
下载完之后,就会可以使用frida
, frida-ps
等命令了。
然后下载frida-server
待传到android的目录下,执行服务程序
到这个页面,https://github.com/frida/frida/releases,找到frida-server
相关的,比如frida-server-10.1.2-android-arm.xz
,下载下来之后,解压
unxz frida-server-10.1.2-android-arm.xz
得到一个frida-server-10.1.2-android-arm
,这是一个arm平台32位的ELF文件
$ file frida-server-10.1.2-android-arm [3:04:01]
frida-server-10.1.2-android-arm: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped
可重命名也可不,然后将其传到android的目录下
$ adb push frida-server-10.1.2-android-arm /data/local/tmp/ [3:04:06]
[100%] /data/local/tmp/frida-server-10.1.2-android-arm
在android上添加执行权限,然后执行
root@hammerhead:/data/local/tmp # chmod 777 frida-server-10.1.2-android-arm
root@hammerhead:/data/local/tmp # ./frida-server-10.1.2-android-arm
然后转发TCP端口到本地
$ adb forward tcp:27042 tcp:27042
$ adb forward tcp:27043 tcp:27043
测试frida环境,如果出现android手机的进程列表说明搭建成功:
frida-ps -R [3:09:24]
PID Name
----- ----------------------------------------------
2140 DaemonServer
22053 adbd
22849 android.process.acore
8574 android.process.media
251 bridgemgrd
1225 com.android.nfc
1199 com.android.phone
22766 com.android.providers.calendar
20319 com.android.settings
1042 com.android.systemui
21756 com.android.vending
1161 com.baidu.netdisk
1310 com.baidu.netdisk:bdmoservice
21334 com.baidu.netdisk:bdservice_v1
4381 com.eg.android.AlipayGphone
...
得到android手机当前最前端Activity所在的进程
Python 2.7.12 (default, Sep 28 2016, 18:41:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import frida
>>> rdev = frida.get_remote_device()
>>> print rdev
Device(id="tcp", name="Local TCP", type='remote')
>>> front_app = rdev.get_frontmost_application()
>>> print front_app
Application(identifier="siir.es.adbWireless", name="adbWireless", pid=5967)
枚举android所有运行的process
>>> processes = rdev.enumerate_processes()
>>> for process in processes:
... print process
...
Process(pid=1, name="init")
Process(pid=178, name="ueventd")
Process(pid=236, name="healthd")
Process(pid=238, name="servicemanager")
Process(pid=239, name="vold")
Process(pid=240, name="rmt_storage")
Process(pid=241, name="netd")
Process(pid=242, name="debuggerd")
Process(pid=243, name="rild")
Process(pid=244, name="surfaceflinger")
Process(pid=245, name="zygote")
//TODO hook android的native函数
//TODO hook android的java层函数