frida学习笔记

2023-10-21 11:06:15 浏览数 (1)

说明

因为想学习怎么hook安卓程序,网上搜了一些资料,有xposed和frida两种。 xposed不便于调试,frida方便调试。所以先从学习frida入手。 以下过程是本菜鸡参考网络教程实践的坎坷路程,记录下来以备以后自己重复时参考。

电脑端安装frida

第一步查资料安装,需要先安装python,直接到python官网(https://www.python.org/downloads/ )下载windows版本安装。

下载后打开,一路next完成。

踩坑:我尝试过在windows store内安装python,装好后不带pip。手动安装pip后再安装frida,安装完成后无法运行frida命令。然后卸载后又手动安装的官网版python。

然后就是按照网上教程,打开命令行窗口,运行:

特别注意:一定要在安装完python后打开一个新的命令行窗口。因为安装python时自动添加的path变量不能在以前打开的命令行窗口生效。这是windows自己的问题。

代码语言:javascript复制
pip install frida
pip install frida-tools

安装完成后运行frida --version测试是否成功,并记住版本号。后面安装frida-server时要选择一致的版本。

安卓端安装frida-server

安装ADB

安装frida-server需要通过adb连接安卓。我以前没有装过,所以需要先安装ADB。 ADB下载地址:https://dl.google.com/android/repository/platform-tools-latest-windows.zip 解压保存。然后把保存路径添加到环境变量PATH。记得添加PATH新路径后再重新打开一个命令行窗口,以使新添加的路径生效。 安卓模拟器打开USB调试,用下面命令查看设备是否已连接

代码语言:javascript复制
adb devices

运行adb shell input keyevent 4测试按下返回键有没有反应,模拟器内有反应,说明ADB连接成功。

如果提示adb.exe: more than one device/emulator错误,并且运行adb devices显示有多个设备,多余的设备为offline状态,可以尝试运行adb kill-server命令解决,如果没用,再运行taskkill /f /im adb.exe 如果确实有多个设备,可以用-s参数指定连接哪个设备。例如:adb -s emulator-5554 shell

安装frida-server

运行下面命令查看安卓CPU架构,下载frida-server时需要用。

代码语言:javascript复制
adb shell getprop ro.product.cpu.abi

我用的安卓虚拟机,所以该命令输出了x86,如果是手机,应该是arm之类的。 frida-server下载地址:https://github.com/frida/frida/releases 打开后点Show all 247 assets查看所有的下载链接(里面247数字可能有变化)。 我选择下载对应的frida-server-16.0.9-android-x86.xz,因为我刚才安装的电脑端frida版本是16.0.9,安卓模拟器CPU架构是x86。 下载的是 .xz结尾的文件,应该是一种压缩格式。我用7zip解压的。 然后把解压后的文件发送到安卓。这个文件要保存在命令行窗口的当前文件夹下,我自己尝试使用绝对路径不行。

代码语言:javascript复制
adb root
adb push frida-server-16.0.9-android-x86 /data/local/tmp
运行frida-server

命令如下:

代码语言:javascript复制
adb shell
su
cd /data/local/tmp
chmod 777 frida-server-14.2.18-android-arm
./frida-server-14.2.18-android-arm

运行完以上命令,命令行窗口会进入阻断状态,无法再输入新的命令。如果要结束frida-server,按CTRL C

端口映射

这步需要新开一个命令行窗口

代码语言:javascript复制
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

运行下面命令查看安卓内进程,有输出列表说明一切正常:

代码语言:javascript复制
frida-ps -U
frida-ps

frida-ps用法

代码语言:javascript复制
# 查看所有进程(不显包名)
frida-ps -U

# 查看正在运行的进程List running applications(显包名,好像是只显示有图形界面的程序)
$ frida-ps -Ua

# 查看安装了的app List installed applications
$ frida-ps -Uai

HOOK测试

模式

frida hook有两种模式,如下

1. attach模式

attach到已经存在的进程,核心原理是ptrace修改进程内存。如果此时进程已经处于调试状态(比如做了反调试),则会attach失败。

2. spawn模式

启动一个新的进程并挂起,在启动的同时注入frida代码,适用于在进程启动前的一些hook,比如hook RegisterNative函数,注入完成后再调用resume恢复进程。

未完待续

收集的可能有用的代码

显示进程所有模块信息(Python)

用法:保存为文件,例如getmodule.py,然后运行python getmodule.py "进程名"。该代码只能获取已经在运行的进程模块信息。 这是网上找来的,我做了部分修改:原来是固定进程名,我改为可以传参设置进程名;显示模块大小;显示非系统自带(/system/lib下)模块的路径。

代码语言:javascript复制
import frida
import sys

def on_message(message, data):
    print("[{}] => {}".format(message, data))

def main(target_process):
    session = process = frida.get_usb_device().attach(target_process)

    script = session.create_script("""
        Process.enumerateModules({
        onMatch: function(module){
            var reg=RegExp(/system/);
            if(module.path.toString().match(reg)){
              console.log('Module name: '   module.name   " - "   "Base Address: "   module.base.toString()   " size:"   module.size/1024   "k");
            }else{
              console.log('Module name: '   module.name   " - "   "Base Address: "   module.base.toString()   " size:"   module.size/1024   "k path:"   module.path);
            }

        }, 
        onComplete: function(){}
    });
    """)
    script.on("message", on_message)
    script.load()
    print("[!] Ctrl D or Ctrl Z to detach from instrumented program.nn")
    sys.stdin.read()
    session.detach()

if __name__ == "__main__":
    main(sys.argv[1])

本文参考资料: https://juejin.cn/post/6970941426930548767 https://blog.csdn.net/weixin_38819889/article/details/119845994 https://blog.csdn.net/cyjmosthandsome/article/details/120906998 HOOK详细一点的教程:https://www.jianshu.com/p/d4a44f803f33 python传参:https://blog.csdn.net/helloasimo/article/details/124210144 ADB错误:https://blog.csdn.net/gaojinshan/article/details/9455193 Frida获取所有模块名:https://www.jianshu.com/p/2524571eed86

0 人点赞