如果字符串包含某个子字符串,则在任何字符串赋值上设置断点

Breakpoint on any string assignment if string contains a certain substring

我能否放置一个数据断点,如果将任何变量分配给包含特定子字符串的字符串,该断点就会触发?

例如,我想对包含 &ctoken= 的 URL 的构造方式进行逆向工程。它是用复杂的 JavaScript 完成的,目标是混淆它。

如果我可以告诉 JS VM 监视所有字符串变量并在某个子字符串出现在 any 变量上时中断,这将对我有很大帮助。

这可能吗?

  1. 您可以在浏览器开发者工具中使用条件断点,没错 单击菜单。
  2. 如果你能在页面某处写一个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'

我想这又是 - 对性能不利。