如何从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++字符串:
- 首先添加处理V8字符串的头文件:
#include "src/objects/string.h"
- 修改打印逻辑,先校验类型再转换:
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
相关产品推荐
相关产品推荐

