7
原文地址: https://segmentfault.com/a/11...
其实我也不太确定是不是反调试,但是他阻止我看他代码了,那就是反调试,姑且这么称呼吧。

问题复现

一次扒某网站的前端代码,打开控制台要看Network,结果发现他们页面一打开控制台就不断的debugger100ms一次,很影响看页面内容。就像下面这样的

clipboard.png

问题分析

每次在断点处停下来的时候页面都会跳到source这个tab页面,也能够看到他的debugger的代码,其实他的实现很简单,只有这一行代码

(function() {var a = new Date(); debugger; return new Date() - a > 100;}())

虽然简单,但是却很有效。

  • 不停地打断你,页面跳到source页面,阻止你看他代码不
  • 断的产生不可回收的对象,占据你的内存,造成内存泄漏,没过多久浏览器就会卡顿

所以他带来的影响还是挺大的,我们需要解决这个问题。

问题解决

这个问题解决起来还是蛮简单的,问题解决只需要一句话:禁止断点
而对应的操作是在Chrome控制台Source Tab页点击Deactivate breakpoints按钮或者按下Ctrl + f8(下图)。

clipboard.png

这样就能禁用断点了,问题就得到了解决,但是当你需要调试的时候记得要起他哦。很简单的操作,但是你如果对Chrome控制台调试不熟悉的话还是比较头疼的。在这里记录一下,分享给更多的人。

更新

2018-09-10更新

后来发现这种做法有时候有些不妥,就比如有我们看别人网站代码有时候就是为了调试网站的代码,那么这时我们这么直接干脆的禁止断点后我们也没办法调试网站的代码了,那这就有点杀敌一千自损八百的意思。那有什么办法可以满足我们既能阻止网站一直debugger还能让我们继续调试网站的代码呢?这就要看网站怎么实现不断debugger了:
有的网站做的比较简单,是用具名函数做的,类似这样

setInterval(startDebug, 100); // 举个例子而已,很多网站并不是这么实现的
function startDebug() { debugger; };

这种情况比较好解决,我们随便重新定义这个方法就行了,形如:

function startDebug() {};

但是也有的网站做的比较厉害点,用匿名函数来实现,形如:

setInterval(function () { debugger }, 100); // 举个例子而已,很多网站并不是这么实现的

这种情况就比较蛋疼了,目前我是没啥解决方法,如果有人知道的话,不妨在下面留言了。

2019-03-13更新

下面有位老兄(@XYShaoKang)提到用条件断点来应对这样的实现

setInterval(function () { debugger }, 100); // 举个例子而已,很多网站并不是这么实现的

我试了下,确实可以,但是有局限性。
先说可以应对的情况,一个动图说明问题。

clipboard.png

再来说说不能应对的情况,还是一个动图说明问题。

clipboard.png

也就是说,条件端点的适用情况与具体代码的书写风格有关系。
另外,我发现Add conditional breakpoint下面的Never pause here也能在突破反调试的时候也能起到一定作用。局限性与上Add conditional breakpoint一样。
同样用两个动图说明问题。

能work的情况

clipboard.png

不能work的情况

clipboard.png


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

15 条评论
TommyHu · 2018年06月01日

最近也遇到了,真是的,还不让看代码,文章转载了

回复

XYShaoKang · 2018年11月16日

手动加条件断点,条件设为 false 就可以了

回复

0

这种应该怎么弄呢?

LetHerGo坚果 · 3月12日
0
XYShaoKang · 3月13日
0

@LetHerGo坚果 这个老兄说的很对,具体的可以参考这个文档:条件代码行断点

aqiongbei 作者 · 3月13日
_xiahuaxian · 4月8日

那不能work的情况怎么解决呢?没有给出相应的方法啊

回复

0

目前没有找到解决办法。

aqiongbei 作者 · 4月9日
0

试试获取setInterval的返回值,然后调用clearInterval()

莫先生 · 4月17日
0

@莫先生 但是他这个目的就是不给你返回值,才让你无法调试的,要拿返回值除非改写他代码

_xiahuaxian · 4月29日
小怀卜坏 · 4月26日

有个解决方案,就是麻烦了点:直接把网页保存到本地,修改JS代码,然后打开本地的HTML进行调试

回复

汪大大坚 · 5月8日

下载js到本地,去除debugger代码,使用抓包工具fiddler或者charles,刷新网页的时候抓到这个js,返回的内容改成去除debuger后的代码

回复

载入中...