ast-hook-for-js-RE 浏览器内存漫游

本文介绍了一种名为“内存漫游”的技术,该技术可在浏览器端实现变量级抓包监控,帮助快速定位加密逻辑代码。文章详细阐述了项目的实现原理、安装配置过程以及未来计划开发的功能。

前言

浏览Github中发现的一个好项目ast-hook-for-js-RE
项目github地址:https://github.com/CC11001100/ast-hook-for-js-RE。
一个非常好的项目,大家可以多给作者star支持一下。
Github需要科学上网,所以在这里克隆了一下仓库到国内。
链接:https://gitee.com/wangpeng35023502/ast-hook-for-js-RE

一、什么是内存漫游?

作者的话:
简单的说,这是一个浏览器端的内存漫游解决方案,借助此工具你可以随意检索浏览器内存中的数据(标题党警告一次),
默认看到这个项目的人都是会点逆向的, 所以可以简单理解为这是一个浏览器版本的objection,
这里的浏览器特指Chrome浏览器, 事实上在写代码的时候我也并没有考虑兼容其它的浏览器。

二、功能列表

本项目刚刚立项,内存漫游功能并不是特别完善(其实只有一个功能…),目前已开发的功能:

  • 变量级抓包监控,根据加密参数秒秒钟定位到加密逻辑的代码位置(追加密逻辑代码位置的通杀方案)

计划开发的功能:

  • 基础的定位功能的兼容性一直在搞咋也搞不完,上面那条就当我吹牛笔了…
  • 目前 TODO v0.3 功能点:
    • script hook plugins,通过script设置innerHTML动态插入到页面中的逻辑也能够Hook到
    • eval hook plugins想办法能够直接定位到jsvm中,现在只能知道是在eval中,但跳不到vm中
    • cache的逻辑优化
    • 想办法对定位doc请求url中的加密参数能够起到一定的帮助作用(也许应该把另一个还未完全开源的hook项目直接合并进来?)

三、本程序实现原理及流程

划回来!请务必不要跳过此部分,在使用本程序之前,希望你能够对其原理有一个大致的了解,知其然知其所以然。

本程序的运行原理非常简单,所有的功能都是基于AST Hook构建的,其大致流程:

  1. 访问目标网站时设置浏览器走我们自定义的代理服务器,这个代理服务器要支持能够使用代码处理请求,这里选择的是anyproxy。
  2. 在代理服务器这里,对请求做处理,对于JavaScript响应和HTML响应里的JS代码,使用AST实时处理,注入Hook逻辑。
  3. Hook逻辑就是所有涉及到变量改动的地方都经过我们的Hook方法,以此实现页面上所有的变量值变动都可以捕获到,你可以把这理解为内存中变量级别的抓包监控
  4. 抓到的变量会被保存到一个变量数据库中,然后当你访问页面请求了带加密参数的请求之后,从Chrome开发者工具的Network中把那个加密参数复制出来,
    切换到console调用本工具提供的api在变量数据库中搜索一下,就能搜索到存储这个字符串的变量及变量所在的代码位置,
    单击代码位置可以自动切换到Source面板并自动定位到变量位置。
  5. 然后在此处打断点往前找加密逻辑抠出来就好了,如果有多个加密参数或者加密参数为多个地方拼接生成,无脑重复此步骤即可。

注:不要尝试去搜索AST Hook相关的资料,这只是一个我瞎编的词…感兴趣请自行阅读项目源码。

四、安装

node版本要求

注:笔者在编码时使用到了较高版本的语法,因此请更新的您的node版本至少到14.0.0+,建议更新到最新的LTS版本。

首先将项目push到本地

git clone https://gitee.com/wangpeng35023502/ast-hook-for-js-RE

解压到本地,安装所需依赖,分别是anyproxy,需自行安装

npm install anyproxy

启动项目

需要启动两个本地Server,anyproxy的代理Server监听在本地10086端口,运行这个文件即可:

src/proxy-server/proxy-server.js

要用anyproxy抓取https请求需要信任它的证书,在运行这个文件之前,先用anyproxy ca选项启动,访问它的web管理界面:

http://localhost:8002/

然后下载证书信任即可:
在这里插入图片描述

再将下载的证书放进受信任的证书即可,可自行百度。

api-server监听在本地10010端口,运行这个文件即可:

src/api-server/api-server.js

然后在浏览器中将代理设置为10086端口即可,这里推荐使用便携版Chrome搭建单独的调试环境,并搭配Proxy SwitchyOmega或类似的插件作为代理路由辅助:
https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif

杂项

因为用AST实时处理JS文件太慢了,所以设置了个缓存,缓存目录默认为:

src/proxy-server/js-file-cache

其它IDE请自行搜索如何设置。

OK,至此已经安装完毕。


怎么使用呢?下一篇文章会写具体的使用方法。

### 与 JavaScript AST 操作相关的库和工具 在 JavaScript 生态系统中,抽象语法树(Abstract Syntax Tree, AST)是一种广泛使用的工具,用于解析、分析和转换代码。以下是一些常用的与 AST 操作相关的库和工具: #### 1. **Acorn** Acorn 是一个快速的 JavaScript 解析器,能够生成 AST。它支持多种选项,可以满足不同的解析需求[^3]。 ```javascript const acorn = require("acorn"); const ast = acorn.parse("let x = 42;", { ecmaVersion: 2020 }); console.log(ast); ``` #### 2. **Esprima** Esprima 是另一个流行的 JavaScript 解析器,专注于生成精确的 AST。它还提供了额外的功能,如词法标记化和错误处理[^4]。 ```javascript const esprima = require("esprima"); const code = "var answer = 42;"; const syntaxTree = esprima.parseScript(code); console.log(syntaxTree); ``` #### 3. **Babel** Babel 是一个强大的 JavaScript 编译器,广泛用于现代 JavaScript 开发。它不仅能够解析代码生成 AST,还能通过插件实现对 AST 的修改和转换[^5]。 ```javascript const babel = require("@babel/core"); babel.transformSync("let x = 42;", { plugins: [], }).ast; ``` #### 4. **Recast** Recast 是一个用于安全地修改 JavaScript 代码的工具。它允许开发者操作 AST 并生成格式化的代码输出,同时保留原始代码的风格[^6]。 ```javascript const recast = require("recast"); const ast = recast.parse("let x = 42;"); // 修改 AST const updatedCode = recast.print(ast).code; console.log(updatedCode); ``` #### 5. **AST Explorer** AST Explorer 是一个在线工具,可以帮助开发者可视化和调试 AST。它支持多种解析器(如 Acorn 和 Esprima),并提供实时预览功能[^7]。 #### 6. **JSCodeshift** JSCodeshift 是一个基于 AST 的代码迁移工具,特别适合大规模代码重构。它结合了 Recast 和 Babel 的功能,简化了代码转换过程[^8]。 ```javascript const jscodeshift = require("jscodeshift"); const source = "let x = 42;"; const ast = jscodeshift(source); // 使用 JSCodeshift API 修改 AST const output = jscodeshift(ast).toSource(); console.log(output); ``` #### 7. **Espree** Espree 是 Esprima 的分支,专门为 ESLint 设计,支持最新的 ECMAScript 标准。它可以轻松生成符合标准的 AST[^9]。 ```javascript const espree = require("espree"); const ast = espree.parse("let x = 42;", { ecmaVersion: 2020 }); console.log(ast); ``` #### 8. **Meriyah** Meriyah 是一个现代化的 JavaScript 解析器,支持完整的 ECMAScript 标准,包括实验性特性。它的性能优越,适用于复杂场景[^10]。 ```javascript const meriyah = require("meriyah"); const ast = meriyah.parseModule("let x = 42;", { next: true }); console.log(ast); ``` ### 总结 上述工具和库为 JavaScriptAST 操作提供了丰富的选择。根据具体需求,可以选择合适的工具进行代码解析、分析或转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值