如果字符串包含某个子字符串,则在任何字符串赋值上设置断点
Breakpoint on any string assignment if string contains a certain substring
我能否放置一个数据断点,如果将任何变量分配给包含特定子字符串的字符串,该断点就会触发?
例如,我想对包含 &ctoken=
的 URL 的构造方式进行逆向工程。它是用复杂的 JavaScript 完成的,目标是混淆它。
如果我可以告诉 JS VM 监视所有字符串变量并在某个子字符串出现在 any 变量上时中断,这将对我有很大帮助。
这可能吗?
- 您可以在浏览器开发者工具中使用条件断点,没错
单击菜单。
- 如果你能在页面某处写一个js,你
可以这样做:
.
if(window.location.pathname.indexOf("&ctoken=") > -1){
debugger;// browser will put breakpoint automaticaly here, if condition is trully.
console.dir(window.location);
}
开始之前 - 据我所知这是不可能的。
您需要的(甚至在创建调试功能之前)是已经装箱到 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'
我想这又是 - 对性能不利。
我能否放置一个数据断点,如果将任何变量分配给包含特定子字符串的字符串,该断点就会触发?
例如,我想对包含 &ctoken=
的 URL 的构造方式进行逆向工程。它是用复杂的 JavaScript 完成的,目标是混淆它。
如果我可以告诉 JS VM 监视所有字符串变量并在某个子字符串出现在 any 变量上时中断,这将对我有很大帮助。
这可能吗?
- 您可以在浏览器开发者工具中使用条件断点,没错 单击菜单。
- 如果你能在页面某处写一个js,你 可以这样做:
.
if(window.location.pathname.indexOf("&ctoken=") > -1){
debugger;// browser will put breakpoint automaticaly here, if condition is trully.
console.dir(window.location);
}
开始之前 - 据我所知这是不可能的。
您需要的(甚至在创建调试功能之前)是已经装箱到 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'
我想这又是 - 对性能不利。