-
基于 Webpack4 + TypeScript + Babel 可根据自己的个人爱好拆分Frida代码结构
-
源码使用ES6语法 const、let、Class、
${字符串模版}
-
通过 Babel 转义为 ES5 语法兼容目前的 frida.so 使用,不需要替换so文件
-
混淆压缩Frida代码
-
现有版本frida.so问题: console.log打印中文乱码、拓展方法有些语法不支持
-
Webpack5、Vite、frida-compile构建方式,有时间再研究下
-
本质就是代码兼容转换,不管用什么语法只要转换成低版本兼容语法即可!!!
-
如果没有以上需要,建议忽略!!!
-
给有强迫症的吧友一点点启发
-
需要一点点门槛
-
总结:好像也没有啥用!!!
node -v
git clone https://github.com/manydots/frida-project.git
cd frida-project
git pull
npm install
npm run dp
npm run frida
npm run vite:frida
npm run vite:dp
npm run build:min
npm run build
/**
* cross-env minimize=false filename=df_game_r.js is_dp=true webpack
*
* - cross-env: 设置全局变量的命令
* - minimize: 混淆压缩参数 true开启 false关闭
* - filename: 构建输出文件名称
* - is_dp/is_frida: 当前构建环境标记(不推荐修改)
* - webpack: 使用webpack构建项目,配置文件webpack.config.js
*
* vite与frida-compile构建方式未完善、存在问题
* - .env.dp .env.frida vite构建使用的全局变量
* - vite.config.mjs
*/
- 基于原有模式,对hook进行简单拆分,打包后理论与原有文件【frida.js、df_game_r.js】逻辑保持一致。
// tsconfig.json文件
{
"compilerOptions": {
"module": "esnext"
//...其他配置
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
// env.d.ts文件
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_XXX: string;
}
// 高版本frida-compile构建存在插入无用的日志输出,需要手动删除
// 对于使用 Node.js 绑定物的应用, 这个api可以被这样使用
const frida = require('frida');
const fs = require('fs');
const path = require('path');
const util = require('util');
const readFile = util.promisify(fs.readFile);
let session, script;
async function run() {
const source = await readFile(path.join(__dirname, '_agent.js'), 'utf8');
session = await frida.attach('iTunes');
script = await session.createScript(source);
script.message.connect(onMessage);
await script.load();
console.log(await script.exports.add(2, 3));
console.log(await script.exports.sub(5, 3));
}
run().catch(onError);
function onError(error) {
console.error(error.stack);
}
function onMessage(message, data) {
if (message.type === 'send') {
console.log(message.payload);
} else if (message.type === 'error') {
console.error(message.stack);
}
}
// rpc.exports
rpc.exports = {
add: function (a, b) {
return a + b;
},
sub: function (a, b) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(a - b);
}, 100);
});
}
};
// Windows 命令行增加配置
NODE_OPTIONS=--openssl-legacy-provider
// Mac不支持NODE_OPTIONS参数, 以构建dp为例
// 方式一: 单独定义一个编译命令
// "dp:mac": "cross-env minimize=true filename=df_game_r.js is_dp=true webpack"
// 方式二: 定义scripts/build.dp.js脚本(不推荐)
// 脚本内部判断平台类型,拼接命令后通过exec执行
// "dp:script": "node scripts/build.dp.js"
# test.js为模糊搜索基础符号
# filter.address.js hook地址拷贝
# filter.attach.js 为模糊搜索地址Interceptor.attach便于批量测试匹配
npm run filter
# 或
cd ./filter
node test.js
// Frida12 不支持
// Frida16 支持(frida-gadget-16.4.2-linux-x86.so已测试,可配合升级Webpack5、Vite构建)
// Webpack5 构建后会包裹箭头函数
frida-project ├── src -- 主功能 │ ├── hook │ │ ├── HookEvent.ts -- 封装常用api_xxx方法 │ │ ├── HookGameEvent.ts -- 核心逻辑实现 │ │ ├── HookNative.ts -- new NativeFunction定义 │ │ └── HookType.ts -- hook地址枚举, 也可以在HookGameEvent中直接使用ptr(0x地址)不需要单独定义 │ ├── enum -- 枚举文件暂时未使用 │ └── main.ts -- 核心功能入口文件 ├── package.json ├── tsconfig.json -- ts配置 ├── webpack.config.js -- webpack配置 │
- 自定义消息颜色
- 设置装备解锁时间 @木青大佬
- 开启真·14技能栏
- 兼容装备镶嵌
- 增加自动修理装备
- 增加玩家指令监听
- HookEvent Class变更为单例模式
- 区分构建平台Windows/Mac命令