!! 先定义,后重写
无限debugger
1.不可混淆
debugger
2.可混淆
eval("debugger")
涉及到字符串了
3.可重度混淆
Function("debugger").call()/apply() 或赋值 bind()
XXX.constructor("debugger").call("action")
Function.constructor("debugger").call("action")
(function() {return !![];}["constructor"]("debugger")["call"]("action"))
debugger逻辑放入函数中{
setInterval
循环的 setTimeout
}
无限debugger的处理实际上很简单,有以下几种情况
1. 无限debugger贯穿全局
干掉定时器等全局事件(置空或重写)
2. 无限debugger在加密逻辑之前
详细讨论
3. 无限debugger在加密逻辑之后
不用管,script/第一行断点打上,从头开始
常见处理措施
无限debugger
的处理实际上很简单,有以下几种情况
- 无限
debugger
贯穿全局
干掉定时器等全局事件(置空或重写) - 无限
debugger
在加密逻辑之前
详细讨论 - 无限
debugger
在加密逻辑之后
不用管,script
第一行断点打上,从头开始
Function.prototype.constructor_bk = Function.prototype.constructor
Function.prototype.constructor = function(){
if (arguments[0]=="debugger"){
}else{
return Function.prototype.constructor_bk.apply(this, arguments)
}
}
这就证明,想要调试到函数入口,必须越过这个无限debugger
针对静态文件**/**伪动态文件(大部分都是这个情况)
用 fiddler Autoresponse
删掉 debugger
可以右键 never
针对真动态文件或Autoresponse失效或删掉debugger**逻辑很繁琐的情况下
- 如果是
Function
原理的debugger
,可以重写 函数构造器 - 如果是
eval
型的构造器,可以重构eval
函数 - 如果是定时器,并且 2失效了,可以重构定时器
- 在以上方式都失效时,向上找堆栈,在进入无限
debugger
之前打上断点将触发无限debugger
的函数置空(最麻烦,但是适用性最广)
控制台检测
控制台检测一定是通过JS实现。
- 禁止F12 右键的解决方案:直接手动开启控制台
- 呼出控制台弹窗或者跳转的解决方案:script断点,并且先尝试进行关键词搜索找线索。随机打上断点,不断缩小检测范围,直到找到。若是静态
js
/假动态直接可以Autoresponse
干掉,若是真动态则在执行控制台检测逻辑附近的时候重置函数(这个可以参考无限debugger
处理方案,重写函数,hook
关键位置等)
分析代码,可以重写window.open
一般这种检测都是通过
var x = document.createElement('div');
var isOpening = false;
Object.defineProperty(x, 'id', {
get:function(){
window.location='about:blank';
window.threshold = 0;
}
});
在没有打开控制台的时候,x.id 的值是undefined.一旦打开控制台,x.id就为"",可以打断点,然后hook,手动把x.id置为undefined
在没有打开控制台的时候,x.id
的值是undefined
.一旦打开控制台,x.id
就为""
,可以打断点,然后hook
,手动把x.id
置为undefined
非常重要的细节,先定义,后重写
函数定义之后,函数调用之前
内存爆破
内存爆破,指js通过死循环/频繁操作数据库(包括cookie)/频繁调取history等方式,使浏览器崩溃的一种反调试手段。关键词:频繁
还有一种特性情况:js文件很大,电脑内存不足(这种情况在调试层面几乎无解)
特点:
1. 正常运行时,一切正常2. 调试时利用时间差,调试特点等讲控制流推入循环
2. 调试时利用时间差,调试特点等讲控制流推入循环
3. 利用正则/toString() 判断代码是否进行格式化
4. 利用浏览器指纹判断是否为浏览器环境
注意:
在调试的时候,比如鼠标放到一个t
上,显示是一个函数,这时候显示的不一定是对的。一定要把代码执行到这一句,那时候再看,就一定是对的,(就是一定在一个作用域下)
代码投毒注意的点:
代码投毒需要注意的点:
try catch
if else
- 能实现判断的 || &&