1

我试图运行chrome调试器来收集反混淆的JavaScript,但它为脚本返回大量的块。我想知道chrome如何将一个JavaScript文件分成多个块?一块脚本究竟是什么?Debugger.getScriptSource如何工作?

我知道,为每个脚本文件,脚本标记和eval()函数单独的​​块将被创建。我只想指出创建块的所有可能情况。例如,lazy parsing是否也为某些功能创建块?

如果有人能指出我关于过程如何工作的一些文档,那将是非常好的。

Chrome debugging protocol API used

+0

此函数仅[通过id提取脚本](https://cs.chromium.org/chromium/src/v8/src/inspector/v8-debugger-agent-impl.cc?l=662&rcl=f212dbeaa1c0b0c97ef1d01c4cf61a2d920157b8) 。所以问题是V8引擎如何分配一个你可能从源代码中推断出的ID。 – wOxxOm

回答

2

Debugger.scriptParsed事件是什么产生scriptId每个找到脚本。解析的每个脚本文件都会触发该事件,并且应该收到一个唯一的ID。除个别脚本文件外,页面源中的每个<script>标记实例也将获得其自己的标识。

事件回调传递的参数有很多。您可以通过注销arguments对象来检查所有参数。例如,对于脚本文件,您将得到url,而startLine将为出现在HTML资源中的<script>标记给出偏移量。

on('Debugger.scriptParsed', function() { 
    console.log(JSON.stringify(arguments, null, 2)(
}); 

调查

在回答你的问题的更新,我的理解是,在调试模式下,它会尝试一个完整的解析,而不是试图用一个预先解析优化。我无法真正了解v8代码库,但我做了一些测试。

我用一个按钮和一个单独的脚本文件创建了一个HTML页面。我在页面加载后立即执行了一个函数。另一个功能是在点击按钮上执行的。

document.addEventListener("DOMContentLoaded",() => { 
    document.getElementById('clickMe').addEventListener('click',() => clicked); 
}); 

我检查了Debugger.scriptParsed的输出。它立即解析了脚本文件。点击按钮后,没有其他输出条目。如果我更改处理程序以调用eval动态调用clicked,它确实输出了一个新的脚本块。

eval('clicked()'); 

这很有意义,因为解析器在执行之前无法知道它。这同样适用于内联处理程序,例如, onclick="doSomething()"

我注意到的其他块是来自chrome的Chrome扩展URI和内部URI。

+0

不Debugger.scriptParsed将scriptId作为参数吗?我知道每个脚本文件,脚本标记和eval()函数都将被解析为单独的块。我只是想找出所有可能的情况下创建块。例如,懒惰解析是否也为某些函数创建块? –

+0

不,“Debugger.scriptParsed”是由V8内部触发的事件。而'调试器。getScriptSource'是一个接受'scriptId'(和其他参数)的函数,所以你通常在解析回调中调用。我添加了一些额外的笔记。 –