转自

基于原型的hook实现:

[bool]hook:params{realFunc[String|must]:用于保存原始函数的函数名称,用于unHook;hookFunc[Function|must]:替换的hook函数;context[Object|opt]:目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1methodName[String|opt]:匿名函数需显式传入目标函数名eg:this.Begin = function(){....};
}
[bool]unhook:params{realFunc[String|must]:用于保存原始函数的函数名称,用于unHook;funcName[String|must]:被Hook的函数名称context[Object|opt]:目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
}

相对于原博文,将需要hook的方法“改名备份”时加了前缀,支持在一个页面上多个function的hook,而不会错乱。

<!DOCTYPE html>
<html><head><title></title><script type="text/javascript">function Hooks() {return {initEnv: function () {Function.prototype.hook = function (realFunc, hookFunc, context) {var _context = null; //函数上下文var _funcName = null; //函数名_context = context || window;_funcName = getFuncName(this);_context['realFunc_' + _funcName] = this;console.log(window);if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {console.log("Already has been hooked,unhook first");return false;}function getFuncName(fn) {// 获取函数名var strFunc = fn.toString();var _regex = /function\s+(\w+)\s*\(/;var patten = strFunc.match(_regex);if (patten) {return patten[1];};return '';}try {eval('_context[_funcName] = function ' + _funcName + '(){\n' +'var args = Array.prototype.slice.call(arguments,0);\n' +'var obj = this;\n' +'hookFunc.apply(obj,args);\n' +"return _context['realFunc_" + _funcName + "'].apply(obj,args);\n" +'};');_context[_funcName].prototype.isHooked = true;return true;} catch (e) {console.log("Hook failed,check the params.");return false;}}Function.prototype.unhook = function (realFunc, funcName, context) {var _context = null;var _funcName = null;_context = context || window;_funcName = funcName;if (!_context[_funcName].prototype.isHooked) {console.log("No function is hooked on");return false;}_context[_funcName] = _context['realFunc' + _funcName];delete _context['realFunc_' + _funcName];return true;}},cleanEnv: function () {if (Function.prototype.hasOwnProperty("hook")) {delete Function.prototype.hook;}if (Function.prototype.hasOwnProperty("unhook")) {delete Function.prototype.unhook;}return true;}};}var hook = Hooks();hook.initEnv();// 这个是要执行的正常的函数function test() {alert(arguments[0]);}// 这个是钩子函数。此钩子函数内心戏:// 我只喜欢test函数,所以我必须出现在她前面(在她前面执行),这样她才能看到我。function hookFunc() {alert('hookFunc');}// hookFunc钩住testtest.hook(test, hookFunc, window);window.onload = function () {// 由于钩子函数hookFunc钩住了test函数,所以test执行时,会先执行hookFunc。test("haha");}</script>
</head><body>
</body></html>

转一个比较牛的JS Hook实现,基于Function prototype,能够勾住和释放任何函数相关推荐

  1. 一个比较牛的Js写的五子棋

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  2. JS 一张图理解prototype、proto和constructor的关系

    转载于原文地址:https://www.cnblogs.com/xiaohuochai/p/5721552.html(感谢大神的总结) 前面的话 javascript里的关系又多又乱.作用域链是一种单 ...

  3. 嘟嘟牛app算法hook

    嘟嘟牛app算法hook adb install 安装完后,打开登录界面 手机挂好sock代理,抓到加密后的包: 搜索一下关键字Encrypt,重点看下 com.dodonew下的: 最后都hook一 ...

  4. 关于爬虫本地JS Hook的研究

    0x00 背景介绍 最早的爬虫,只需要能够从服务端获取到HTML代码,进行分析即可,随着Web2.0的普及,越来越多的网站都必须JavaScript解析之后才能正常显示.因此这也对爬虫提出了新的要求, ...

  5. 一个超牛的东东:专门删除牛皮文件和文件夹

    一个超牛的东东:专门删除牛皮文件和文件夹 电脑中有一些不知为何删除不掉的文件和文件夹,无论用什么超级粉碎机都无法清除. 在网上看到的一个方法可以帮忙 注意:使用时请小心, 建立非常简单: 新建文本文档 ...

  6. 如何成为一个技术“牛人”

    今天给浙江大学过来的几个还没有毕业的研究生做面试,这些研究生是想来公司实习的.在面试的过程中,一个学生问我"我们有C/C++.JAVA等等多种语言,我如何才能成为某一方面的一个技术牛人呢?这 ...

  7. javascript基础修炼——手把手教你造一个简易的require.js

    require.js造轮子 示例代码托管在我的代码仓:http://www.github.com/dashnowords/blogs 一. 概述 许多前端工程师沉浸在使用脚手架工具的快感中,认为req ...

  8. 如何做一个真正牛X 的开源项目

    2019独角兽企业重金招聘Python工程师标准>>> 近年来,越来越多的开发者选择将自己的产品以开源形式发布,有时的结果是--你满怀诚意地开源,却无人问津.尽管你的产品做得相当好, ...

  9. Phun:一个巨牛B的物理引擎

    一个很牛B的沙盒程序,可以模拟各种物理现象.适合用于物理教学. 很喜欢那个把东西变成水的效果:) YouTube链接:http://www.youtube.com/watch?v=0H5g9VS0EN ...

最新文章

  1. 高内聚、低耦合的含义是什么?
  2. Codeforces 611D New Year and Ancient Prophecy DP
  3. (0088)iOS开发之单例的写法以及重新认识
  4. python3 subprocess.check_output 执行shell命令 返回结果
  5. Boost:boost::asio模块的prioritised handlers优先处理程序
  6. 命令提示符下对用户的操作
  7. STM32F103系列实战之通用同步异步收发器(USART)
  8. 又搞事!雷军郑重宣告:小米9才是骁龙855全球真首发
  9. vue大屏可视化布局
  10. Multisim 版本针对3D元件库说明
  11. 避坑宝典|win11升级最新预览体验版bug梳理
  12. 新手入门|计算机科普
  13. NameNode中Fslmage镜像和Edits编辑日志详解
  14. android 开屏广告动画,Android 开屏广告
  15. 五问补盲(三) | 补盲激光雷达,敢不敢直面新的安全威胁?
  16. pytorch官方文档(中文版)
  17. JAVA面向对象(OOP)-class 类
  18. Web必备性能压力测试工具WebBench与ApcheBench(ab)详解
  19. 截取中国天气网天气信息(转)
  20. Python编写手机App————kivy

热门文章

  1. ElasticSearch 安装及使用
  2. ABAP基础知识 类的例外处理
  3. Excel如何快速制作表格目录
  4. 暨 广告、推荐、搜索 三大顶级复杂业务之 “广告业务系统详叙”
  5. Java分布式二手房项目尚好房第三课 利用Dubbo拆分微服务
  6. Xilinx FPGA 架构简介
  7. IT6263,IT6264是一颗LVDS TO HDMI的桥接芯片
  8. SRAM6264和EPROM2764相互兼容
  9. lucky-card实现刮刮卡效果
  10. 年薪20万Python工程师进阶(7):Python资源大全,让你相见恨晚的Python库