首页 > 编程语言 >JavaScript奇技淫巧:Hook与反Hook

JavaScript奇技淫巧:Hook与反Hook

时间:2023-04-22 14:33:56浏览次数:40  
标签:src console log JavaScript value Hook cookie eval 奇技淫巧

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>

运行效果


JavaScript奇技淫巧:Hook与反Hook_hook


还有一种写法: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>

运行效果


JavaScript奇技淫巧:Hook与反Hook_html_02


那么,如何反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了。

运行效果:


JavaScript奇技淫巧:Hook与反Hook_hook_03


还有一种方法,代码如下:

<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奇技淫巧:Hook与反Hook_js hook_04


标签:src,console,log,JavaScript,value,Hook,cookie,eval,奇技淫巧
From: https://blog.51cto.com/jsjiami/6215265

相关文章

  • JavaScript加密库
    JavaScript加密库有很多,以下是一些常见的加密库:CryptoJS:一个纯JavaScript编写的加密库,提供了各种加密算法和编码方式的实现,包括对称加密、哈希函数、消息认证码、数字签名等。sjcl:一个JavaScript编写的加密库,提供了对称加密、公钥加密、哈希函数等,支持多种加密算法和模式。for......
  • JavaScript学习笔记
    数组什么是数组?字面理解就是数字的组合其实不太准确,准确的来说数组是一个数据的集合也就是我们把一些数据放在一个盒子里面,按照顺序排好[1,2,3,'hello',true,false]这个东西就是一个数组,存储着一些数据的集合数据类型分类number/string/boolean/undefined/null/ob......
  • React+hook+ts+ant design封装一个具有编辑和新增功能的页面
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷微信公众号前端小歌谣需求分析在前端项目中最常......
  • xHook 源码解析
    xHook是爱奇艺开源的一个PLTHook框架项目地址:https://github.com/iqiyi/xHook该项目实现了PTL/GOTHookPTLhook的本质是修改内存中,PLT表对应的值,来实现跳转到自定义函数的.got和.plt它们的具体含义。TheGlobalOffsetTable(GOT)。简单来说就是在数据段的地址表......
  • JavaScript 测试及效验工具
    JavaScript是一款强大的广泛运用于现代Web站点及应用的脚本语言。作为一个技艺精湛的Web开发者,掌握JavaScript可以增强用户的使用体验,提供交互及富客户端等功能。尽管JavaScript的语法非常简单,但对于写程序而言仍然是困难重重,就是因为它的运行环境:基于Web浏览器。以下您可以看......
  • JavaScript学习
    JS中的注释学习一个语言,先学习一个语言的注释,因为注释是给我们自己看的,也是给开发人员看的写好一个注释,有利于我们以后阅读代码5-1单行注释一般就是用来描述下面一行代码的作用可以直接写两个/,也可以按ctrl+///我是一个单行注释//下面代码表示在浏览器里面出现一个弹出......
  • JavaScript学习笔记
    SassSASS官网世界上最成熟、最稳定、最强大的专业级CSS扩展语言!sass是一个css的预编译工具也就是能够更优雅的书写csssass写出来的东西浏览器不认识依旧是要转换成css在浏览器中运行变量定义一个变量,在后面的代码中使用使用$来定义变量//定义一个$c作为变量,值是红......
  • 学习JavaScript
    操作步骤开通语音识别服务在调用语音识别相关接口前,您需要进入 语音识别控制台,进行实名认证和人脸认证,认证完成后,阅读《用户协议》后勾选“我已阅读并同意《用户协议》”,然后单击【立即开通】,即可一键开通录音文件识别、实时语音识别、一句话识别、录音文件识别极速版、语......
  • JavaScript的节点操作
    目录节点概述节点层级添删等节点操作使用节点操作的示例节点概述一般来说,节点至少拥有nodeType,nodeName,nodeValue这三个基本属性1.元素节点的nodeType为12.属性节点的nodeType为23.文本节点的nodeType为3(包括换行,文字,空格)节点层级1.父节点:node.parentNode(1)paren......
  • day 07 7.1 前端基础之JavaScript基础【一】
    前端基础之JavaScript基础【一】【1】、JavaScript的历史1992年底,美国国家超级电脑应用中心(NCSA)开始开发一个独立的浏览器,叫做Mosaic。这是人类历史上第一个浏览器,从此网页可以在图形界面的窗口浏览。但是该浏览器还没有面向大众的普通用户。1994年10月,NCSA的一个主要......