0x01 前言
关于android的hook以前一直用的xposed来hook java层的函数,对于so层则利用adbi,但是不知道为什么adbi给我的体验并不是很好,刚好前段时间了解到frida框架支持android、ios、linux、windows、macos,而且在android设备上可以同时hook java、native十分方便,最重要的一点是不需要重启手机,于是就研究了一下
0x02 搭建环境
操作系统:windwos7
移动设备:Nexus 4 (4.4.4)
首先你需要一个android手机,建议使用google系,这样会省去很多麻烦,而且root的话也十分的方便,只需要去SuperSU下载卡刷包或者apk刷个root进去便可。说回来,frida是python的一个模块,所以使用frida的话还需要一些python的基础,一举两得..顺便入了Python的门,发现python是真他娘的好用 : D
安装frida模块
一定要确保你的windows有安装python(2、3的版本我都安装了),在cmd运行下面命令安装frida模块:pip install frida
如果你同时有两个python版本,你可以使用pip2或者pip3来代替pip
下载frida-server导入手机并运行
点击下载frida-server-10.6.28-android-arm.xz,下载解压后用如下命令把frida-server-10.6.28-android-arm推送到手机上adb push frida-server-10.6.28-android-arm /data/local/tmp/frida-server
更改权限并运行adb shell
su
cd /data/local/tmp
chmod 777 frida-server
./frida-server
测试frida能否成功交互
新开一个cmd,并转发端口(好像不转发也是可以的,我后来用的话都没有转发端口)adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
好了,现在我们测试一下frida是否能成功交互,在cmd中输入如下命令:frida-ps -U
测试交互
此时可以看到frida可以成功交互了。
0x03 研究frida
利用命令行工具hook libc.so的open()函数
首先我们知道frida是python的一个模块,那么这样我们当然可以通过写python脚本import frida来实现对frida的利用,此外frida同时会提供几个命令行工具(工具存放在python/Scripts目录下面,所以你可以添加到系统环境变量方便使用),例如frida,可以通过frida -help
查看使用帮助:
frida -help
此外还有frida-ps,还有frida-trace、与frida-dicover,官网上的资料也少,我大概看了看好像也没啥好用的...
继续说回frida这个命令行工具,在上图的帮助信息中我们看到:
"-U" 参数代表我们连接的是远程USB server,同理你也可以使用其他参数来连接,
"-f "参数则表示在手机端启动一个你指定的android程序,那个FILE则表示应用的包名,通常"-f"这个参数配合"--no-pause"参数来使用,因为可能不让进程恢复的话可能会有奇怪的问题,
"-p" 与"-n"命令分别表示attach到进程的名字或者pid,
"-l"参数则是代表需要注入的javascript脚本,而这个javascript的脚本就是我们所写的hook代码,完成函数的hook,内存的dump等一系列功能,所以顺便又可以学一手node.js岂不美滋滋....
当我们使用frida这个命令行工具成功attach到目标进程的时候,frida会给我们返回一个Frida CLI,说明白点就是一个交互窗口,下面我们就能看到。
好了,下面我们就利用frida命令行工具来hook一下chrome浏览器中libc.so的open函数frida -U -f com.android.chrome --no-pause
此次我用的是"-f"参数,也就表示,我需要重新启动这个chrome浏览器,并且attach上去