超详细的mac环境下编译魔改frida-server


前言

对于frida的编译和魔改想必大家都已经不陌生了,看雪上一搜一大堆,但是大神们基本都是基于ubuntu环境搞的,今天就记录下我在mac环境下编译的详细步骤,其实大体上一致,区别就在于编译环境搭建和负责去特征的anti-anti-frida.py脚本有些差异


一、编译最新版本

frida官网对于编译环境和编译步骤已经做了描述,如下图:
在这里插入图片描述
好了,下面就开始咔咔一顿操作吧。。。

1.搭建环境

  • xcode命令行工具
mac电脑基本都自带xcode工具,没有的话AppStore搜索安装就可
  • python 环境
要求3.10, 但是我3.7.0也可以
  • Node.js
这个就老老实实整最新版本v19.0.1,因为我用老版本编译失败了
官网(https://nodejs.org/en/download/current/)下载安装包或者brew install node都可
安装完终端测试下node -v 和 npm -v 命令没问题就ok

2.代码下载

git clone --recurse-submodules https://github.com/frida/frida.git #包括了所有子模块
这里多说一嘴吧:
1.如果clone时忘了下子模块或者clone所有子模块时有失败时候该怎么办 : 执行 git submodule update --init 直到没有出错信息
2.最后检查各子模块状态是否正常:git submodule status

3.编译

(1)首先想要编译Android平台的肯定是要依赖NDK,在frida源码目录下releng/setup-env.sh搜索ndk_required就可看到需要的版本;这里记住一定要在NDK下载地址中选择darwin版本下载安装,否则编译时在ndk目录下找不到darwin目录下的静态库哦!别怪我没提醒你~
在这里插入图片描述
(2)终于可以开始编译了,执行make命令可以显示编译架构信息。设置临时ndk环境变量开始编译即可,这里我就用arm64举例了

export ANDROID_NDK_ROOT=/Users/xxx/program/ndk/android-ndk-r24-darwin && make core-android-arm64

顺利的话,上个厕所的功夫就编译完成了。将build/frida-android-arm64/bin/frida-server push到手机里就测试下没问题就完活

二、魔改再编译

1.切换到指定tag:15.1.12

clone下来的代码最新的是16.0.2, 因为常用15.1.12版本,所以先切换下本地代码

git checkout 15.1.12 #切换tag
git submodule update --recursive #其他子模块也跟着一起更新下

2.打hluda patch

git clone https://github.com/hluwa/Patchs.git
cd frida/frida-core
git am Patchs/strongR-frida/frida-core/*.patch

3.编译

(1)切换到老tag编译应该都会遇到下面这个问题,因为frida已将默认分支从master切换到main

报错:
make[1]: *** No rule to make target '.git/refs/heads/master', needed by 'build/frida-version.h'.  Stop.

解决办法就是将下面这次commit的改动直接恢复就行了
https://github.com/frida/frida/commit/e4c6a1e646666284ea77c36d61f20558504847b5
就两个文件releng/frida-deps.vcxproj和releng/frida.mk,别犹豫,直接把master替换成main就完事

(2)编译(命令同上)

export ANDROID_NDK_ROOT=/Users/xxx/program/ndk/android-ndk-r24-darwin && make core-android-arm64

(3)编译之后strings查看frida-server文件字符串,发现frida-core/src/anti-anti-frida.py脚本的sed貌似没有生效,这里我修改了下,可以再对frida-server执行一下,代码我贴到下面:

import lief
import sys
import random
import os

def execute_command(command):
    result = os.popen(command).read()
    return result

def hex_str(input_str):
    return "".join(execute_command('echo %s | hexdump |head -n 1'%(input_str)).split(' ')[1:len(input_str) + 1]).upper()

def replace_hex_file(source, target, input_file):
    tmp_file = os.path.join(os.path.dirname(os.path.abspath(input_file)), "tmpfile")
    # hexdump -ve '1/1 "%.2X"' file1 | sed 's/420224/121224/g' | xxd -r -p > new_updated
    execute_command("hexdump -ve '1/1 %s' %s | sed 's/%s/%s/g' | xxd -r -p > %s"%('"%.2X"', input_file, source, target, tmp_file))
    execute_command("mv %s %s"%(tmp_file, input_file))

if __name__ == "__main__":
    input_file = sys.argv[1]
    random_name = "".join(random.sample("ABCDEFGHIJKLMNO", 5))
    print(f"[*] Patch file [{input_file}] `frida` to `{random_name}`")

    binary = lief.parse(input_file)

    for symbol in binary.symbols:
        if symbol.name == "frida_agent_main":
            symbol.name = "main"
        
        if "frida" in symbol.name:
            print(f"frida in {symbol.name}")
            symbol.name = symbol.name.replace("frida", random_name)

        if "FRIDA" in symbol.name:
            print(f"FRIDA in {symbol.name}")
            symbol.name = symbol.name.replace("FRIDA", random_name)

    binary.write(input_file)

    # gum-js-loop thread
    t_feature1 = "gum-js-loop"
    hex_feature = hex_str(t_feature1)
    random_name = "".join(random.sample("abcdefghijklmn", len(t_feature1)))
    print(f"[*] Patch `gum-js-loop` to `{random_name}`")
    #os.system(f"sed -b -i s/gum-js-loop/{random_name}/g {input_file}")
    hex_random_name = hex_str(random_name)
    replace_hex_file(hex_feature, hex_random_name, input_file)

    # gmain thread
    t_feature2 = "gmain"
    hex_feature = hex_str(t_feature2)
    random_name = "".join(random.sample("abcdefghijklmn", len(t_feature2)))
    print(f"[*] Patch `gmain` to `{random_name}`")
    #os.system(f"sed -b -i s/gmain/{random_name}/g {input_file}")
    hex_random_name = hex_str(random_name)
    replace_hex_file(hex_feature, hex_random_name, input_file)

到这里对于frida线程名/文件名特征的修改就结束了,拿着魔改的frida-server试试去吧


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 您好!要学习如何使用Xshell提示符,请按以下步骤操作: 1. 打开Xshell软件并连接到您的主机。 2. 在命令提示符处键入命令或命令序列。 3. 按“Enter”键来执行命令或命令序列。 以下是一些您可能会发现有用的基本命令: - cd:更改当前目录。 - ls:列出当前目录中的文件和目录。 - pwd:显示当前工作目录的路径。 - mkdir:创建新目录。 - rm:删除文件或目录。 - scp:安全地复制文件。 希望这些信息能够帮助您使用Xshell提示符! ### 回答2: Xshell是一款Windows平台下的SSH(Secure Shell)和Telnet客户端软件,可以连接到远程服务器进行管理和操作。当你打开Xshell时,可能会看到提示信息“type `help' to learn how to use xshell prompt”。 这则提示信息告诉用户可以在Xshell命令行中输入`help`来获取命令的帮助信息。Xshell提供了丰富的命令行工具来方便用户使用,通过输入`help`可以查看这些命令行工具的帮助信息。比如,我们要查看ssh命令的帮助信息,只需在Xshell命令行中输入`help ssh`,就可以得到ssh命令的用法和参数说明。 除了`help`命令之外,Xshell还提供了许多其他实用的命令行工具,比如`cp`命令可以复制文件,`ls`命令可以列出目录中的文件,`rm`命令可以删除文件等等。这些命令行工具可以让用户更加便捷、高效地进行远程服务器管理和操作。 此外,Xshell还提供了一些高级功能,比如自动化任务,用户可以通过编写脚本进行一些常规操作,从而提高工作效率。 综上所述,当我们看到提示信息“type `help' to learn how to use xshell prompt”时,应该首先思考如何使用命令行工具来管理和操作服务器,而不是用鼠标点来点去。因为命令行工具不仅可以提高工作效率,还可以避免误操作,保证数据的安全性。在使用Xshell时,我们应该熟悉这些命令行工具的用法和参数,以便更加高效地管理和操作远程服务器。 ### 回答3: XShell是一款著名的远程登录工具,通过该工具,用户可以实现远程服务器的连接和操作。在使用XShell时,如果您不熟悉它的命令行操作方式,可以通过输入help来了解如何使用XShell命令提示符。 输入help后,会显示出XShell的帮助菜单,其中包含了本工具中常用的命令及其功能描述。 例如,help命令将显示以下内容: Connection commands: connect 向远程服务器发起连接 disconnect 断开连接 ... File Transfer commands: sz [filename ...] 向服务器发送文件 rz [filename ...] 从服务器接收文件 ... 此外,通过help,我们还可以了解XShell还支持哪些协议,比如FTP、SSH、SFTP等协议,以及它们各自的命令。如果您需要使用这些功能,可以通过help查看相应命令的使用方法和示例。 总之,通过help命令,您可以了解XShell中提供的常见命令及其用途,从而更加方便地实现对服务器的远程操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值