A-A+

【JS逆向】无限debugger的过法

2022年06月07日 22:16 汪洋大海 暂无评论 共2799字 (阅读74 views次)

在JS逆向过程当中,获取用发F12抓取XHR的时候,常常会发现网页不让我们打开F12开发人员工具。如果这个时候我们开启工具中禁止断点之后,虽然我们可以抓取xhr,但是这样我们无法调试代码部分了,开启了禁止断点之后,我们自己也无法在代码当中下断点了。

总结一下无限debugger的过法

1、采用hook的方法来hook定义器

hook定时器其实就是修改这个函数的执行属性,可以达到让他执行且不影响我们的正常功能又可以过我们的debugger代码,下面我写一断简单的hook代码(当然hook代码很多,不止这一个,只要你懂它的原理,那么你肯定会造出很多比我这个优秀很多的hook代码。)。

var _setInterval=setInterval//先定义一个变量来接收这个函数
setInterval=function (){}//在修改原函数

images

hook下断点的位置很重要,一定要在这个函数没执行之前,我这里是把断点下在1行这个位置,工具还没有执行里面的代码,加载代码就会断住,然后在这个时候就可以在我们的控制台输出我们的hook代码,回车执行。images

在点击跳到下一个断点就OK了,就完美就过了我们的debugger。

2、在debugger所在行右键选择never pause here

先将当前 Breakpoints 里面的断点删除,然后在 debugger 语句所在的行的行号上单击鼠标右键,这里会出现一个下拉菜单,如图所示。

图片
在行号上单击鼠标右键
这里会有一个叫作 Never pause here 的选项,意思是从不在此处暂停,我们选择这个选项,于是页面变成如图所示的样子。
图片
点击 Never pause here 选项后的页面
当前断点显示为橙色,并且断点前面多了一个 符号,同时 Breakpoints 也出现了刚才添加的断点位置。这时再次点击 Resume 按钮,就可以发现我们不会再进入无限 Debugger 模式了。

3、在debugger所在行加条件断点(Add conditional breakpoint)false(但是一些网站会卡死)

     点击当前debugger所在行,选择 Add conditional breakpoint,如图所示。
图片
Add conditional breakpoint 选项
这个模式更加高级,我们可以设置进入断点的条件,比如在调试过程中,期望某个变量的值大于某个具体值的时候才停下来。但在本案例中,由于这里是无限循环,所以我们没有什么具体的变量可以作为判定依据,因此可以直接写一个简单的表达式来控制。
点击 Add conditional breakpoint 选项,直接填入 false 即可,如图所示。
图片
设置 Conditional breakpoint 为 false
设定为 false,其效果就和选择了 Never pause here 是一样的,重新点击 Resume 也不会进入无限 Debbugger 循环了。

4、使用chrome的overrides替换源js文件,修改debugger相关代码

搜索引擎可以查看倒  Overrides 面板的用法,利用它我们可以将远程的 JavaScript 文件替换成本地的 JavaScript 文件,这里我们依然可以使用这个方法来对文件进行替换,替换成什么呢?

很简单,我们只需要在新的文件里面把 这个关键字删除。
我们将当前的 JavaScript 文件复制到文本编辑器中,删除或者直接注释掉 这个关键字,修改如下:
打开 Sources 面板下的 Overrides 面板,将修改后的完整 JavaScript 文件复制进去,修改的内容如图所示:
图片
替换 JavaScript 文件
替换完成之后,我们重新刷新网页,这时候就发现不会进入无限 Debugger 模式了。
另外我们还可以使用 Charles、Fiddler 等抓包工具进行替换,也可以使用浏览器插件 ReRes 等进行替换,也可以使用 Playwright 等工具使用 Request Interception 进行替换,达成的效果是一致的,原理都是将在线加载的 JavaScript 文件进行替换,最终消除无限 Debugger。

 

最好使用工具注入,浏览器控制台执行的话网页刷新会失效

 

5、constructor关键字启动的debugger,注入代码

 

(()=>{
Function.prototype.__constructor = Function.prototype.constructor;
Function.prototype.constructor = function (){
if (arguments && typeof arguments[0] === 'string'){
  	  if ("debugger" === arguments[0]){
  	  return
  	  }
  	  return Function.prototype.constructor.apply(this, arguments);
  	  }
    }
})()

6、Function关键字启动的debugger,注入代码

 

(()=>{
Function.prototype.__constructor = Function;
Function = function (){
if (arguments && typeof arguments[0] === 'string'){
    if ("debugger" === arguments[0]){
  	  return
    }
  	  return Function.apply(this, arguments);
    }
    }
})()
Function.prototype.constructor_bc = Function.prototype.constructor
Function.prototype.constructor = function() {
if (arguments[0] === "debugger") {}
else {
    Function.prototype.constructor_bc.apply(this, arguments)
}
}

 

7、eval关键字启动的debugger,替换eval函数

 

eval_bc = eval
eval = function(a) {
if (a === '(function() {var a = new Date(); debugger; return new Date() - a > 100;}())') {}
else {
    return eval_bc(a)
}
}

 

8、定时器debugger,替换`setInterval`或者清除定时器,也可以使用7方法

 

setinval_b= setInterval
setInterval = function(a, b) {
if (a.toString().indexOf('debugger') == -1) {
        console.log(a);
  	  return setinval_b(a, b)
    }
}
for (var i = 1; i < 99999; i++)window.clearInterval(i);

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言