AntiDebug实现
最近玩文心一言时,打开开发者工具,发现会进入一个匿名函数的断点中,点击继续执行则直接变成空标签页面。这里明显是做了反debug。这里就该实现技术分析下。
分析
- 在断点位置查看调用栈发现有setInterval。
- 匿名函数这里的标签显示是VM,所以包含断点的匿名函数是eval或者new Function生成的代码。
- 断点执行后,执行window.location.replace(“about:blank”);。但具体是如何判断进入了断点,因为这里做了代码混淆,没分析出来。但是可以想到一个办法就是利用时间判断来做。进入debugger之后的逻辑执行肯定是会明显的变晚,算一个时间差就可以判断出是不是开了开发者工具。
例子
1 | (function () { |
讯飞星火的方案
查看了下星火,发现星火也做了反爬虫,但方案不同,星火是利用打开开发者工具打开后会挤压网页文档的高或者宽,通过计算这个差来判断。但这个方案是有弊端的,开发者工具如果需要独立窗口,这个检测就无效了。
1 | const widthThreshold = window.outerWidth - window.innerWidth > threshold; |
反AntiDebug
大致分析出了实现方案,那么对应的破解方案也就简单了。星火这类最简单,正如刚才提到的,开发者工具直接走独立窗口直接就破解。
百度的因为是用到了定时器,因此重写定时器实现即可。推荐使用Tampermonkey
1 | window.setInterval = function(callback, delay) { |
Never Pause Here
写在最后
- 只论技术AntiDebug有意思,比如了解了debugger的触发机制,判断开发者工具打开的HACK技巧,如何破解AntiDebug等等。
- 抛开技术来说的话,鼓吹自研的某度,某星火,怕啥前端debug呢,心虚100%为啥?