如果我想在Javascript中挂起对eval和settimeout等函数的调用来获取代码eval将要执行的事情,并且通过函数settimeout将要调用,我将从哪里开始?
场景是,我转到chrome的网页,我希望在这些点上设置断点。然而,它们可能会被混淆(可能是恶意的),所以我不能只搜索这些类型的呼叫来源。
难道我不能直接使用chrome来执行此操作,或者我是否真的需要在v8中创建一个钩子以捕获对特定js函数的这些调用?
无法拦截所有代码执行事件。您必须修改源。
也就是说,eval
和setTimeout
都只是函数,作为全局对象的可配置属性安装。你可以用包装器覆盖它们:
var original_eval = eval;
eval = function(str) {
console.log("eval was called with: " + str);
return original_eval(str);
}
请注意,eval
和setTimeout
之间存在很大的概念差异:前者采用新的源代码,后者只能调度对现有函数的调用(可能是使用eval
创建的)。
还有Function
构造函数,类似于eval
。