《反爬虫AST原理与还原混淆实战》书稿内容
JS Hook
声明:本教程从安全角度出发讲解,只为增加读者的安全知识,提升读者数据安全意识,以及对于病毒和钓鱼网站的防护能力。绝无其他任何目的与用途。
一、JS Hook原理与作用
JS Hook原理非常简单,现在将一个最简单的例子,比如有这样一个函数
function test(a,b){
return a+b;
}
我们可以直接在console里边修改这个函数,比如如下这样:
var _test=test;
test=function(a,b){
console.log(a,b);
var result=_test(a,b);
console.log(result);
}
我们在console里边调用test(1,2),会发现函数输出已经被我们修改了。这里的修改和APP的frida修改几乎一样。我们可以用它来做什么呢?最常见的是修改一些系统函数,比如debugger、Function、eval、JSON.stringfy等等反调试相关的。
二、JS Hook检测与过检测
有的网站会在Hook这里做个检测,比如读者可以在console里边输出test+"",你会发现我们修改后的函数已经和以前的不一样的,因而可以在网页源代码里做个判断函数字符串是否相等的检测来防止你Hook,如下所示。
setInterval(function(){
test+""=="function test(a,b){return a+b;}"
?console.log("未修改")
:setInterval(function(){eval("debugger")},
1000);
我们要想过这种检测,可以Hook一下toString方法,笔者在这里直接返回正确的。实际开发中,读者可以添加不同的if条件定位到需要的函数再来做修改。
Function.prototype.toString=function(){
return "function test(a,b){return a+b;}"
}
Hook setInterval也可以做到
var _setInterval=setInterval;
setInterval=function(a,b){
if(a.toString().indexOf("debugger") != -1){
return null;
}
_setInterval(a,b);
}
三、JS Hook对象属性
Object.defineProperty()定义新的属性或者修改属性。
<script>
var obj={};
console.log("过渡代码");
function test(){
obj.name="losenine";
}
</script>
对这段代码进行Hook,我们在定义name之前让它停下来。然后进行Hook,代码如下:
Object.defineProperty(obj,"name",
{set:function(x)
{debugger;return x;}
}
)
Hook cookies的话,必须在加载之前进行Hook。除了使用Chrome拓展,我们可以自己查找。比如查找pwd的cookie:
Object.defineProperty(document,"cookie",
{set:function(x){
if(x.indexOf("pwd")!=-1){
if(x.indexOf("pwd=null;")==-1){
console.log(x);
}
}
retrun x;
}
})