本帖最后由 endless1 于 2019-5-22 18:15 编辑
主流反调试可分为以下三种:
1、基于动态请求参数的反调试,其请求链接不一致但网页内容相同,该反调试会直接使上一次设置的静态断点失效。
2、基于动态内容的反调试及基于eval加载的反调试,思路也很简单,直接是先解密使其成为流程清晰的代码,然后上Charles即可,此处不再赘述。
3、基于指纹参数的反调试,如果说前两种是阻止调试,那么第三种则是判断是否在调试,主流的反调试特征检测大多基于Function.prototype.toString()的
原型方法进行,无论是console.log()亦或是arguments.callee.caller.toString().length,此处修改劫持toString即可解决。
检测Chrome是否在调试
1、
var devtools = /./;
devtools.toString = function() {
debuggered = true;
}
console.log(devtools);
在控制台调试情况下,console.log会默认执行参数的toString方法(若存在),此检测手段的变种还有很多,如img.src的加载等。当然此处还有
__defineGetter__、defineProperty等定义具有get方法的类有相同效果也会被调用。非调试情况下不会执行相关方法。
2、
(function(a, b) {
b()
})(this,
function() {
var b = "";
length = function(){
return arguments["callee"]["caller"]["toString"]()["length"];
}();
bool = function(){
return /\n/.test(arguments["callee"]["caller"]["toString"]());
}();
});
检测文件的大小,及文件的换行符,用于判断是否被修改。
总结
和程序加固一样,有加固就有破解,只是时间问题。但基于JS的网页保护手段仍属鸡肋,我只见过一种网站上Charles不能调试。
所以目前只需要围绕toString为中心反反调试即可。
|