我可以放置一个数据断点,如果将任何变量分配给包含某个子字符串的字符串,则会触发该断点吗?
例如,我想对包含&ctoken=
的 URL 的构造方式进行逆向工程。它是用复杂的JavaScript完成的,目标是混淆它。
如果我能告诉 JS VM 监视所有字符串变量并在某个子字符串出现在任何变量上时中断,这将对我有很大帮助。
这可能吗?
在我开始之前 - 据我所知,这是不可能的。
您需要的(甚至在创建调试功能之前)是已经装箱以String
本机内置对象的原始字符串类型,然后String
已经代理。
更多解释:
只有
const s = "hi"
还不是String
的实例 - 内置的本机对象,由 ECMAScript 实现提供给您的范围 - 而是一个原始类型。 此类原始类型只不过是指向原始数据存储器引用的指针。我什至假设有像 Java 这样的内置池来优化情况,例如
const s = "hi"
const x = new String("hi")
是数据对象的相同内存引用。 但后者当然会被String
框住。 http://bespin.cz/~ondras/html/classv8_1_1String.html
在原始类型上,即使我们想添加订阅者,我们也无法添加订阅者。
例如:
s.charAt(i)
将自动装箱s
到其包装器String
。
观察每个原始类型意味着我们必须将所有原始字符串装箱到String
这对性能来说根本不是一件好事。
不仅如此,String
本身的实现还必须允许我们添加订阅者,因此已经代理。
在JS中,这样的代理看起来像这样(为了使它更容易理解我所说的代理的意思):
var proxiedString = new Proxy(String, {
defineProperty(target, propKey, propDesc) {
console.log('defined a new string')
},
set(obj, prop, value) {
console.log('set a new value to a string')
}
});
proxiedString.x = 'newPropValue'
我又猜 - 对性能不利。
- 您可以在浏览器 devTools 上使用条件断点,通过右侧 单击菜单。
- 如果你可以在页面的某个地方写一个js,那么你 可以做到这一点:
.
if(window.location.pathname.indexOf("&ctoken=") > -1){
debugger;// browser will put breakpoint automaticaly here, if condition is trully.
console.dir(window.location);
}