前言
这两天在分析mac程序数据 ,偶尔翻到了以前写的frida代码,如下
那个时候刚刚接触frida 调试Mac电脑上的程序,通过tcp转发到自己写的分析数据的工具上…(专门研究了一下Python的异步编程,libuv啥的…)
每隔那么久翻到自己写的代码 就有一种吃屎的感觉!!!
为什么写这个工具 我写所有的工具都是表明我懒 所以就写了个小工具 lftools,名字随便取的 工具其实也没太大用 纯纯记录一下文章
lftools
封装了frida底层库,不依赖于Python环境 (自己以前装frida 装Python 那么简单的事情 但是累 !), 顺便写了个rpc http调用
支持环境
本人是在Win的虚拟机 Ubuntu编译跑的 所以软件运行环境 就是Linux _x86_64
当然你被调试的客户端是需要 frida-server 可自行下载对应的平台
运行截图
-
调试mac程序
-
usb数据线调试移动端
-
win 附加一些exe 调用算法 做成rpc 调用
启动
配置文件
配置文件在confi目录下的app.yaml
app:
name: lftools # 应用名称
enable: true # 是否开启http调用服务
port: 9722 # 监听端口
ratelimit: '50ms' # 速率限制 防止频繁调用
call_timeout: '5s' # 调用函数的超时时间防止阻塞 默认5s
selected: 'hook' # 选择的配置节点 名字随便取 但是要对应下面的节点名称
hook:
id: 'HA20DDAV' # 设备id 仅在Usb连接有效
script: 'script/index2.js' # JS 脚本路径
model: 1 # 默认 0 name 1 path
target_name: 'XX' # 注入的应用名称 直接attach
target_path: 'com.lemon.demo' # 应用程序完整路径(Spawn 模式有效)
remote_attach: false # 是否远程注入 不开启就是数据线调试
host: "192.168.0.106:6666" # 需要被注入的地方开启 frida-server -l 0.0.0.0:6666
稍微说明一下配置文件
- app 就是http服务 调用js公开的rpc函数
- ratelimit 内置速率限制 防止有些call 请求过快
- call_timeout 防止调用call阻塞 默认就是5s (5s你的call都不返回数据 哪还有什么好说的 丢垃圾桶)
- hook 配置就是一些调试工具 http可有可无这个是必须配置的 无法就是把命令行转成了配置文件(懒!每次都输)
也可以 配置多个 但是 selected需要更改节点的名称!!!
运行
配置好了就可以运行了 ./lftools
如果没有权限就先执行这个 chmod 777 lftools
以下是一个完整的运行过程 说明
# 这是一个启动的过程
$ ./lftools
[N] 2024/09/14 10:07:41
阿银的Frida调试小工具 v0.0.2:
[I] 2024/09/14 10:07:41 lftools Starting server port:9722 #你配置的http端口
[N] 2024/09/14 10:07:41 ⚛️ Chosen device:192.168.0.104:8080 #配置的设备这里是远程所以是地址
[I] 2024/09/14 10:07:41 Multiple processes found with the name:AL.exe #发现多个同名进程
[I] 2024/09/14 10:07:41 [0] PID: 15776, Name: AL.exe
[I] 2024/09/14 10:07:41 [1] PID: 19504, Name: AL.exe
❔ Enter the index of the process to hook: #这里是等待你输入序号0或者1 乱输可能就是第一个
[N] 2024/09/14 10:10:28 ✨ Successfully attached.
>>>>>>>>>>>算法签名计算服务... by-js脚本打印
frida脚本
平时怎么写就怎么写 (不行就问AI)例如
const log = console.log
log("你好 我是阿银 这是js脚本里打印的数据")
rpc脚本 只需要把函数公开就可以了
rpc.exports = {
getsig2: function () {
// ......一些call调用
return '返回给你的看的'
},
getsign: function (body) {
// ......一些call调用
return ret;
},
testlog: function (data) {
log("测试打印输出-->>>>>>", JSON.stringify(data))
return generateMD5('123456')
}
}
rpc调用方式
只有2个接口
- 获取lftools运行状态信息 调用次数等
/api/systeminfo
{
"pid": 51304,
"os": "linux",
"operating_system": "ubuntu",
"os_family": "debian",
"os_version": "22.04",
"architecture": "x86_64",
"kernel_version": "6.8.0-40-generic",
"hostname": "my-Ubuntu",
"cpu_percent": "0.29%",
"memory_usage": "20.62 MB",
"memory_percent": "0.17%",
"start_time": "2024-09-14 11:10:54",
"running_time": "0 天 0 小时 1 分钟 0 秒",
"callNum": 10
}
- 调用js call
/api/call
关于call 请求路径 /api/call
post请求
body只需要两个字段 fn 就是 rpc.exports
函数名字,还一个字段是 data data可以传任意结构体或者string int 等
示例数据如下:
{
"fn": "testlog",
"data": {
"deviceid": "E8C4651EDF19F49E7D641D7C36D5D21C",
"uin": "69AF1234",
"type": "123",
"subtype": 5
}
}
lftools 会把去调用fn然后传给js脚本data数据 所以传入的data 就是js接收的
分析历程
哎? 把自己的痛苦拿出来说真的好嘛?!
我写之前列了个步骤
…不说了 说个比较痛苦的
进程启动Spawn那一块 花了我好几个小时!!这就不得不说Windows的坑了 因为0.0.2版本 我封装的是 frida-core(16.5.1)在windows注入进程会提示 FError: Unexpectedly failed with error code: 0x00000057
在 16.5.1 中,Frida 使用了GetProcessInformation ProcessMachineTypeInfo 根据一些 帖子 win10不支持 所以win的frida-server用16.4.10即可
理论上是通用的啦 毕竟底层封装的frida 我也测试过安卓 mac linux Win…
最后
知识爆炸的时代 可能已经有很多人写过类似的工具了 只不过鼠鼠脑袋没搜到想要的 有好用的工具 可以推给我呀!不想天天写工具了