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

没有实际内容,乖乖的先试试调用吧。过程就不多说了,直接上写好的调用代码。
点击查看代码
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,有兴趣的同学可以研究研究。
实际上这样调用只能单机单号使用,我使用上面的调用写了登录,但是在使用查询功能时,有些请求不被接受,推测是有地方做了检测,有料了再说吧。
浙公网安备 33010602011771号