Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

小白的 frida hook 教程 #181

Open
lovelmh13 opened this issue Aug 5, 2023 · 0 comments
Open

小白的 frida hook 教程 #181

lovelmh13 opened this issue Aug 5, 2023 · 0 comments

Comments

@lovelmh13
Copy link
Owner

lovelmh13 commented Aug 5, 2023

前言

因为在网上找的教程都或多或少有一些不完整,没讲明白的地方。自己踩了一些坑。这里记录一下完整的安装配置的流程

因为我是前端,这里很多东西都是第一次设计,所以会啰嗦的尽量详细的都讲一遍怎么安装和配置

所需安装的软件

  1. python 环境
  2. 夜神模拟器,试过 mumu 和夜神,最后选了它,因为它自带了 adb,mumu 我没有看有没有
  3. charles —— 抓包,用习惯了
  4. frida —— 对代码进行 hook 的工具
  5. 准备个要 hook 的 apk 安装包,我用了某鱼的
  6. jadx-gui —— 反编译包,用来找要 hook 的代码的

安装步骤

python 环境

macOS 自带 python 环境,后面我们要用 pip 来装 frida 所以需要它。

不过自带的 python 环境是 2.7 的,在用对应版本的 pip 安装 frida 会有报错,所以我们第一步要准备一个 3.x 的 python 环境。

不推荐直接升级系统自带的 python 环境,我们先安装 Conda 来管理 python 环境(把 Conda 相成 nvm,类比 nvm 管理 node 版本一样,Conda 也是可以管理多个 python 环境,是个 python 版本管理工具)。

进入 Conda 网站,去下载安装包。

安装好了以后,在终端执行 python --version,应该就不是 2.7 而是 3.11.3 了,这是已经被 Conda 设置为了默认的版本,但是如果用 vs code 的终端,会发现还是 2.7,这里我暂时没有管,现在 iTerm 里能用了再说。

如果想要切换其他的版本,可以这样:

#创建一个 3.5 的环境
conda create --name py35 python=3.5

#激活它
source activate py35

安装模拟器

官网下载对应系统的模拟器。
并安装要 hook 的 apk 包。
设置里已经默认开启了 root 权限。
剩下的配置我们后面用到的时候在说

安装、启用 frida

安装

安装方式,两个装:

pip install frida-tools
pip install frida 

然后,我们需要安装 frida-server,这个我们一定要安装跟 frida 版本一致的。
我输入 frida --version 并看不到 frida 版本,所以是在 pip 安装的时候就看的安装的版本。
我的 frida 是 16.1.3,那么就在这里,到找 frida-inject-16.1.3-android-x86.xz 下载并解压。
这里我提供的下载地址只是 16.1.3,如果要换成别的版本,就把 url 上的 tag/16.1.3 换成对应的版本就可以了。
文件找 -android-x86.xz 结尾的,其他的不用管

然后使用 adb 工具将解压后的产物放到模拟器内部
adb 不用我们自己安装,夜神模拟器的目录里有 adb,我们可以直接用。
进入夜神模拟器的目录下(/Applications/NoxAppPlayer.app/Contents/MacOS 这个目录根据自己安装的情况找),找到 adb,执行 push 命令

./adb push /Users/xxx/Downloads/frida-server-16.1.3-android-x86 /data/local/tmp/ # 第一个参数是文件的路径,第二个参数是要放到的模拟器系统的目录(是安卓系统里的目录,不是咱们的电脑里的目录,所以在电脑里是找不到的)

image

启用

然后依然是使用 adb,来启动 frida-server

./adb shell # 启动 shell
su
chmod 777 /data/local/tmp/frida-server-16.1.3-android-x86 # 给 frida-server 读写权限,如果可以直接启动 frida-server 的话,也可以省略这步
data/local/tmp/frida-server-16.1.3-android-x86 # 启动 frida-server

image

然后不要关这个终端,我们再开启一个终端,执行 frida-ps -U 看一下有没有东西,是否开启成功了
image
有列表了,就说明我们 frida-server 开启成功了,如果没有我们要的对应 app,那么就在模拟器里点击 app, 把它打开,再重新执行一下就有了,以闲鱼为例:
image

安装 charles

安装

官网下载,注册网上搜一下就有,不注册也一样可以用

配置

给电脑安装证书

这一步是让电脑可以抓网站的包的,跳过也行
Snipaste_2023-08-06_01-06-47

image

这里安装证书,然后到钥匙串访问中找到这个证书,改为「始终信任」

配置 proxy settings 和 SSL Proxying Settings

给电脑安装了证书,但是抓包的时候依然显示 unknown,需要配置一下这两个地方
image
image

image
image

给模拟器安装证书

给模拟器安装证书,不能够简单的在模拟器里打开浏览器,直接访问 chls.pro/ssl 这样安装,这样只是安装到了用户里面,需要安装到系统才可以顺利抓包

  • 先在模拟器中代理到电脑的 ip
    ip 可以通过 ifconfig 或者 option+点击 wifi 图标查看
    image
    image
    image

  • 导出 charles 证书, 并重命名
    image
    我选择的是导出 pem, 使用终端命令,来查看 hash 值,并把它复制出来把这个证书文件改名为 hash.0:
    openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate.pem

image ![image](https://github.com/lovelmh13/myBlog/assets/27727987/89e47ef7-9637-4c83-b156-5c46c47378d0)
  • 保存到模拟器的系统目录下
    同样使用 adb push
./adb push /Users/xxx/Downloads/52e594d4.0 /system/etc/security/cacerts/

image

然后就可以在设置 - 安全 - 信任的凭据 - 系统下面找到它了
image

jadx-gui 安装

这个是来用反编译 apk 包的,我们直接去官网下载,然后安装,如果提示我们需要 java 依赖,就根据它提示给的网站进去直接下载安装就好了。

使用 frida 来进行 hook

这里以闲鱼为例,我想抓包闲鱼,但是因为闲鱼是走的 spdy 协议,不是 http 协议,所以不能被抓包,我们需要强制关闭 spdy 协议让它走 http 协议。

先用 jadx-gui 打开闲鱼的 apk,然后找到对应的代码
image
然后就可以对这个方法进行 hook:

import frida, sys
def on_message(message, data):
    print("[%s] => %s" % (message, data))


pid = 0
device = frida.get_usb_device(1000)
process = device.enumerate_processes()

for data in process:
    if data.name == "闲鱼":
        pid = data.pid
        break
session = device.attach(pid)



uuid = '''
    Java.perform(
        function(){
                console.log("############################ Frida 开启 ############################");
                /* 此处是 hook 关闭 spdy 协议 */
                const switchConfigSession = Java.use("mtopsdk.mtop.global.SwitchConfig");
                if (switchConfigSession) {
                    console.log(`------>定位到类名: ${switchConfigSession}`);
                    switchConfigSession.C.implementation = function(){
                        console.log(`------>定位到函数: is_enableSpdy`);
                        return false;
                        }
                };
'''

script = session.create_script(uuid)
script.on('message', on_message)
script.load()
sys.stdin.read()

这里 uuid 写的是 js 代码。我们拦截了 mtopsdk.mtop.global.SwitchConfig ,对里面的 C 方法进行重写,改成返回 false,就关闭了 spdy。

从网上找别人的教程,是 hook 的 A 方法,我复制过来尝试发现不管用,所以用了 jadx-gui 反编译,自己找代码,发现我用的安装包,换成了 C 方法,所以这里改成了 C 就可以了。

使用 hook

我们先启动 frida-server,在上面的「安装、启用 frida」里面有,然后再执行 pythone 代码 python ./code.py,代码可以正常跑起来不报错就成功了

参考文章:
Charles+frida抓包闲鱼APP
Android 添加系统受信任证书,解决 Charles、Fiddler 等 HTTPS 抓包报错问题
mac本安装Frida

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant