wspr-ncsu/visiblev8

GitHub: wspr-ncsu/visiblev8

一个经过插桩定制的 V8 引擎,能够以最小侵入方式记录 JavaScript 运行时的 API 调用与属性访问行为。

Stars: 247 | Forks: 42

[![Build VisibleV8](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/5808862352165908.svg)](https://github.com/wspr-ncsu/visiblev8/actions/workflows/chromium-build.yaml) [![Build VV8 postprocessors](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/e0c6ff43a1165916.svg)](https://github.com/wspr-ncsu/visiblev8/actions/workflows/post-processor.yaml) [![GitHub release](https://img.shields.io/github/release/wspr-ncsu/visiblev8?include_prereleases=&color=blue&label=Latest%20release)](https://github.com/wspr-ncsu/visiblev8/releases/latest) [![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/wspr-ncsu/visiblev8/total?label=Downloads%20for%20VisibleV8)](https://github.com/wspr-ncsu/visiblev8/releases/) [![Docker Pulls for vv8](https://img.shields.io/docker/pulls/visiblev8/vv8-base?label=Docker%20pulls%20for%20vv8)](https://hub.docker.com/r/visiblev8/vv8-base) [![Docker Pulls](https://img.shields.io/docker/pulls/visiblev8/vv8-postprocessors?label=Docker%20pulls%20for%20postprocessors)](https://hub.docker.com/r/visiblev8/vv8-postprocessors) # VisibleV8 VisibleV8 是 V8 JavaScript 引擎的一个定制版本,它将所有 JavaScript API 调用及其参数记录到跟踪日志中。VisibleV8 作为一个最小侵入性和易于维护的补丁集进行维护和分发,它在明文日志中捕获并记录以下活动: * 所有跨越 JS/宿主应用程序边界的 JS 函数调用(即调用 V8 内部称为“API”函数的调用,例如浏览器中的 window.alert) * 命名(例如 foo.bar)或键控(例如 foo["bar"])属性查找,其中接收者(例如 foo)指的是由宿主应用程序或全局对象定义的对象 * 涉及由宿主应用程序(或全局对象)定义的接收者对象的命名或键控属性表达式的赋值 * 对宿主应用程序定义的对象属性的 Reflect.get 和 Reflect.set API 访问 本仓库提供了将 Chromium 转换为 VisibleV8 的补丁和构建工具(以及一些测试)。 核心补丁是与架构和平台无关的,但某些日志记录代码目前依赖于 Linux 的实现细节。 [可选的] 构建系统则是特定于 Linux 的。 ## 快速开始 开始使用的最佳方式是使用我们的 docker 镜像。该镜像可在 [Docker Hub](https://hub.docker.com/r/visiblev8/vv8-base) 上找到,可以通过运行以下命令来使用: ``` docker run -it --entrypoint /bin/bash visiblev8/vv8-base:latest ``` 这将启动一个安装了最新版本 VisibleV8 的 docker 容器。然后,您只需调用 `chrome` 二进制文件即可运行 VisibleV8,以下是一个示例: ``` /opt/chromium.org/chromium/chrome --no-sandbox --headless --screenshot --virtual-time-budget=30000 --user-data-dir=/tmp --disable-dev-shm-usage https://www.google.com ``` 并且 VisibleV8 日志将在本地目录中可用。 或者,您可以从 [releases](https://github.com/wspr-ncsu/visiblev8/releases) 页面下载 Debian 软件包并手动安装。 要使用 VisibleV8 运行网络规模的测量,您可以使用 [visiblev8-crawler](https://github.com/wspr-ncsu/visiblev8-crawler)。 ## 适用于 Android 的 VV8 本指南演示了如何将 VisibleV8 用于移动网络测量。预构建的 VisibleV8 `apk` 文件可在我们的 [artifact releases](https://github.com/wspr-ncsu/visiblev8/releases) 中找到。每次网站爬取实例都会按隔离区生成单独的日志文件。生成的文件将写入 `/sdcard` 目录。以下代码演示了如何在爬取完成后利用 ADB 将文件拉取出来。 ``` def chromeSequence(website): phone_id = '' # identify and set the correct phone-id using 'adb devices' baseCommand = "shell am start -a android.intent.action.VIEW -d" adbInitCommand = "adb -s {} ".format(phone_id) openChrome = adbInitCommand + f"shell am start -a android.intent.action.VIEW -d {website}" # closeTabCommand = adbInitCommand + "shell input tap 484 376" print("starting the chrome sequence") if os.system(openChrome) != 0: print("Failed openChrome") return else: print("opened chrome successfully") def pull_log_file(website_filename): pull_cmd = f"""adb pull /sdcard/Documents {website_filename} .""" print(pull_cmd) os.system(pull_cmd) ``` 第一个函数 `chromeSequence` 将生成一个 Chromium 实例并打开指定的网站。vv8 运行时将立即开始记录并将日志写入 `/sdcard` 目录中的单独文件。`pull_log_file` 函数可用于将日志文件从 android 文件系统拉取到本地机器。 注意:Android 的构建过程已经简化。如果您想从头开始构建 `apk`,请前往 `build/build_direct.sh` 并设置 ANDROID=1。 # 适用于 WebView 的 VV8 我们还包含了一个基于 Chrome 版本的适用于 Android WebView 的 VisibleV8 版本。自 Chrome 139 起,预构建的 `SystemWebView.apk` 文件可在我们的 [artifact releases](https://github.com/wspr-ncsu/visiblev8/releases) 中找到。要在手机上安装该 apk 文件,您需要在已 root 的 Android 设备上从 Google Play 应用商店安装 [`com.google.android.webview.beta`](https://play.google.com/store/apps/details?id=com.google.android.webview.beta&hl=en_US) 应用,随后使用系统化模块(XDA 论坛在 [此链接](https://xdaforums.com/t/module-terminal-app-systemizer-v17-3-1.3585851/) 提供了一些工具)将 APK 系统化,以覆盖已下载的 APK 测试版。注意,要做到这一点,您可能需要使用 [Magisk](https://github.com/topjohnwu/Magisk) 对手机进行 root。一旦完成,您需要运行以下命令: - `adb shell cmd webviewupdate disable-multiprocess` - `adb shell cmd webviewupdate set-webview-implementation com.google.android.webview.beta` 然后重启手机。随后,所有应用都应开始使用 VisibleV8WebView 加载网络内容,而不是默认的 WebView。 或者,也可以使用更面向开发者(或定制)的允许您直接获取 root 权限的 Android 版本,并且也可以直接安装 APK 文件。 要为不同架构构建 VisibleV8 WebView,请前往 `build/build-direct.sh` 并修改第 229 行,将 `target_cpu="arm64"` 设置为不同的值,然后使用 `cd builder && make build VERSION= ANDROID=1` 运行构建流水线,更多详情请参见下面的章节。 ## 构建 VisibleV8 (这些说明适用于在 Chromium 104 及更高版本上构建 VV8。在[这里](https://chromiumdash.appspot.com/fetch_releases?channel=Stable&platform=Linux&num=1&offset=0)查找其他版本的提交哈希,但请确保本仓库的 `patches/` 中有匹配的补丁集。) * 确保您已安装 [Docker](https://docs.docker.com/install/) 和 [Python 3](https://www.python.org/downloads/),并有大量可用磁盘空间(例如 50GiB)用于下载和构建 Chromium * 克隆本仓库 *(我们将克隆的工作目录称为 **$VV8**)* * 在 `$VV8/builder` *内部* 运行 `make build`,这将构建带有 VisibleV8 补丁的最新 Chromium 版本。您也可以运行 `make build VERSION=104.0.5112.79` 来构建特定版本的 Chromium,但请记住我们并非拥有所有 Chromium 版本的补丁集。 * 您可以在 `$VV8/builder/artifacts` 中找到 `.deb` 文件,并使用 `dpkg -i ` 安装它 * (可选)如果您想验证 VisibleV8 是否按预期生成日志,可以使用 `../tests/run.sh -x $(docker ps -l --format={{.Image}}) trace-apis-obj` 运行一组回归测试。输出将根据一组预生成的日志验证 v8-shell 的输出,查找日志之间的差异。 ## 日志输出 VV8 在浏览器的当前工作目录中生成跟踪日志。 因此,当前的构建需要禁用 Chrome 沙箱(`--no-sandbox`),以便 VV8 可以根据需要创建和写入日志文件。 **请注意**,上述 `install` 步骤生成的默认 Docker 镜像在入口点 `chrome` 中 *不* 包含 `--no-sandbox` 参数(或任何参数)。 ## 项目内容 * 构建工具源码和资源(位于 `builder/`)简化了构建和安装定制 Chromium 变体的过程 * 补丁集目录(`patches/`)包含有关支持哪些 Chromium 版本的信息 * 测试目录(`tests/`)包含 JS 源码和预期日志文件,以帮助对 VV8 更新进行回归测试,并包含日志格式的文档 ## 研究论文 您可以在以下研究论文中阅读有关我们工作详情的更多信息: **VisibleV8: In-browser Monitoring of JavaScript in the Wild** [[PDF]](https://kapravelos.com/publications/vv8-imc19.pdf) Jordan Jueckstock, Alexandros Kapravelos *Proceedings of the ACM Internet Measurement Conference (IMC), 2019* 如果您在研究中使用 *VisibleV8*,请考虑使用此 **Bibtex** 条目引用我们的工作: ``` @conference{vv8-imc19, title = {{VisibleV8: In-browser Monitoring of JavaScript in the Wild}}, author = {Jueckstock, Jordan and Kapravelos, Alexandros}, booktitle = {{Proceedings of the ACM Internet Measurement Conference (IMC)}}, year = {2019} } ``` ## (已弃用)手动构建 VisibleV8 (这些说明适用于在 Chromium 75 上构建 VV8。在[这里](http://omahaproxy.appspot.com/)查找其他版本的提交哈希,但请确保本仓库的 `patches/` 中有匹配的补丁集。) * 确保您已安装 [Docker](https://docs.docker.com/install/) 和 [Python 3](https://www.python.org/downloads/),并有大量可用磁盘空间(例如 50GiB)用于下载和构建 Chromium * 克隆本仓库 *(我们将克隆的工作目录称为 **$VV8**)* * 在有足够空间检出并构建 Chromium 的设备上创建一个空的工作目录 *(我们将此目录称为 **$WD**)* * 在 `$WD/src/v8` *内部* 运行 `$VV8/builder/tool.py -d $WD checkout 5afa96dadfe803e8a058d6ede0c9c3987405b8d8` * 这将需要一段时间:它必须检出所有代码并运行初始软件安装步骤 * 所有工具安装将被捕获在一个 Docker 容器镜像中,该镜像可重复用于此版本 Chromium 的所有未来构建 * 从 *内部* `$WD/src/v8` 运行 `patch -p1 <$VV8/patches/5afa96dadfe803e8a058/trace-apis.diff` * 运行 `$VV8/builder/tool.py -d $WD build @std` * 这将 *真的* 需要一段时间:它必须构建所有 Chromium 和 [Visible]V8,以及 V8 的单元测试和 Chromium 安装程序 Debian 软件包 * 所有这些构件将保留在 `$WD/src/out/Builder` 中 * 您可以指定一个或多个 Chromium 的 Ninja 构建目标来代替我们的魔法占位符 `@std`(例如,`d8`) * 或者,运行 `$VV8/builder/tool.py -d $WD install` 以创建一个新的 Docker 镜像,其中安装了 Chromium/VV8 构建作为入口点(用于运行测试和/或使用 Chromium/VV8 构建您自己的基于 Puppeteer 的应用程序以进行插桩)
标签:API调用跟踪, Chromium, Cutter, ETW劫持, EVTX分析, GNU通用公共许可证, JavaScript引擎, Node.js, V8引擎, 云资产清单, 插桩分析, 数据可视化, 日志记录, 沙箱逃逸检测, 自动化分析, 行为监控, 请求拦截, 跨站脚本, 逆向工具, 逆向工程