hook:就是替换原方法。
在汇编中类似的情况:
push 5个字节 <----替换---- jump 5个字节
就可以跳换到代码的某一个方法执行。
在App中:
XP框架—>反射手段替换。
js中(3种)
1、覆盖源函数
function xxx(){
console.log("111");
}
xxx = function(){
console.log("222");
}
但是这样就有个缺陷,不能调用原来的xxx()函数【打印“111”的那个】。
所以,我们就需要用一个变量把之前的方法存起来。
function xxx(){
console.log("111");
}
var xxxx_ = xxx;
xxx = function(){
console.log("222");
}
问题:可不可以覆盖浏览器环境的方法???
Preserve log 调试的时候不让他清空列表。
或者
说明是可以覆盖浏览器环境的方法的。
2、Object.defineProperty() 替换一个对象的属性,属性里面可能是一个方法也可能是一个值(getter,setter)。
官方介绍:Object.defineProperty() 方法会直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回此对象。
|
| 重点
| hook框架。。。
V
(function() {
//document 为要hook的对象 这里是hook的cookie
var cookieTemp = "";
Object.defineProperty(document, 'cookie', {
//hook set方法也就是赋值的方法
set: function(val) {
//这样就可以快速给下面这个代码行下断点
//从而快速定位设置cookie的代码
console.log('Hook捕获到cookie设置->', val);
cookieTemp = val;
return val;
},
//hook get方法也就是取值的方法
get: function()
{
return cookieTemp;
}
});
})();
点击VM,就会走进来了。
所以就快速走进来了。
快速定位到是怎么设置值的。然后我们就可以判断是怎么加密的。
3、new一个替换参数
//构造一个代理,第一个参数是原始对象,第二个参数是代理处理器。
dataStore = new Proxy(dataStore, handler);
二、hook是有时机的。本地的Cookies才需要hook。
1、在控制台注入的hook,刷新网页就失效了。
问:怎么让它不失效。
1)
找到第一个加载的js的资源文件,并在第一行打上断点。
但是后面我们会发现,这样做的话,可能是由于动态加载(也就是说JavaScript可能写在html里面)异步的原因,也是会错过很多的Cookies。
所以我们需要在控制台手动注入hook。(但在针对某些站hook的时机还是会晚一点的)。
2、利用FD的替换响应 ,然后注入hook(更好的方式)
这种时机比较靠前的。
拦截+加工+放过。
3、油猴插件(不推荐)