JS逆向
抽象语法树 AST
源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构
抽象表示把 js 代码进行了结构化的转化,转化为一种数据结构。这种数据结构其实就是一个大的 json 对象
简单理解,就是把代码按照一定的规则转换成一种树形结构
示例
- 一组简单的 AST 树状结构,转换前:
const team = '我是一个示例'
转换后:
{
"type": "Program",
"start": 0,
"end": 18,
"body": [
{
"type": "VariableDeclaration",
"start": 0,
"end": 18,
"declarations": [
{
"type": "VariableDeclarator",
"start": 6,
"end": 18,
"id": {
"type": "Identifier",
"start": 6,
"end": 8,
"name": "team"
},
"init": {
"type": "Literal",
"start": 11,
"end": 18,
"value": "我是一个示例",
"raw": "'我是一个示例'"
}
}
],
"kind": "const"
}
],
"sourceType": "module"
}
- 拆解一个简单的 add 函数,转换前:
function add(a, b) {
return a + b
}
转换后:
{
"type": "Program",
"start": 0,
"end": 38,
"body": [
{
"type": "FunctionDeclaration",
"start": 0,
"end": 38,
"id": {
"type": "Identifier",
"start": 9,
"end": 12,
"name": "add"
},
"expression": false,
"generator": false,
"async": false,
"params": [
{
"type": "Identifier",
"start": 13,
"end": 14,
"name": "a"
},
{
"type": "Identifier",
"start": 16,
"end": 17,
"name": "b"
}
],
"body": {
"type": "BlockStatement",
"start": 19,
"end": 38,
"body": [
{
"type": "ReturnStatement",
"start": 24,
"end": 36,
"argument": {
"type": "BinaryExpression",
"start": 31,
"end": 36,
"left": {
"type": "Identifier",
"start": 31,
"end": 32,
"name": "a"
},
"operator": "+",
"right": {
"type": "Identifier",
"start": 35,
"end": 36,
"name": "b"
}
}
}
]
}
}
],
"sourceType": "module"
}
生成抽象语法树
- 在线网站:AST explorer
语法树还原成代码
用
escodegen
将 JavaScript AST 转化为代码
- 使用 npm 命令安装 escodegen 模块:
npm i escodegen -g
- 使用 escodegen 将 js 语句的 AST 语法树 —— json 文件转化成 js 代码:
esgenerate json文件名
代码执行
- 得到的 js 代码可以直接 F12 后在浏览器的控制台中运行
- 使用 nodejs 来运行
node 文件名
评论