# 前面水过一篇 "通杀" rootfrida 脚本,现在有更好的方案过 root ,比如 magisk 的排除列表,定制 rom ,但是对于一部分人而言, frida 脚本还是有必要的,其实有些 root 用脚本过不了,也可能是 frida 被检测了,导致 hook 未生效,今天跟着霜哥一步步魔改了一下 fridagit 已经有成品:strongR-frida-android

  1. # 从全新的 ubuntu 系统搞起

    • 下面是我刚安装的虚拟机,纯净无污染。

    • # 切换 linux 下载源

    • # 选择中国科技大学的镜像

    • # 更新一下
      sudo apt-get install upgrade
    • # 安装 proxychains
      sudo apt-get install proxychains
    • # 配置代理
      sudo gedit /etc/proxychains.conf 
      # 在打开的文件中添加自己的 ip 和 vpn 的工作端口 比如:socks5 xxx.xxx.xxx.xxx 7890

    • # 两次返回 ip 不同,就 ok
      curl www.httpbin.org/ip

    • # 安装 python lief 库,魔改时候要用
      pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple	# 更换 pip 下载源
      pip install lief  # 安装 lief 库

  2. # 下面开始配置编译环境

    • # 官方教程:https://frida.re/docs/building/#gnulinux, 点击 linux 配置的位置

    • # Ubuntu 18 版本以上应该只需要安装 toolchainssdk 工具就可以
      # 可以挂上代理下,会快点,我没挂代理大概用了不到半小时
      sudo apt-get install build-essential curl git lib32stdc++-9-dev libc6-dev-i386 nodejs npm python3-dev python3-pip

    • # 需要安装 toolchainssdk ,我先按教程自己编译的工具,但失败了,后来又下载的官方编译好的工具
      git clone -b 14.2.18 --recurse-submodules https://github.com/frida/frida  # -b 后面跟版本号
      cd frida
      make -f Makefile.toolchain.mk  # 编译 toolchains 成功

    • # 编译 sdk 报错,尝试了几遍无果,就放弃了。
      make -f Makefile.sdk.mk FRIDA_HOST=linux-x86_64

    • # 手动下载工具,先查看当前版本 frida 需要的工具版本
      cd releng
      cat deps.mk | head -n 10  # 查看 deps.mk 的前 10 行, 版本是 20210419

    • # 下载对应版本工具
      https://build.frida.re/deps/20210419/toolchain-linux-x86_64.tar.bz2  # toolchains 工具
      https://build.frida.re/deps/20210419/sdk-linux-x86_64.tar.bz2  # sdk 工具
      # 下面是需要编译的对应架构的文件
      https://build.frida.re/deps/20210419/sdk-android-x86.tar.bz2
      https://build.frida.re/deps/20210419/sdk-android-x86_64.tar.bz2
      https://build.frida.re/deps/20210419/sdk-android-arm.tar.bz2
      https://build.frida.re/deps/20210419/sdk-android-arm64.tar.bz2

    • # 将下载的文件放到 frida 下面的 build 文件中,没有就自己创建

    • # 然后执行 releng 文件夹下面的 setup-env.sh
      ./releng/setup-env.sh

    • # 查看当前 frida 版本所需的 NDK 版本
      cat setup-env.sh | grep ndk

    • # 下载 r22 版,官网地址:https://developer.android.com/ndk/downloads, 找到 r22 版本下载连接,最好挂着代理下
      proxychains wget https://dl.google.com/android/repository/android-ndk-r22b-linux-x86_64.zip

    • # 解压到桌面

    • # 配置环境变量,在 ~/.bashrc 文件中添加两行
      sudo gedit ~/.bashrc # 打开文件
      export ANDROID_NDK_ROOT=/home/wen/Desktop/myFrida/android-ndk-r22b  # 注意路径不能错
      export PATH=$ANDROID_NDK_ROOT:$PATH

    • # 配置完输入 ndk-build -v 验证

  3. # 环境配置成功,就可以着手编译 frida

    • # 我下载的 14.2.18 版本,需要将 frida-deps.vcxprojfrida.mk 中的 master 修改为 main

    • # 查看 build 文件夹下是否有头文件 frida-version.h ,如果没有就手动创建,然后根据自己编译版本填入下面代码
      #ifndef __FRIDA_VERSION_H__
      #define __FRIDA_VERSION_H__
      #define FRIDA_VERSION "14.2.18"
      #define FRIDA_MAJOR_VERSION 4
      #define FRIDA_MINOR_VERSION 2
      #define FRIDA_MICRO_VERSION 18
      #define FRIDA_NANO_VERSION 0
      #endif
    • # 然后返回到 frida 目录下,开始编译 frida ,比如下面编译 android arm64 架构对应 frida
      make core-android-arm64

    • # 编译完在 build/tmp-android-arm64 下面生成 servergadget.soinject 等文件

  4. # 魔改 frida

    • # 根据 hluwa 大佬的 patch 进行魔改 https://github.com/AAAA-Project/Patchs/tree/master/strongR-frida/frida-core
    • # 修改 frida-rpc 特征

    • # 修改 re.frida.server 特征

    • # 修改 linjector 字符串

    • # 修改 frida-agent-<arch>.so 字符串,且增加了个 anti-anti-frida.py 文件

    • # 修改增加的 anti-anti-frida.py 文件,针对线程名 gum-js-loop
      import lief
      import sys
      import random
      import os
      if __name__ == "__main__":
          input_file = sys.argv[1]
          print(f"[*] Patch frida-agent: {input_file}")
          random_name = "".join(random.sample("ABCDEFGHIJKLMNO", 5))
          print(f"[*] Patch `frida` to `{random_name}``")
          binary = lief.parse(input_file)
          if not binary:
              exit()
          for symbol in binary.symbols:
              if symbol.name == "frida_agent_main":
                  symbol.name = "main"
              if "frida" in symbol.name:
                  symbol.name = symbol.name.replace("frida", random_name)
              if "FRIDA" in symbol.name:
                  symbol.name = symbol.name.replace("FRIDA", random_name)
          all_patch_string = ["FridaScriptEngine","GLib-GIO","GDBusProxy","GumScript"]
          for section in binary.sections:
              # print(section.name)
              if section.name != ".rodata":
                  continue
              for patch_str in all_patch_string:
                  addr_all = section.search_all(patch_str)
                  for addr in addr_all:
                      print("current section name="+section.name,"offset=",hex(section.file_offset+addr))
                      patch = [ ord(n) for n in list(patch_str)[::-1]]
                      binary.patch_address(section.file_offset+addr,patch)
          binary.write(input_file)
          # gum-js-loop thread
          random_name = "".join(random.sample("abcdefghijklmn", 11))
          print(f"[*] Patch `gum-js-loop` to `{random_name}`")
          os.system(f"sed -b -i s/gum-js-loop/{random_name}/g {input_file}")

    • # 修改 anti-anti-frida.py 文件,针对线程名 gmain
      # gmain thread
          random_name = "".join(random.sample("abcdefghijklmn", 5))
          print(f"[*] Patch `gmain` to `{random_name}`")
          os.system(f"sed -b -i s/gmain/{random_name}/g {input_file}")

    • # 根据前两个修改,增加针对线程名 gdbus 的修改
      # gdbus thread
          random_name = "".join(random.sample("abcdefghijklmn", 5))
          print(f"[*] Patch `gdbus` to `{random_name}`")
          os.system(f"sed -b -i s/gdbus/{random_name}/g {input_file}")
    • # 修改掉抛异常的地方

    • # 将所有的 /data/local/tmp 修改成其他路径
    • # 重新编译,成功

    • # 验证一下成果 >>>
      • # 官方 server

      • # 魔改 server,能过掉一部分检测,还算成功,端口设置一下就可以过了,懒得弄。。

  5. # 总结

    整体来说,编译并不难,我大部分时间也是浪费在配环境上,到目前为止我得虚拟机还不能和主机 直接复制文件,头大。。。懂的大佬教教我,百度都翻烂了😭

​ 参考文章:https://blog.seeflower.dev/archives/16/

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

渣渣文 微信支付

微信支付

渣渣文 支付宝

支付宝