App端代码hook技术
app 端代码 hook 技术
简介
Hook 技术是一种常用的技术,它可以用于在运行时修改和调试应用程序。在移动应用开发中,Hook 技术可以用于拦截函数调用、修改函数参数和返回值、跟踪函数调用等,以便在开发和测试过程中更方便地进行调试和验证。
常见的 App 端代码 Hook 技术包括以下几种:
- Xposed:Xposed。
- Frida:Frida。
- Cydia Substrate。
- Androguard。
- DexHunter。
这些代码 Hook 技术都有各自的优缺点,开发者可以根据实际需求和场景选择合适的技术。
Frida 简介
Frida 是一个基于 JavaScript 的动态代码注入工具,可以用于在运行时修改应用程序的行为。通过 Frida,开发者可以在不需要修改应用程序源代码或重新编译的情况下,对应用程序进行调试、监视和修改。 Frida 的代码 Hook 技术可以用于修改应用程序的逻辑、绕过安全检查、获取应用程序内部数据等。
Frida 的价值
Frida 支持多种编程语言,其中包括 JavaScript、Python、Java 等,可以根据需要选择合适的语言进行开发和调试。 Frida 代码 Hook 技术可以用于在不需要修改应用程序源代码的情况下,对应用程序进行调试、监视和修改。这对于开发者来说非常有用,可以帮助他们快速定位和修复应用程序中的问题。
Frida 的应用场景
Frida 代码 Hook 技术可以在各种场景下使用,例如:
- 应用程序开发和测试;
- 应用程序安全研究和测试;
- 应用程序逆向分析和反编译。
使用 Frida 实现 App 端代码 Hook
以一个简单的登录功能为例。主要分为以下几个步骤:
- 安装 Frida。
- 编写 JavaScript 脚本。
- 运行 JavaScript 脚本。
1. 安装 Frida
- 安装客户端:
npm install frida
。 - 查看本地的安卓版本:
adb shell getprop ro.product.cpu.abi
- 安装安卓版本对应的服务端: 访问 Frida 的官网 https://github.com/frida/frida/releases,下载对应平台的服务端:
- 安装与配置:下载后的 Frida 工具是一个 zip 压缩包,解压到任意目录。
- 然后通过
adb push
命令,把文件推到手机的/data/local/tmp 目录下,并给予 x 权限,然后运行 server,以下是对应的执行命令:
adb push frida-server-16.0.19-android-x86 /data/local/tmp
adb shell
cd /data/local/tmp &&ls
chmod +x frida-server-16.0.19-android-x86
./frida-server-16.0.19-android-x86
2. 编写 JavaScript 脚本
- 在编写 Hook 函数前,需要先初始化一个 node 项目:
npm init -y
npm install frida
- 环境准备:准备一个被测的 APK 文件,该 APK 文件需要安装在模拟器或真机环境下,测试 APK 下载链接地址为:
-
在被测 APK 中,需要对登录的函数进行 Hook 操作,登录模块的代码如下:
-
Hook 函数需要实现以下步骤:
- 连接设备。
- 获取目标应用程序的进程名称。
- 连接应用进程。
- 执行 hook 函数。
相关完整的源码如下:
// 导入 Frida 模块
const frida = require("frida");
const util = require("util");
const exec = util.promisify(require("child_process").exec);
async function attachToApp() {
// 连接设备
const device = await frida.getUsbDevice();
console.log("device", device);
// 获取目标应用程序的进程名称
const { stdout, stderr } = await exec(
"adb shell ps | findstr com.ceshiren.litemall"
);
console.log("stdout", stdout.split(" ").filter((s) => s && s.trim())[1]);
const processName = stdout.split(" ").filter((s) => s && s.trim())[1];
// 连接应用进程
const session = await device.attach(parseInt(processName));
console.log("session", session);
// 执行hook函数
const script = await session.createScript(`
Java.perform(function () {
// 获取LoginActivity类
let LoginActivity = Java.use('com.ceshiren.litemall.activity.LoginActivity');
// 执行loginMethod方法
let result1 = LoginActivity.loginMethod('', 'user123');
console.log('result1', result1);
let result2 = LoginActivity.loginMethod('user123', '');
console.log('result2', result2);
let result3 = LoginActivity.loginMethod('user123', 'user');
console.log('result3', result3);
let result4 = LoginActivity.loginMethod('user123', 'user123');
console.log('result4', result4);
});
`);
await script.load();
}
attachToApp();
3. 运行 JavaScript 脚本
- 使用 Node.js 运行 Frida 脚本。
- 在案例中,需要将脚本保存为 hook.js,然后使用以下命令运行:
node hook.js
总结
- Frida 安装
- 使用 Frida 实现 App 端代码 Hook