# 前面水过一篇 "通杀" root
的 frida
脚本,现在有更好的方案过 root
,比如 magisk
的排除列表,定制 rom
,但是对于一部分人而言, frida
脚本还是有必要的,其实有些 root
用脚本过不了,也可能是 frida
被检测了,导致 hook
未生效,今天跟着霜哥一步步魔改了一下 frida
, git
已经有成品:strongR-frida-android
# 从全新的
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 库
# 下面开始配置编译环境
# 官方教程:https://frida.re/docs/building/#gnulinux, 点击
linux
配置的位置#
Ubuntu 18
版本以上应该只需要安装toolchains
和sdk
工具就可以# 可以挂上代理下,会快点,我没挂代理大概用了不到半小时
sudo apt-get install build-essential curl git lib32stdc++-9-dev libc6-dev-i386 nodejs npm python3-dev python3-pip
# 需要安装
toolchains
和sdk
,我先按教程自己编译的工具,但失败了,后来又下载的官方编译好的工具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
验证
# 环境配置成功,就可以着手编译
frida
# 我下载的
14.2.18
版本,需要将frida-deps.vcxproj
和frida.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
下面生成server
,gadget.so
,inject
等文件
# 魔改
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
修改成其他路径# 重新编译,成功
# 验证一下成果 >>>
# 总结
整体来说,编译并不难,我大部分时间也是浪费在配环境上,到目前为止我得虚拟机还不能和主机 直接复制文件,头大。。。懂的大佬教教我,百度都翻烂了😭
参考文章:https://blog.seeflower.dev/archives/16/