我们使用TypeScript
编写frida脚本,再通过frida-compile
把TypeScript
编译成JavaScript
代码。
首先介绍搭建TypeScript
调试环境,再具体介绍Frida调试环境的配置
Node.js下载 https://nodejs.org/en/download/
npm和Node.js是捆绑在一起的
配置npm
npm使用的默认源(registry
)是https://registry.npmjs.org
,在国外访问很慢,就算挂代理访问也慢,所以直接替换成国内的源http://registry.npm.taobao.org
,操作如下:
得到配置文件路径npm config get
修改用户配置文件
使用以下命令创建项目的目录:
建立好的目录如下:
在项目的根目录下,执行下面的命令:
现在项目结构如下:
package.json介绍
在项目的根目录下,执行下面的命令:
加了参数-g
,会在全局环境安装TypeScript
,不加只会在当前工程下安装TypeScript
在项目的根目录下,执行下面的命令:
现在项目结构如下:
tsconfig.json介绍
在 tsconfig.json
中取消下面属性项的注释,并修改其属性的值:
这样设置之后,我们在 ./src
中编码 .ts
文件,.ts
文件编译成 .js
后,输出到 ./dist
中。
将下面代码复制到./src/index.ts
中:
在项目的根目录下,执行下面的命令:
tsc
是编译命令,详情查看:https://www.tslang.cn/docs/handbook/typescript-in-5-minutes.html
tsc
的编译选项,详情查看:https://www.tslang.cn/docs/handbook/compiler-options.html
执行结果如下:
手动编译还是比较麻烦,如果能够保存代码后,能自动编译就好了。
详情查看:https://go.microsoft.com/fwlink/?LinkId=733558
Ctrl + F9
运行构建任务,将显示以下选项:
选择 tsc: watch - tsconfig.json
,回车运行之后,编辑的代码保存之后,就会自动编译。
代码检查主要是用来发现代码错误和统一代码风格。
详情查看:https://ts.xcatliu.com/engineering/lint.html
ESLint
可以安装在当前项目中或全局环境下,因为代码检查是项目的重要组成部分,所以我们一般会将它安装在当前项目中(也可以安装在全局,因为package.json
中记录有依赖库,别人下载项目后,直接npm install
即可安装所有依赖库 )。可以运行下面的脚本来安装:
由于 ESLint
默认使用 Espree
进行语法解析,无法识别 TypeScript
的一些语法,故我们需要安装 typescript-eslint-parser
,替代掉默认的解析器,别忘了同时安装 typescript
:
由于 typescript-eslint-parser
对一部分 ESLint
规则支持性不好,故我们需要安装 eslint-plugin-typescript
,弥补一些支持性不好的规则。
现在项目结构如下:
package-lock.json是锁定依赖库的版本package-lock.json介绍
ESLint
需要一个配置文件来决定对哪些规则进行检查,配置文件的名称一般是 .eslintrc.js
或 .eslintrc.json
。
当运行 ESLint
的时候检查一个文件的时候,它会首先尝试读取该文件的目录下的配置文件,然后再一级一级往上查找,将所找到的配置合并起来,作为当前被检查文件的配置。
在项目的根目录下,执行下面的命令:
按需求,选择相应的选项:
图中出现了WARN
,编辑package.json
修改对应字段:
现在项目结构如下:
编辑 .eslintrc.js
,增加 parser: 'typescript-eslint-parser',
替换掉默认的解析器,使之识别 TypeScript
的一些语法,如下面所示:
在编辑器中集成 ESLint
检查,可以在开发过程中就发现错误,极大的增加了开发效率。
要在 VSCode
中集成 ESLint
检查,我们需要先安装 ESLint
插件,点击「扩展」按钮,搜索 ESLint
,然后安装即可。
VSCode
中的 ESLint
插件默认是不会检查 .ts
后缀的,需要在「文件 => 首选项 => 设置」中
添加以下配置:
将下面代码复制到./src/index.ts
中:
现在项目结构如下:
现在编辑器,应该会提示 4
个错误:
我们按照错误提示,修改成正确的代码风格(在错误处按Alt+Enter
):
console.log
一般是在调试阶段使用,发布正式版本时,应该移除。所以这里没有提示红色的致命错误,而是使用了警告。
将下面代码复制到./src/index.ts
中:
将下面代码复制到./src/Cat.ts
中:
现在项目结构如下:
上述代码复制粘贴,保存之后,会提示这样的错误:
错误1
解决办法是使用 eslint-import-resolver-alias
,先安装依赖,执行下面的命令:
然后,在 .eslintrc.js
配置中,编辑成如下代码:
错误2
在 .eslintrc.js
配置中,编辑成如下代码:
如何 F5
开始调试 TypeScript
,并且还具备断点调试功能,答案是,使用 TS-node
。
详情查看:https://github.com/TypeStrong/ts-node
在项目的根目录下,执行下面的命令:
Run->Add Configuration
然后修改成如下配置:
按 F5
开始愉快的调试吧,F9
是添加断点:
如果出现unbound breakpoint
的问题,修改debug.javascript.usePreview
为false即可
Frida的安装参考Frida官方文档
我们已经搭建好了TypeScript调试环境,下面继续Frida调试环境的配置,可以参考frida-agent-example 项目的配置文件。
frida-agent-example的package.json文件
也就是我们可以需要将以下内容拷贝到自己的package.json
文件中,然后在项目根目录下执行npm install
安装下面的依赖
注意点
1.开启实时编译
Ctrl+F9
选择npm: watch
2.启动frida-server
3.注入脚本
.\frida.exe -U -f com.android.chrome --debug --runtime=v8 --no-pause -l "...\ts3\dist\index.js"
监听端口为本地的9229
4.chrome的DelTools工具进行附加调试
打开chrome,输入chrome://inspect
添加连接——本地端口9229
在Sources
界面,Ctrl+P
选择要调试的脚本
格式化脚本
格式化前
格式化后
5.Ctrl+B下断点
6.vscode修改脚本
实时编译
DelTools工具自动监测脚本是否修改
Frida自动监测脚本是否修改
参考正确配置 Visual Studio Code 开发和调试 TypeScript 中用pycharm调试frida脚本,PyCharm给js文件和ts文件下断点都没有反应,不知道是为什么
如果chrome的DelTools工具显示不出来文件,那么点击Configure
配置,Enable port forwarding
,然后再取消
这是因为你用api的方式注入的脚本,是直接用变量输入的code,没有文件名,所以chrome默认取名为script1
加延迟就行了get_usb_device(10)
正确配置 Visual Studio Code 开发和调试 TypeScript
FRIDA 使用经验交流分享
工程文件: 链接:https://pan.baidu.com/s/18qlGc1OFSOu4Y29mEmQY3g 提取码:abco
mkdir ts3
cd ts3
mkdir src
mkdir dist
mkdir ts3
cd ts3
mkdir src
mkdir dist
ts3
├─dist
└─src
npm init
-
y
ts3
├─dist
└─src
└─package.json
ts3
├─dist
└─src
└─package.json
npm install
-
g typescript
npm install
-
g typescript
tsc
-
-
init
ts3
├─dist
└─src
└─package.json
└─tsconfig.json
ts3
├─dist
└─src
└─package.json
└─tsconfig.json
"outDir"
:
"./dist"
,
"rootDir"
:
"./src"
,
"outDir"
:
"./dist"
,
"rootDir"
:
"./src"
,
const hello: string
=
'hello, Genliese'
;
console.log(hello);
const hello: string
=
'hello, Genliese'
;
console.log(hello);
/
/
编译
tsc
/
/
执行
node .
/
dist
/
index.js
/
/
编译
tsc
/
/
执行
node .
/
dist
/
index.js
npm install eslint
-
-
save
-
dev
npm install eslint
-
-
save
-
dev
npm install typescript typescript
-
eslint
-
parser
-
-
save
-
dev
npm install typescript typescript
-
eslint
-
parser
-
-
save
-
dev
npm install eslint
-
plugin
-
typescript
-
-
save
-
dev
npm install eslint
-
plugin
-
typescript
-
-
save
-
dev
ts3
├─dist
└─node_modules
└─src
└─package
-
lock.json
└─package.json
└─tsconfig.json
ts3
├─dist
└─node_modules
└─src
└─package
-
lock.json
└─package.json
└─tsconfig.json
/
/
创建配置文件
.
/
node_modules
/
.
bin
/
eslint
-
-
init
/
/
创建配置文件
.
/
node_modules
/
.
bin
/
eslint
-
-
init
"description"
:
"default"
,
"repository"
: {
"type"
:
"git"
,
"url"
:
"none"
},
"description"
:
"default"
,
"repository"
: {
"type"
:
"git"
,
"url"
:
"none"
},
ts3
├─dist
└─node_modules
└─src
└─.eslintrc.js
└─package
-
lock.json
└─package.json
└─tsconfig.json
ts3
├─dist
└─node_modules
└─src
└─.eslintrc.js
└─package
-
lock.json
└─package.json
└─tsconfig.json
module.exports
=
{
parser:
'typescript-eslint-parser'
,
env: {
es6: true,
node: true,
},
extends:
'airbnb-base'
,
globals
: {
Atomics:
'readonly'
,
SharedArrayBuffer:
'readonly'
,
},
parserOptions: {
ecmaVersion:
2018
,
sourceType:
'module'
,
},
rules: {
},
};
module.exports
=
{
parser:
'typescript-eslint-parser'
,
env: {
es6: true,
node: true,
},
extends:
'airbnb-base'
,
globals
: {
Atomics:
'readonly'
,
SharedArrayBuffer:
'readonly'
,
},
parserOptions: {
ecmaVersion:
2018
,
sourceType:
'module'
,
},
rules: {
},
};
{
"eslint.validate"
: [
"typescript"
]
}
{
"eslint.validate"
: [
"typescript"
]
}
let num: number
=
1
;
if
(num
=
=
2
) {
console.log(num);
}
let num: number
=
1
;
if
(num
=
=
2
) {
console.log(num);
}
ts3
├─dist
└─node_modules
└─src
└─index.ts
└─.eslintrc.js
└─package
-
lock.json
└─package.json
└─tsconfig.json
ts3
├─dist
└─node_modules
└─src
└─index.ts
└─.eslintrc.js
└─package
-
lock.json
└─package.json
└─tsconfig.json
import
Cat
from
'./Cat'
;
const kitty: Cat
=
new Cat(
'kitty'
);
kitty.say();
import
Cat
from
'./Cat'
;
const kitty: Cat
=
new Cat(
'kitty'
);
kitty.say();
export default
class
Cat {
private name: string;
constructor(name: string) {
this.name
=
name;
}
say() {
console.log(this.name);
}
}
export default
class
Cat {
private name: string;
constructor(name: string) {
this.name
=
name;
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-2-2 20:16
被genliese编辑
,原因: