目录

  • 一、油猴下载与安装
  • 二、油猴脚本免费使用网站
  • 三、油猴脚本编写介绍
    • 1、添加新脚本
    • 2、油猴脚本注释内容解释
    • 3、编写油猴脚本的基本步骤
    • 4、油猴脚本调试测试
  • 四、hook之js逆向案例
    • 1、hook之window属性案例
    • 2、hook之cookie生成案例
  • 五、hook的脚本合集
    • 1、hook之cookie
    • 2、hook之window属性
    • 3、hook之eval
    • 4、hook之setInterval
    • 5、hook之console
    • 5、hook函数中debugger
    • 6、hook之split
    • 7、hook之Header
    • 8、hook之URL
    • 9、hook之JSON.stringify
    • 10、hook之JSON.parse
    • 11、hook之覆盖原函数总结

一、油猴下载与安装

  • 油猴:Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器, 可以通过不同的“脚本”实现数十甚至上百个功能,比如视频去水印,去广告,js逆向定位加密参数生成位置等
  • 下载与安装:下载.crx插件 ,安装:谷歌>右上角>更多工具>扩展程序,直接将crx文件拖入如下图页面

二、油猴脚本免费使用网站

  • Userscript.Zone Search:是一个新网站,允许通过输入合适的URL或域来搜索用户脚本
  • Greasy Fork:最受欢迎的后起之秀,提供用户脚本的网站,可实现去掉视频播放广告,去水印等多种功能,可以直接安装使用,储存库中有大量的脚本资源
  • OpenUserJS:继 GreasyFork 之后开始创办,在其储存库中也拥有大量的脚本资源
  • serscripts Mirror

三、油猴脚本编写介绍

1、添加新脚本
  • 右上角打开油猴>添加新脚本>即为如下的编辑脚本页面

2、油猴脚本注释内容解释
  • @match这个注释的内容最为重要,它决定了你的脚本应用到哪个具体的网页,还是应用到所有的网页
  • @run-at确定了脚本的注入时机,在js逆向中也很重要
  • 油猴脚本所有注释介绍详情
属性名 作用
@name 油猴脚本的名字
@namespace 命名空间,用来区分相同名称的脚本,一般写成作者名字或者网址就可以了
@version 脚本版本,油猴脚本的更新会读取这个版本号
@description 描述,用来告诉用户这个脚本是干什么用的
@author 作者名字
@match 只有匹配的网址才会执行对应的脚本,例如*、http://*、http://www.baidu.com/*
@grant 指定脚本运行所需权限,如果脚本拥有相应的权限,就可以调用油猴扩展提供的API与浏览器进行交互。如果设置为none的话,则不使用沙箱环境,脚本会直接运行在网页的环境中,这时候无法使用大部分油猴扩展的API。如果不指定的话,油猴会默认添加几个最常用的API
@require 如果脚本依赖其他js库的话,可以使用require指令,在运行脚本之前先加载其他库,常见用法是加载jquery,导库,和node差不多,相当于导入外部的脚本
@run-at 脚本注入时机,这个比较重要,有时候是能不能hook到的关键,document-start:网页开始时;document-body:body出现时;document-end:载入时或者之后执行;document-idle:载入完成后执行,默认选项
@connect 当用户使用GM_xmlhttpRequest请求远程数据的时候,需要使用connect指定允许访问的域名,支持域名、子域名、IP地址以及*通配符
@updateURL 脚本更新网址,当油猴扩展检查更新的时候,会尝试从这个网址下载脚本,然后比对版本号确认是否更新
3、编写油猴脚本的基本步骤
  • 编写到// Your code here那里即可
4、油猴脚本调试测试
  • 利用浏览器的调试功能,在脚本需要调试的地方添加debugger;语句,在相应网页刷新后,即可利用F12开发者工具进行单步调试、监视变量等操作了

四、hook之js逆向案例

  • 可用于:定位window属性加密参数,定位cookie生成位置、修改原函数等
  • 借助油猴的hook:你可以将hook的脚本放到油猴里面执行
  • 直接用谷歌控制台console界面进行hook:hook时机最好选择你看见的第一个js文件的第一行的时候下断点,然后在控制台console界面就注入
  • hook案例推荐
  • 更多的hook理解
  • 更多的hook了解
1、hook之window属性案例
  • (1)目标网站,目标定位加密参数pre:
  • (2)全局搜索’pre’参数,发现pre的值就是window._pt_的值,但是直接调试需要耗一些时间才能定位到加密位置,通过油猴hook可以轻松定位到加密位置
  • (3)首先,添加油猴脚本如下,保存该脚本并启用,然后切换到目标网页:
    • 注意hook的域名为@match https://flight.qunar.com/*
    • hook的注入时机为文档开始时@run-at document-start
    • Object.defineProperty():替换一个对象的属性,并返回此对象,属性里面可能存的是方法,也可能存的就是一个值(getter,setter)
    • 而该脚本的hook点就是_pt_属性的get/set方法,在set处即_pt_属性被赋值时,debugger住
      // ==UserScript==
      // @name         定位pre加密参数
      // @namespace    http://tampermonkey.net/
      // @version      0.1
      // @description  try to take over the world!
      // @author       Shirmay1
      // @run-at       document-start
      // @match        https://flight.qunar.com/*
      // @grant        none
      // ==/UserScript==(function() {'use strict';var pre = "";Object.defineProperty(window, '_pt_', {get: function() {console.log('Getting window.属性');return pre},set: function(val) {console.log('Setting window.属性', val);debugger ;pre = val;}})
      })();
      
  • (4)接着,F12打开谷歌开发者工具,然后点击目标网站搜索按钮,油猴脚本随之执行,即可轻松定位到该加密参数位置,如下图
  • (5)最后,通过点击右侧调用栈回溯前一个函数,即可精准定位到window._pt_的值也就是pre的值
2、hook之cookie生成案例
  • (1)目标网站,定位 _bfa这个cookie参数生成位置
  • (2)油猴脚本如下:test()检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false,该脚本匹配_bfa的相关字符串
    // ==UserScript==
    // @name         定位携程cookie
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       Shirmay1
    // @match        https://hotels.ctrip.com/*
    // @run-at       document-start
    // @grant        none
    // ==/UserScript==(function() {'use strict';var _cookie = document.cookie;; // hook cookieObject.defineProperty(document, 'cookie', {set: function(val) {console.log('cookie set->', val);var pi = new RegExp('^_bfa.*');if (pi.test(val)) {debugger;}_cookie = val;return val;},get: function() {console.log('cookie get->', _cookie);return _cookie;}});
    })();
    

五、hook的脚本合集

1、hook之cookie
  • ① 简单的console界面直接hook,可如下

    Object.defineProperty(document, 'cookie', {set: function(val) {debugger ;}})
    
  • ② 指定某个cookie简单的hook,如hook 这个cookie RM4hZBv0dDon443M
    Object.defineProperty(document, 'cookie', {set: function(val) {if (val.indexOf('RM4hZBv0dDon443M') != -1){debugger ;}}
    })
    
  • ③ 油猴脚本可如下设置: hook所有cookie,注意修改@match 所匹配的网址,否则可能hook不到
    // ==UserScript==
    // @name         定位cookie
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       Shirmay1
    // @match        http://entp.yjj.gxzf.gov.cn/appnet/appEntpList.action?entpType=004
    // @run-at       document-start
    // @grant        none
    // ==/UserScript==(function() {'use strict';var _cookie = ""; // hook cookieObject.defineProperty(document, 'cookie', {set: function(val) {console.log('cookie set->', new Date().getTime(), val);debugger;_cookie = val;return val;},get: function() {return _cookie;}});
    })()
    
2、hook之window属性
  • hook对象属性通用demo逻辑

  • ① 简单的console界面直接hook,window._$ss

    Object.defineProperty(window, '_$ss', {set: function(val) {debugger ;}
    })
    
  • ② 油猴脚本hook,window.pt

    // ==UserScript==
    // @name         定位pre加密参数
    // @namespace    http://tampermonkey.net/
    // @version      0.1
    // @description  try to take over the world!
    // @author       Shirmay1
    // @run-at       document-start
    // @match        https://flight.qunar.com/*
    // @grant        none
    // ==/UserScript==(function() {'use strict';var pre = "";Object.defineProperty(window, '_pt_', {get: function() {console.log('Getting window.属性');return pre},set: function(val) {console.log('Setting window.属性', val);debugger ;pre = val;}})
    })();
    
3、hook之eval
  • 当检测函数的toString方法和原型链上的toString方法

    var _eval = eval
    eval = function(arg) {debugger;return _eval(arg)
    }
    eval.toString = function() {return "function eval() { [native code] }"
    }
    eval.length = 1;
    var _old = Function.prototype.toString.call
    Function.prototype.toString.call = function(arg) {if (arg == eval)return "function eval() { [native code] }"return _old(arg);}
    
4、hook之setInterval
  • 置空定时器或者过掉定时器的debugger

    var _setInterval=setInterval;
    setInterval=function(a,b){if(a.toString().indexOf("debugger")!=-1{return }_setInterval(a,b);
    }
    
5、hook之console
  • 置空console一直打印的情况

    console._log=console.log
    console.log=function(a){if(a==="世上无难事,只要肯放弃"){return}console._log(a)
    }
    
5、hook函数中debugger
  • 修改传参为debugger的函数,假设A函数有参数debugger传入

    Function.prototype.constructor = function(param){if(param!="debugger"){return A(param)  }return function(){}
    }
    
6、hook之split
  • hook a.split

    String.prototype.split_bk = String.prototype.split;
    String.prototype.split = function(val){str =  this.toString();debugger;return str.split_bk(val)
    }
    a = 'dsdfasdf sdsasd'
    a.split(' ')
    
7、hook之Header
  • hook header中包含 Authorization 关键字

    (function () {var org = window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHttpRequest.prototype.setRequestHeader = function (key, value) {if (key == 'Authorization') {debugger;}return org.apply(this, arguments);};
    })();
    
8、hook之URL
  • hook url中包含login

    (function () {var open = window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open = function (method, url, async) {if (url.indexOf("login") != -1) {debugger;}return open.apply(this, arguments);};
    })();
9、hook之JSON.stringify
  • hook JSON.stringify字典转字符串

    (function() {var stringify = JSON.stringify;JSON.stringify = function(params) {console.log("Hook JSON.stringify ——> ", params);debugger;return stringify(params);}
    })();
    
10、hook之JSON.parse
  • hook JSON.parse字符串转字典

    (function() {var parse = JSON.parse;JSON.parse = function(params) {console.log("Hook JSON.parse ——> ", params);debugger;return parse(params);}
    })();
    
11、hook之覆盖原函数总结
  • 通用的函数hook覆盖demo逻辑
  • (1)小案例,直接修改原函数
    function _before(){console.log("我是原函数执行中")}
    var temp_before = _before;  // 原函数临时存储
    _before = function(){console.log("我是原函数但被修改了")}
    _before()  // 原函数被修改
    
  • (2)修改XMLHttpRequest.prototype.send,hook send
  • (3)hook 原型对象返回字符串修改
    Function.prototype.toString=function(){return "function test(x,y){z=x+y;return z;}";
    }
    

js逆向工具-油猴Tampermonkey脚本hook案例相关推荐

  1. Chrome油猴(Tampermonkey)脚本使用及常用脚本分享

    在我们使用浏览器的时候总是抱怨他的功能不够强大,缺少这个缺少那个,那么好,浏览器支持的一强大的功能-----扩展,也就是我们常说的插件,在这里我要介绍的是一款特别好用的插件,用来管理用户的脚本,也可以 ...

  2. 油猴脚本手机版|油猴tampermonkey手机版

    手机浏览器中的功能太少,想下载一些插件?那么推荐你先安装个油猴脚本手机版,也就是油猴tampermonkey手机版,这是备受大家喜欢的一款类似电脑浏览器中的油猴一样的手机插件脚本,相信在电脑中使用过该 ...

  3. 油猴Tampermonkey及其脚本的安装

    油猴及其脚本的安装(以优学院为例) 油猴的百度网盘如下链接:(也可以去网上找方法下载) 链接 提取码:rhhy 将下载好的文件解压,如下图所示: 在谷歌浏览器的右侧工具栏点击更多工具中的扩展程序 点进 ...

  4. 油猴Tampermonkey简介

    油猴(Tampermonkey)是一款浏览器扩展,它允许用户编写和运行自定义脚本来修改网页的行为和样式.油猴最初是为谷歌浏览器开发的,但现在也支持其他浏览器,例如火狐浏览器.Safari和微软边缘等. ...

  5. Tips【油猴Tampermonkey】脚本安装教程

    前言 我本人喜欢在百度网盘上存一些东西,但是网盘的下载限速真的恶心到惊人,于是搜索了知乎等处,发现油猴这个扩展程序,其中百度网盘下载助手是我最中意的,但是我的chrome浏览器不好用,不知道为什么哈, ...

  6. [网盘工具/百度网盘]秒传链接的使用 -2022版油猴网页脚本

    注:此项技术仅针对百度网盘有效 软件要求:Chrome或Firefox等支持tampermonkey.Violentmonkey的浏览器. 1.什么是秒传链接? 度盘秒传链接(标准提取码)由128位( ...

  7. 谷歌浏览器油猴tampermonkey插件安装教程(小白教程)

    什么是扩展程序 首先,你要知道油猴是什么的话,那你就必须知道谷歌浏览器的扩展程序是什么?点解浏览器右上角–>更多工具–> 扩展程序,进入我们的扩展程序界面,在这里可以看到我们已经安装的扩展 ...

  8. 【JS 逆向百例】Fiddler 插件 Hook 实战,某创帮登录逆向

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  9. chrome最强大的浏览器插件油猴Tampermonkey插件离线安装包免费分享下载

    油猴脚本管理器 Tampermonkey 离线CRX安装包同名文章地址:http://www.xmpojie.com/697.html 一个神奇的网站: http://www.xmpojie.com/ ...

  10. 哪些安卓手机和IPhone手机浏览器可以安装油猴Tampermonkey插件

    油猴官网:Greasy Fork - 安全.实用的用户脚本大全 Android手机浏览器: Firefox:Greasemonkey.Tampermonkey 或 Violentmonkey Maxt ...

最新文章

  1. CSS5:移动端页面(响应式)
  2. 请回答! 2018泛娱乐风口
  3. ubuntu连接有线局域网后无法使用无线网卡上网
  4. 6月Unity技术路演华东站报名启动!
  5. apache.camel_Apache Camel 3.2 – Camel的无反射配置
  6. Java 基础——数组解析
  7. ios(safar/微信)返回不执行js
  8. java sqlite 创建_关于Java:创建3个由sqlite数据库填充的微调器
  9. 信息学奥赛一本通 1189:Pell数列 | 1202:Pell数列 | OpenJudge NOI 2.3 1788:Pell数列 | 2.3 1788:Pell数列
  10. 杭电2066一个人的旅行
  11. 解压后缀.tar.gz的软件包
  12. 我只注视你全cg存档_科幻国漫持续推出,全CG动画星骸骑士首播,这一次吞噬星空输了...
  13. Swift 5 从Model, Struct或Class转Dictionary
  14. 145分计算机考研408复习复盘
  15. 贾俊平-第七章:参数估计
  16. 数据库基础知识之数据类型
  17. C++ isalpha、isalnum、islower、isupper用法
  18. tf.contrib.layers.embed_sequence()函数
  19. HC-SRF04超声波测距传感器+Proteus仿真(附源码与仿真电路)
  20. quark h5 学习

热门文章

  1. win10系统VirtualBox虚拟机安装
  2. 关闭安卓系统导航栏右下角自动旋转按钮
  3. 个人邮箱怎么在微信里登陆?
  4. 腾讯云开发者实验室是什么?如何学习其中的153个实验案例?
  5. 微信公众号原主体已注销 如何办理账号迁移及公证书?
  6. 定时器 + websocket
  7. 远程服务器 Linux 用cityscape训练DeepLabv3模型(Pytorch版)并用图像测试
  8. 3.对于python的一个非正式导言 编译之三
  9. Office 2007卸载
  10. 医学图像预处理之CT成像原理