Tide安全团队 15小时前
JS逆向-绕过无限debugger
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文由Tide安全团队撰写,深入探讨了JS逆向工程中常见的反调试技术——无限debugger的原理,并提供了多种绕过方法。文章首先介绍了无限debugger的定义及其在代码调试中造成的困扰,随后通过案例分析了无限debugger的实现机制。最后,文章详细阐述了禁用断点、此处暂停、条件断点和本地覆盖等多种绕过技巧,帮助读者在JS逆向过程中有效应对反调试挑战。

🛡️ **反调试技术概述**: JavaScript逆向工程中,反调试技术旨在阻止或干扰调试过程。无限debugger是一种常见手段,它通过在代码中插入debugger语句,使调试器在特定位置中断,从而增加逆向难度。

⚙️ **无限Debugger实现原理**: 无限debugger通常通过`setInterval`定时器和动态执行代码实现。代码会不断地执行包含debugger语句的函数,导致调试器循环中断,从而达到反调试的目的。

🚫 **禁用断点绕过**: 在开发者工具中禁用所有断点,可以阻止debugger语句触发中断。但此方法也会禁用用户自定义的断点,影响调试效率,因此不常用。

⏸️ **“永不在该处暂停”**: 在debugger语句所在行右键,选择“永不在该处暂停”选项,可以阻止调试器在该处中断,从而绕过无限debugger。

🚦 **条件断点绕过**: 设置条件断点,并将条件设置为false。这样,debugger语句的执行会被条件判断阻止,从而绕过无限debugger。

📝 **本地覆盖**: 通过开发者工具的“工作区”功能,将远程JavaScript文件替换为本地文件。在本地文件中删除或注释掉debugger语句,可以彻底绕过无限debugger。

声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!


0x01 JS逆向-反调试

反调试就是实现防止他人调试、动态分析自己的代码

检测调试方法:

无限debugger技术

键盘监听(F12)

检测浏览器的高度插值

检测开发者人员工具变量是否为true

利用console.log调用次数

利用代码运行的时间差

利用toString

检测非浏览器

0x02 无限Debugger的原理与绕过

Debugger是JavaScript中定义的一个专门用于断点调试的关键字,只要遇到它,JavaScript的执行就会在此处中断,进入调试模式。有了Debugger这个关键字,我们就可以非常方便的对JavaScript代码进行调试,比如使用JavaScript  Hook时,我们可以加入Debugger关键字,使其在关键的位置停下来,以便我们查找逆向突破口,但有时候Debugger会被网站开发者利用,使其成为阻挠我们正常调试的拦路虎。

0x03 案例介绍

案例源码如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>无限Debugger案例</title>
</head>
<h1 id="box">TIDE</h1>
<body>
 <script type="text/javascript">
  setInterval(()=>{
      (function(a{
          return (function(a{
              return (Function('Function(arguments[0]+"' + a + '")()'))
          }
          )(a)
     }
     )('bugger')('de'00, (0,
     0));
}
1000);

 </script>
</body>
</html>

此处我们打开刚刚我们搭建好的案例地址。一般操作和之前的网站没有什么不同。但是,一旦我们打开开发者工具,就会发现它立即进入了断点模式,如下图所示。此处我们并未设置任何断点,他就直接进入了断点模式,这时候我们点击 恢复脚本执行按钮,尝试跳过这个断点继续执行,但结果仍会一次次的进入断点模式,无限循环下去,我们称这样的情况为无限debugger。

0x04 实现原理

首先我们要做的是找到无限Debugger的源头,上面的案例通过堆栈回溯,查看 debugger 是如何生成的。继续往上进行追溯,发现逻辑代码。

setInterval(()=>{
      (function(a) {
          return (function(a) {
              return (Function('Function(arguments[0]+"' + a + '")()'))
          }
          )(a)
     }
     )('bugger')('de', 0, 0, (0,
     0));
}
, 1000);

0x05 常见绕过方法:

因为debugger其实就是对应的一个断点,它相当于用代码显示的声明了一个断点,要解除它,我们只需要禁用这个断点就可以了。

1.1 禁用断点法

此处我们可在开发者工具右侧有一个禁用断点点击它,该按钮就会被激活,变成蓝色。这时我们再次点击恢复脚本执行按钮,跳过当前断点,页面就不会再进入到无限 debugger 的状态了。但这种全局禁用断点的一个弊端是,禁用之后,我们自身添加的断点也无法进行调试了,所有的断点都不会被执行。所以这种方法基本不用。

1.2 此处暂停法

将停用断点按钮关掉后,页面再次进入无限Debugger模式,此处我们可以尝试另一种方法来跳过这个无限 debugger。在debugger语句所在行的行号上单击鼠标右键,此时会出现一个快捷菜单。我们选择永不再此处暂停这个选项后,再次点击恢复脚本执行按钮,发现页面也没有再进入到无限 debugger 的状态了。

1.3 条件断点法

在JS代码 debugger 行数位置,鼠标右键添加条件断点,其中条件设为false再次点击恢复脚本执行按钮,发现页面正常执行。

1.4 本地覆盖法

另外我们可以通过源代码-工作区功能,将远程的Javascript文件替换成本地的JavaScript文件,此处绕过方法直接将其中的 debugger 这个关键字删除即可。 此处我们点击存在无限debugger断点的js代码文件,右键选择替代内容

添加一个用于存放代码的文件夹后,根据上方的提示选择允许。此后,我们直接将存在debugger的语句注释掉,然后保存。再次刷新,发现debugger断点也已经跳出。


往期推荐

TscanPlus-一款红队自动化工具

潮影在线免杀平台上线了

自动化渗透测试工具开发实践

【红蓝对抗】利用CS进行内网横向

一个Go版(更强大)的TideFinger

SRC资产导航监测平台Tsrc上线了

新潮信息-Tide安全团队2022年度总结

记一次实战攻防(打点-Edr-内网-横向-Vcenter)

E

N

D


Tide团队产品及服务

团队自研平台:潮汐在线指纹识别平台 | 潮听漏洞情报平台 | 潮巡资产管理与威胁监测平台 | 潮汐网络空间资产测绘 | 潮声漏洞检测平台 | 在线免杀平台 | CTF练习平台 | 物联网固件检测平台 | SRC资产监控平台  | ......


技术分享方向:Web安全 | 红蓝对抗 | 移动安全 | 应急响应 | 工控安全 | 物联网安全 | 密码学 | 人工智能 | ctf 等方面的沟通及分享


团队知识wiki:红蓝对抗 | 漏洞武器库 | 远控免杀 | 移动安全 | 物联网安全 | 代码审计 | CTF | 工控安全 | 应急响应 | 人工智能 | 密码学 | CobaltStrike | 安全测试用例 | ......


团队网盘资料:安全法律法规 | 安全认证资料 | 代码审计 | 渗透安全工具 | 工控安全工具 | 移动安全工具 | 物联网安全 | 其它安全文库合辑  | ......


📍发表于:中国 山东

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

JS逆向 反调试 无限debugger 绕过
相关文章