Tiktok逆向之使用Frida调用四神算法

说下我使用frida搭建的一个手机上的服务来调用四神算法,听说这种叫白盒调用,至于为什么不去分析算法,我想初次分析到这里的同学也清楚,so层的代码混条的他妈都不认识,在IDA pro 中F5算法函数就是下面的结果:

图片1

没有实际内容,乖乖的先试试调用吧。过程就不多说了,直接上写好的调用代码。

点击查看代码
rpc.exports.invokefun = function(so_name, fun_offset, url, header) {
    // 初始化返回值变量
    var result = null;

    // 输出目标SO库的名称,用于调试
    console.log(so_name);

    // 查找指定SO库的基地址,如果没有找到,则返回null
    var so_address = Module.findBaseAddress(so_name);
    if(so_address === null){
        // 如果没有找到SO库的地址,直接返回null
        return null;
    }

    // 输出SO库的基地址,用16进制表示,方便调试
    console.log(so_name + ":" + so_address.toString(16));

    // 计算函数地址,使用传入的偏移量
    var fun_address = new NativePointer(Number(so_address) + Number(fun_offset)); 

    //-----------------------------------
    // 定义返回类型和参数类型
    var return_type = 'pointer';  // 假设返回类型为指针(pointer)
    var arg_types = ['pointer', 'pointer'];  // 假设函数有两个参数,都是指针(pointer)

    // 创建一个NativeFunction实例,表示该SO库中的本地函数
    var native_fun = new NativeFunction(fun_address, return_type, arg_types);

    // 输出创建的本地函数的地址,用16进制表示
    console.log("nativeFunction:" + native_fun.toString(16));
    //-----------------------------------

    // 为URL分配内存空间并转化为UTF-8字符串,去掉多余的引号
    var url_ = Memory.allocUtf8String(url.replace(/"/g, ""));

    // 为Header分配内存空间,处理换行符并去掉多余的引号
    var header_ = Memory.allocUtf8String(header.replace(/\\r\\n/g, "\r\n").replace(/"/g, ""));

    // 调用本地函数,并读取返回的字符串结果
    result = Memory.readCString(native_fun(url_, header_));

    // 返回调用结果
    return result;
}

传入so名,函数偏移,以及参与计算的两个函数,返回计算结果
下面使用python写一个连接frida_server的调用算法的服务

点击查看代码
from flask import Flask, request, json
import frida
import base64

# 目标设备的主机地址和Frida脚本路径
host = "192.168.11.180:28043"
call_script = "./frida_http_service.js"
app = Flask(__name__)

# 输出设备管理器,列出可用设备
print(frida.get_device_manager().enumerate_devices())

# 添加远程设备,连接到指定的Frida设备
device = frida.get_device_manager().add_remote_device(host)

@app.route('/invoke_so_function', methods=['POST'])
def invoke_so_function():
    # 从请求的JSON数据中提取相关参数
    package_name = request.json.get('package_name')  # 应用包名
    so_name = request.json.get('so_name')  # SO库名称
    fun_offset = request.json.get('fun_offset')  # 函数偏移量
    url = base64.b64decode(request.json.get('url')).decode('utf-8')  # 解码URL(base64)
    header = base64.b64decode(request.json.get('header')).decode('utf-8')  # 解码Header(base64)

    # 调用frida_hook函数,进行Frida注入操作
    result = frida_hook(package_name, so_name, fun_offset, json.dumps(url), json.dumps(header))

    # 将结果编码为base64并返回
    return base64.b64encode(result.encode('utf-8'))

def frida_hook(package_name, so_name, fun_offset, url, header):
    # 可以在此处定义一个消息处理回调函数,用于调试和捕获Frida脚本的消息
    # def on_message(message, data):
    #    print(message)
    
    # 连接到指定的应用程序进程
    session = device.attach(package_name)
    
    # 读取并加载Frida脚本
    with open(call_script, 'r', encoding='utf-8') as f:
        script_code = f.read()  # 获取Frida脚本的内容
    
    # 创建Frida脚本并加载
    script = session.create_script(script_code)

    # 可以在此处监听脚本的消息
    # script.on('message', on_message)
    
    # 加载并运行Frida脚本
    script.load()
    
    # 调用脚本中的exported函数,并传递必要的参数
    result = script.exports.invokefun(so_name, fun_offset, url, header)

    # 分离会话,释放资源
    session.detach()
    
    # 返回结果
    return result

# 启动Flask应用,监听0.0.0.0接口,端口为5889
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5889)

上面的服务我使用网络连接的frida_server,在想想办法让服务在本身的输出算法手机上运行,手机是不是就变成了一个纯纯的算法服务器,只记得曾经使用termux安装过python,有兴趣的同学可以研究研究。
实际上这样调用只能单机单号使用,我使用上面的调用写了登录,但是在使用查询功能时,有些请求不被接受,推测是有地方做了检测,有料了再说吧。

posted @ 2025-08-01 21:28  q1148562344  阅读(278)  评论(0)    收藏  举报