一、问题描述
没有代码提示写js是一件很痛苦的事情,所以本文主要介绍一下如何自己搭建frida开发环境。
最终实现的效果就是:
- 有代码提示信息
- 可以分模块开发
编辑器使用的vscode,如何安装就不多说了,除此之外还需要node
环境,没有的可以直接点击这里去官方下载安装。
二、操作步骤
安装好node后,先自己新建一个文件夹,比如我这里名字为FridaEnv
,然后从终端进入这个文件夹,使用npm
初始化这个文件夹,命令为npm init
:
后面会让选择很多东西,不用管,直接一直按Enter
即可,即默认选项。
紧接着就是安装frida代码提示的包:npm i @types/frida-gum
js代码本身是没有类型提示的,很多时候看不到函数参数用起来很麻烦,所以我们还可以安装一下TypeScript
,它的使用与JavaScript
基本一样,但它有类型提示,用起来更加舒服。
安装命令为:npm i ts-loader typescript -D
后面的-D
意思是只在开发环境下使用它。
因为其工作原理是将TypeScript
代码重新编译成为JavaScript
代码,我们最终运行的依旧只能是js代码,所以最后的结果是不需要这两个包的。
每次自己手动编译也很麻烦,所以还需要一个webpack
工具,它可以将这一个过程自动化。
不仅如此,它更强大的作用其实是可以让我们分模块开发不同功能的代码,然后最后将其打包成为一个js文件。
安装命令为:npm i webpack webpack-cli -D
安装完成后,输入code .
,用vscode打开这个文件夹,新建一个文件webpack.config.js
,这是打包工具webpack
的配置文件,我们需要用它来配置一些选项:
const path = require("path");
module.exports = {
mode: "production",
entry: './entry.ts', //入口文件,从项目根目录指定
module:{
rules:[
{
test:/\.tsx?$/,
use:'ts-loader',
exclude:/node_modules/
},
]
},
resolve: {
extensions: ['.tsx', '.ts', '.js'],
},
output: {
path: path.resolve(__dirname, "."), //将js文件直接打包到根目录
filename: "script.js" //打包到script.js文件中
},
watch: true
}
具体有哪些选项,或者这些选项有什么作用,可以去其官网查看:webpack
此时项目结构如下:
然后TypeScript也需要一个配置文件,名字为tsconfig.json
,内容如下:
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"outDir": "./dist/",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
},
"files": ["entry.ts"]
}
更多参数、或者其含义,可以去官网查看:TypeScript
此时项目结构如下:
它报错了,原因是这里我填入的入口文件没有创建,在根目录创建一个即可,这个文件便是后面我们写代码的主文件了:
然后进入这个包管理文件,写一个脚本命令,让webpack能够实时监视我们的目录变化,自动编译:
"scripts": {
"watch": "webpack --config webpack.config.js"
},
自此,我们的环境就搭建好了。
三、简单使用
现在来使用一下试一试,比如frida提供了一个Java的类:
可以看到,此时它就能自动列出所有可用的函数与类了。
然后还有自动编译代码的功能,现在运行命令:npm run watch
此时只要你在entry.ts
文件中写的任何代码,都会被实时编译到script.js
文件中去,并且还会进行优化:
不仅如此,现在我们还可以进行多模块开发,在没有使用webpack前,是无法实现的:
这里我建了一个Hook
文件夹,然后再建了一个Widget
文件夹,并创建文件EditText
。
原因是可Hook的对象有很多,所以我打算将其全部分类存放在Hook
文件夹下。
同时由于我目前学习Hook的一个安卓记事本程序存放文本用的是Widget
下的EditText
类,所以就有了这样的结构。
然后我还在这个函数中导出了要hook的setText
函数。
使用起来也很简单,直接在入口文件中将其导入即可:
最终无论你写了多少代码,最后都会被编译到script.js
这一个文件中去。
此时我们只需要运行frida
的命令,执行这个script.js
代码文件即可。
此时就成功完成了Hook,并将程序中的数据给截取出来了。
同时由于frida
本身也会自动监视它运行的代码文件变化,所以你根本无需重新运行命令,它会自动将编译生成好的代码文件重新进行加载。
所以之后你就只需要专注于下自己的代码即可!