假设我们现在有这样一个JS代码
function test(aa,bb){
cc = aa + bb;
return cc;
}
test(100,200);
我们在console中可以修改这个函数,比如让它打印各个参数的输出结果,这就是一个JS Hook,和Frida的Hook很相似。
var _test=test;
test=function(aa,bb){
console.log(aa);
console.log(bb);
var result=_test(aa,bb);
console(result);
我们现在函数的注入时机是在函数调用之后,页面加载完毕才注入。但实际上我们可以在调用地方下断点,在它运行的时候注入JS Hook,在函数被调用之前就进行修改,这也是可以的。
JS Hook看起来是很简单的,不过我们能够用它来实现很强大的功能,比如修改一些系统函数,如debugger
,Function
,eval
等,这些都是和反调试相关的。
我们日常拿到的许多数据都是JSON,所以也可以HookJSON.stringfy
进行一些操作,这样一来我们就可以在Hook后直接从堆栈中找到调用函数了。
读者应该已经发现,无论如何Hook,我们总是要把自己的代码注入到网页的环境里边,这个注入的时机选择很重要。我们当然可以选择下断点的方式注入,但是有一种更为优雅的方法,那就是编写Chrome拓展插件,插件可以在网页运行之前就对系统函数进行Hook,一些网页的反调试就可以直接步过了。