我正在尝试对一个混淆不清的JS进行逆向工程,而作者所做的技巧之一就是从一个匿名函数中连续调用debugger
语句:
不幸的是,我无法右键单击它并永不暂停,因为每次调用该函数时都会产生一个新的匿名函数。在打开DevTools的情况下,检查代码的唯一方法是切换禁用所有断点按钮,但这也会禁用我的断点。
有什么方法可以完全禁用Chrome中的所有debugger
语句?
如果没有,可以采取什么措施绕过此反篡改技巧?
答案 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:
{
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);
});
}
注意:
resources.pak
文件并不难。有几种工具可以反编译/构建该文件,因此只需将代码添加到内部具有SDK.DebuggerModel.Events.DebuggerPaused之类的任何脚本中即可。甚至可以编写一种可以在Chrome更新时自动执行此操作的工具。答案 2 :(得分:0)