将 debugger 关键字的 token 换成 null, 添加一个自己关键字因为不是阅读 v8 代码的文章, 不在介绍怎么从头跟了, 直接看 v8/src/parsing/scanner-inl.h 中的 V8_INLINE Token::Value Scanner::ScanSingleToken 函数, 解释器的第一步, 将扫描文本生成 token 找到识别关键字的代码向前跟两补到达 V8_INLINE Token::Value Scanner::ScanIdentifierOrKeywordInner 函数, 来看看这段代码:阻碍我们添加关键字的第一道门槛是 CanBeKeyword(scan_flags) 预判断, 关键字经过它后才能进入 KeywordOrIdentifierToken 函数做一个完全判断。让我们看看 scan_flags 是怎么生成的, 关键地方是这里:v8 在辨别是关键字还是变量的预判断中做了一个映射表, 即判断哪些标识符可能是关键字, 哪些标识符一看就不可能, 直接筛去一部分, 以提高运行效率。以 flags 的形式记录, 让我们看看 character_scan_flags 是怎么生成的:总结来说就是将 0-127 输入 GetScanFlags 函数, 然后与结果做一个映射, 用 py 实现就是:因为 char 实际上是一个 0-127 直接的数字, 所以可以直接使用。接下来重点放在 CanBeKeywordCharacter IsKeywordStart 函数, 先来看 CanBeKeywordCharacter:利用了递归模板元编程已经一些宏的骚操作, 总的来说就是将所用的关键字全拼接起来形成一个长字符串, 像这样 "asyncawaitbreakcase..." 然后如果要检查的字符在这堆字符串中就返回 true, 如果遍历完了这段字符串也没找到就返回 false,然后是 IsKeywordStart简单来说就是检查开头, 如果首字符对不上就是 false, 对上了就认为可能是关键字。好了, 现在我们可以通过 KeywordOrIdentifierToken 函数跟入 v8/src/parsing/keywords-gen.h 中的 PerfectKeywordHash::GetToken 函数了:这是最小完美哈希的实现, 通过精心构造的哈希函数,确保所有关键字的哈希值在 [0, 127] 范围内互不冲突。每个关键字映射到唯一的桶(key), 有现成的算法可以生成完美哈希。我们用 py 简单模拟一下:这就是 v8 判断关键字的全部流程。让我们从 v8/src/parsing/keywords-gen.h 开始。事实上官方提供了生成脚本 v8/tools/gen-keywords-gen-h.py 配合 v8/src/parsing/keywords.txt, 可以生成对应的 v8/src/parsing/keywords-gen.h, 因为我是在 windows 上开发的, 不太好使用 gperf 工具, 所以就不从自定义 keywords.txt 文件开始, 生成 keywords-gen.h 文件了理想的情况是不改变 PerfectKeywordHash::Hash 函数中的 asso_values, 而是在 kPerfectKeywordHashTable 空闲的位置自定义一个关键字。好消息是有非常多的空闲位置, 如 u_debugger 对应的 hash 值为 111 这样只是做好了第一步, 还要往回看, 关键字的预判断来到 v8/src/parsing/scanner-inl.h 文件的 #define KEYWORDS(KEYWORD_GROUP, KEYWORD), 增加:这里 KEYWORD("debugger", Token::kDebugger) 中的 Token::kDebugger 可以不用修改, 因为没用到两个 debugger 对比
代码提示
附件方法 6fbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6F1L8%4c8Z5K9h3&6Y4i4K6u0V1x3U0x3K6x3#2)9J5c8V1y4Z5M7X3!0E0K9i4g2E0e0h3!0V1case Token::kIdentifier:
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287108.htm
[原创]魔改chromium过无限debugger
59 浏览
10 回复
感谢分享
感谢分享
赞赞赞
感谢分享
感谢分享0000000000000000
大佬有实力
感谢分享
感谢分享
感谢分享
感谢分享