是否有可能避免在Chrome中破坏调试器语句?

时间:2018-12-29 15:11:21

标签: javascript google-chrome google-chrome-devtools

我正在尝试对一个混淆不清的JS进行逆向工程,而作者所做的技巧之一就是从一个匿名函数中连续调用debugger语句:

demo

不幸的是,我无法右键单击它并永不暂停,因为每次调用该函数时都会产生一个新的匿名函数。在打开DevTools的情况下,检查代码的唯一方法是切换禁用所有断点按钮,但这也会禁用我的断点。

有什么方法可以完全禁用Chrome中的所有debugger语句

如果没有,可以采取什么措施绕过此反篡改技巧?

3 个答案:

答案 0 :(得分:5)

将有问题的webworker.js文件下载到本地驱动器,并使用文本编辑器将所有出现的“调试器”替换为“;”。

然后使用Chrome扩展程序将 remote 资源替换为您的 local 修改版本。

https://chrome.google.com/webstore/detail/resource-override/pkoacgokdfckfpndoffpifphamojphii?hl=en

仅供参考:我不认可上述扩展名。这只是我通过Google找到的第一个。

答案 1 :(得分:2)

通过使用devtools-on-devtools来自行开发devtools:

  1. 将devtools停靠在单独的窗口中
  2. 按下完整的devtools热键- Ctrl Shift i i
  3. 在此新的devtools窗口控制台中粘贴以下代码并运行它

{
  const rx = /\bdebugger\b/y;
  const eventSymbol = SDK.DebuggerModel.Events.DebuggerPaused;
  const original = [...SDK.targetManager._modelListeners.get(eventSymbol)]
    .find(v => v.listener.name === '_debuggerPaused');
  const debuggerModel = SDK.targetManager.models(SDK.DebuggerModel)[0];

  SDK.targetManager.removeModelListener(
    SDK.DebuggerModel,
    eventSymbol,
    original.listener,
    original.thisObject);

  SDK.targetManager.addModelListener(
    SDK.DebuggerModel,
    eventSymbol,
    async function({data}) {
      if (data._debuggerPausedDetails.reason === 'other') {
        const frame = data._debuggerPausedDetails.callFrames[0];
        const code = await frame._script.requestContent();
        let {columnNumber: x, lineNumber: y} = frame._location;
        let pos = 0;
        while (y--)
          pos = code.indexOf('\n', pos) + 1;
        rx.lastIndex = Math.max(0, pos + x);
        if (rx.test(code)) {
          debuggerModel.resume();
          return;
        }
      }
      original.listener.apply(original.thisObject, arguments);
    });
}

注意:

  • 您可以将此代码另存为snippet in devtools,以便以后运行。
  • 要在主要devtools中快速切换对接模式,请按 Ctrl Shift D D
  • 从理论上讲,将此代码放入Chrome应用程序目录中的resources.pak文件并不难。有几种工具可以反编译/构建该文件,因此只需将代码添加到内部具有SDK.DebuggerModel.Events.DebuggerPaused之类的任何脚本中即可。甚至可以编写一种可以在Chrome更新时自动执行此操作的工具。

答案 2 :(得分:0)

右键单击debugger语句旁边的行,然后选择“从不在这里停顿”。

screenshot