我们使用TypeScript
编写frida脚本,再通过frida-compile
把TypeScript
编译成JavaScript
代码。
首先介绍搭建TypeScript
调试环境,再具体介绍Frida调试环境的配置
Node.js下载 d8aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6F1L8$3c8W2K9Y4y4Q4x3X3g2G2M7X3N6Q4x3V1k6W2L8W2)9J5c8X3c8G2N6$3&6D9L8$3q4V1i4K6u0r3
npm和Node.js是捆绑在一起的
配置npm
npm使用的默认源(registry
)是ac3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5k6h3N6A6M7%4c8J5P5g2)9J5k6h3&6H3L8h3A6K6i4K6u0W2L8%4u0Y4
,在国外访问很慢,就算挂代理访问也慢,所以直接替换成国内的源4c9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4u0W2k6$3W2K6N6s2u0&6i4K6u0W2L8Y4m8E0i4K6u0W2N6r3q4G2j5X3q4G2i4K6u0W2L8%4u0Y4
,操作如下:
得到配置文件路径npm config get
修改用户配置文件
使用以下命令创建项目的目录:
建立好的目录如下:
在项目的根目录下,执行下面的命令:
现在项目结构如下:
package.json介绍
在项目的根目录下,执行下面的命令:
加了参数-g
,会在全局环境安装TypeScript
,不加只会在当前工程下安装TypeScript
在项目的根目录下,执行下面的命令:
现在项目结构如下:
tsconfig.json介绍
在 tsconfig.json
中取消下面属性项的注释,并修改其属性的值:
这样设置之后,我们在 ./src
中编码 .ts
文件,.ts
文件编译成 .js
后,输出到 ./dist
中。
将下面代码复制到./src/index.ts
中:
在项目的根目录下,执行下面的命令:
tsc
是编译命令,详情查看:0e6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2@1M7$3I4S2L8X3N6Q4x3X3g2U0L8W2)9J5c8X3c8G2j5%4y4Q4x3V1k6Z5j5h3&6V1j5X3!0G2K9#2)9J5c8Y4c8&6M7r3g2K6j5%4u0A6M7s2c8Q4x3X3c8A6L8W2)9J5k6o6g2Q4x3X3c8E0K9h3&6#2N6r3g2K6i4K6u0W2K9s2c8E0L8l9`.`.
tsc
的编译选项,详情查看:0c9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2@1M7$3I4S2L8X3N6Q4x3X3g2U0L8W2)9J5c8X3c8G2j5%4y4Q4x3V1k6Z5j5h3&6V1j5X3!0G2K9#2)9J5c8X3y4G2L8i4m8A6L8r3g2J5i4K6u0V1L8%4m8@1K9h3!0F1M7#2)9J5k6h3S2@1L8h3H3`.
执行结果如下:
手动编译还是比较麻烦,如果能够保存代码后,能自动编译就好了。
详情查看:97fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4L8#2)9J5k6h3#2A6j5%4u0G2M7$3!0X3N6q4)9J5k6h3y4G2L8g2)9J5c8X3k6%4L8r3W2F1K9#2)9J5c8W2)9K6c8V1I4A6L8X3E0u0k6q4)9K6c8o6M7K6x3K6f1#2z5l9`.`.
Ctrl + F9
运行构建任务,将显示以下选项:
选择 tsc: watch - tsconfig.json
,回车运行之后,编辑的代码保存之后,就会自动编译。
代码检查主要是用来发现代码错误和统一代码风格。
详情查看:2f8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6@1M7#2)9J5k6i4S2U0j5i4c8D9K9i4g2Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8X3N6A6L8X3g2W2M7X3W2F1k6#2)9J5c8X3I4A6L8Y4c8Q4x3X3g2Z5N6r3#2D9
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
。
详情查看:0f8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6f1P5i4m8W2f1%4c8J5L8$3&6Y4i4K6u0r3N6s2y4Q4x3X3c8F1L8$3c8W2
在项目的根目录下,执行下面的命令:
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 使用经验交流分享
工程文件: 链接:9e7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3j5h3&6Q4x3X3g2T1j5h3W2V1N6g2)9J5k6h3y4G2L8g2)9J5c8Y4y4Q4x3V1j5I4z5s2q4D9c8$3x3I4e0@1k6e0e0%4f1@1h3e0t1&6L8f1g2E0f1g2V1K6k6H3`.`. 提取码: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;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2021-2-2 20:16
被genliese编辑
,原因: