JavaScript高级编程:函数Hook与反Hook
JavaScript编程 函数 高级 hook
2023-06-13 09:18:47 时间
JavaScript高级编程:函数Hook与反Hook
作者:专注于JS混淆加密的JShaman
API HOOK技术,在PC时代曾盛行,是高端的技术。在JavaScript编程中,也可以应用API Hook技术实现不寻常的效果。
例,eval hook:
<html>
<script>
//备份原window.eval函数
var _eval = window.eval;
//eval的hook函数
window.eval = function(src){
console.log("eval要执行的代码:",src);
return _eval(src);
}
eval("console.log('eval hook')");
</script>
</html>
运行效果
还有一种写法:Object.defineProperty(object, prop, descript);
此方法会在一个对象上定义一个新属性,或者修改一个对象的现有属性。
参数说明:
object:要添加或者修改属性的目标对象;
prop:要定义或修改属性的名称;
descript:属性描述符,常用get、set、value以获取、设置属性值或赋值。
上面的eval hook改成这种写法:
<html>
<script>
var _eval = window.eval;
Object.defineProperty(window, "eval", {
value:function(src){
console.log("eval要执行的代码:",src);
return _eval(src);
}
});
eval("console.log('eval hook')");
</script>
</html>
Hook有什么用途呢?
比如,可以用于实现cookie加密,代码如下:
<html>
<script>
(function() {
var document_cookie = document.cookie;
Object.defineProperty(document, "cookie", {
get: function() {
console.log("读取到cookie:", document_cookie);
var encode_value = document_cookie.split("").reverse().join("");
console.log("cookie值已解密", document_cookie, "变成", encode_value);
return encode_value;
},
set: function(value) {
console.log("写cookie,原始值:",value );
var encode_value = value.split("").reverse().join("");
console.log("cookie值已加密",value,"变成",encode_value);
document_cookie = value.split("").reverse().join("");
console.log("cookie已写入")
},
});
})();
document.cookie = "jshaman.com";
console.log("cookie加解密测试", document.cookie);
</script>
</html>
运行效果
那么,如何反Hook呢?
代码如下:
<html>
<script>
(function(){
console.log(eval.toString());
//备份原window.eval函数
var _eval = window.eval;
//eval的hook函数
window.eval = function(src){
console.log("eval要执行的代码:",src);
return _eval(src);
}
console.log(eval.toString());
if(eval.toString().indexOf("[native code]") != -1){
eval("console.log('eval hook');");
}else{
console.log("eval 被hook了,不执行正常代码")
}
})();
</script>
</html>
即:正常的eval函数,toString()后,会输出:
function eval() { [native code] }
但如果被Hook,Hook函数必然不是这样的,如本文示例,它会是:
function(src){ console.log("eval要执行的代码:",src); return _eval(src); }
那么当未检测到“[native code]”时,即表示被Hook了。
运行效果:
还有一种方法,代码如下:
<html>
<script>
(function(){
console.log(eval.toString());
//备份原window.eval函数
var _eval = window.eval;
//直接调用原始函数
_eval("console.log('eval hook');");
//eval的hook函数
window.eval = function(src){
console.log("eval要执行的代码:",src);
return _eval(src);
}
console.log(eval.toString());
})();
</script>
</html>
即:直接调用eval函数的备份函数,使hook函数无用武之地。
运行效果:
相关文章
- javascript 基础_JavaScript高级编程
- js面向对象编程_JavaScript高级编程
- 【说站】javascript函数式编程的介绍
- JavaScript 手写面试题(一)
- JavaScript事件流
- JavaScript函数式编程之函子
- 腾讯地图Javascript API GL
- Javascript与MATLAB联合编程应用实例【AppDesigner开发必备】
- Javascript客户端脚本的设计和应用
- javascript编程起步(第四课)
- javascript编程起步(第五课)
- JavaScript编程引入命名空间的方法
- [js]用JAVASCRIPT正则表达式限制文本字节数的代码
- javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印
- JavaScript函数式编程的原理
- JavaScript函数式编程实践(来自IBM)
- JavaScript编程开发中的五个实用小技巧
- javascript中substr,substring,slice.splice的区别说明
- Javascript面向对象(一)(共有方法,私有方法,特权方法)
- JavaScript高级程序设计阅读笔记(十六)javascript检测浏览器和操作系统-detect.js
- 正则表达式语法规则及在Javascript和C#中的使用方法
- 现代JavaScript开发编程风格Idiomatic.js指南中文版
- Javascript学习笔记之函数篇(五):构造函数
- javascript自定义函数参数传递为字符串格式