You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从V8 Script对象中提取URL字符串?

提取V8中JS脚本来源URL的方法

背景

我对V8做了小幅修改,目的是在解析JS代码前打印其来源URL。同时我也会打印JS代码本身,用于逐步还原可能存在的恶意JS代码,这部分是在jmrk的指导下完成的。

已实现功能

目前修改后,Chromium会在标准输出打印包含JS URL的对象,格式类似:

Name: 0x2357009098e1 <String[55]: e"chrome://... module_proxy.js">

待解决问题

我需要从这个对象中提取出URL字符串(比如chrome://...),但自己的C++能力有限,不知道该怎么操作。

当前修改的代码片段(v8/src/parsing/parsing.cc)

@@ -16,6 +16,14 @@
 #include "src/parsing/scanner-character-streams.h"
 #include "src/zone/zone-list-inl.h"  // crbug.com/v8/8816
 
+ #include <string>
+ #include <iostream>
+ #include <stdio.h>
+ #include "src/objects/script.h"
+ #include "src/objects/call-site-info.h"
+
 namespace v8 {
 namespace internal {
 namespace parsing {
@@ -50,6 +58,11 @@ bool ParseProgram(ParseInfo* info, Handle<Script> script,
       ScannerStream::For(isolate, source));
   info->set_character_stream(std::move(stream));
 
+  if (script->HasValidSource()) {
+    Handle<Object> source_url(script->GetNameOrSourceURL(), isolate);
+    std::cout << source_url << std::endl;
+  }
+
  Parser parser(isolate->main_thread_local_isolate(), info, script);

解决方案

要提取出纯URL字符串,你需要利用V8提供的字符串处理API,将内部对象转换为C++字符串:

  1. 首先添加处理V8字符串的头文件:
#include "src/objects/string.h"
  1. 修改打印逻辑,先校验类型再转换:
if (script->HasValidSource()) {
  Handle<Object> source_url_obj(script->GetNameOrSourceURL(), isolate);
  // 先确认对象是V8字符串类型
  if (source_url_obj->IsString()) {
    Handle<String> source_url = Handle<String>::cast(source_url_obj);
    // 转换为UTF-8编码的C++字符串
    std::string url_str = source_url->ToUtf8Checked();
    std::cout << "JS Source URL: " << url_str << std::endl;
  }
}

关键逻辑说明

  • IsString():校验对象类型,避免类型转换错误
  • Handle<String>::cast():将通用Object类型的句柄转换为String类型句柄
  • ToUtf8Checked():安全完成V8内部字符串到C++ std::string的编码转换与内存分配,适配绝大多数场景

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 02:13:19