【问题标题】:Is it possible to avoid breaking on a debugger statement in Chrome?是否可以避免破坏 Chrome 中的调试器语句?
【发布时间】:2019-05-26 23:57:55
【问题描述】:

我正在尝试对一个严重混淆的 JS 进行逆向工程,作者所做的其中一个技巧是在匿名函数中不断调用 debugger 语句:

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

有没有办法在 Chrome 中专门禁用所有 debugger 语句

如果没有,可以做些什么来绕过这个防篡改技巧?

【问题讨论】:

  • 您还可以尝试通过检查调用堆栈来覆盖/欺骗运行该代码的某些内容,例如window.setTimeout

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 截图不公平,webworker.js文件与此无关。生成 anon 函数的脚本是主网站的脚本,由于它完全被混淆了,我找不到实际执行该操作的代码来禁用它,尤其是无法添加我自己的断点。
  • @emi 还是一样的过程。您下载主脚本,修改它然后替换它。请记住,您可以添加 JS 源代码来更改其去混淆方式。你能分享这个脚本文件的 URL 吗?
  • 当然,这是scriptmain website。实际上,我一直在使用本地覆盖直接通过 DevTools 替换部分代码。它一直运行良好,我已经设法恢复。英。相当多的代码,但现在我被卡住了,删除调试器生成真的很有帮助。
  • @emi 这是一个令人讨厌的混淆文件。看起来一切都是通过_0x5e32f1 函数执行的。如果您修改此函数,您可以调用toString() 来查看函数是否包含“调试器”一词,然后不要调用该函数。我想他们想到了这种攻击,可能没那么简单,但这是我首先要尝试的。
【解决方案2】:

使用 devtools-on-devtools 破解 devtools 本身:

  1. 将开发工具取消停靠到单独的窗口中
  2. 按完整的 devtools 热键 - CtrlShifti
  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 以便以后运行。
  • 要在主开发工具中快速切换停靠模式,请按 CtrlShiftDD
  • 理论上,将这段代码放到Chrome应用目录下的resources.pak文件中并不难。有几种工具可以反编译/构建该文件,因此只需将代码添加到任何包含 SDK.DebuggerModel.Events.DebuggerPaused 之类的脚本中即可。甚至可以编写一个在 Chrome 更新时自动执行此操作的工具。

【讨论】:

  • 哇,太酷了!不幸的是,它没有用quite well,但它确实有帮助,谢谢!
  • 不能说为什么它会为你闪烁。在我的简单测试脚本中根本没有眨眼。
  • 它也在我的项目上闪烁。该页面现在一直在暂停和启动。
【解决方案3】:

右键单击debugger 语句旁边的行并选择“从不暂停”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2012-09-02
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多