JS逆向
插件工具v_jstools:https://github.com/cilame/v_jstools
对指定的一些操作进行监听
1) 一定要开启 是否挂钩总开关
2)是否启用一下几个加解密函数挂钩输出功能 --> 开启 ,, 我这里选择了json序列化操作和base64操作

总结在进行JS逆向中常用的手段
1)Object.defineProperty: 对于对象属性的监控
该方法是es5的方法(千万不要以为是es6的哦),作用是直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。(切记只能用在对象身上不能用在数组身上)
1、语法
Object.defineProperty(obj, prop, descriptor)
2、参数说明:
- obj:必需。目标对象
- prop:必需。需定义或修改的属性的名字
- descriptor:必需。目标属性所拥有的特性
3、属性使用案例
修改某个属性的值时,给这个属性添加一些特性。
let person = {};
Object.defineProperty(person, 'name', {
writable: true || false,
configurable: true || false,
enumerable: true || false,
value:'gjf'
});
属性详解:
- writable:是否可以被重写,true可以重写,false不能重写,默认为false。
- enumerable:是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。
- value:值可以使任意类型的值,默认为undefined
- configurable:是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。
4、存取器描述(get和set)
- 注意:当使用了getter或setter方法,不允许使用writable和value这两个属性
let person = {};
let n = 'gjf';
Object.defineProperty(person, 'name', {
configurable: true,
enumerable: true,
get() {
//当获取值的时候触发的函数
return n
},
set(val) {
//当设置值的时候触发的函数,设置的新值通过参数val拿到
n = val;
}
});
console.log(person.name) //gjf
person.name = 'newGjf'
console.log(person.name) //newGif
- DOM操作:通过修改DOM元素的属性和样式,来实现对网页的控制和修改。
- 事件监听:通过监听网页上的事件,来触发自定义的操作和行为。
- AJAX拦截:通过拦截网页上的AJAX请求,来实现对数据的控制和修改。
- 函数替换:通过替换网页上的函数,来实现对函数的控制和修改。
DOM操作
在JS逆向油猴脚本中,DOM操作是最常用的一种Hook方式。通过修改DOM元素的属性和样式,我们可以实现对网页的控制和修改。
在实际应用中,我们可以使用以下代码来修改DOM元素的属性和样式:
// 修改DOM元素的属性
document.getElementById('elementId').setAttribute('attrName', 'attrValue'); // 修改DOM元素的样式
document.getElementById('elementId').style.property = 'value';
这样,我们就可以通过修改DOM元素的属性和样式,来实现对网页的控制和修改。
事件监听
除了DOM操作之外,事件监听也是JS逆向油猴脚本中常用的一种Hook方式。通过监听网页上的事件,我们可以触发自定义的操作和行为。
在实际应用中,我们可以使用以下代码来监听网页上的事件:
// 监听按钮点击事件
document.getElementById('buttonId').addEventListener('click', function() {
// 自定义操作和行为
});
AJAX拦截
除了DOM操作和事件监听之外,AJAX拦截也是JS逆向油猴脚本中常用的一种Hook方式。通过拦截网页上的AJAX请求,我们可以实现对数据的控制和修改。
在实际应用中,我们可以使用以下代码来拦截网页上的AJAX请求:
// 拦截AJAX请求
XMLHttpRequest.prototype._send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function() {
// 自定义操作和行为
this._send.apply(this, arguments);
};
函数替换
最后,函数替换也是JS逆向油猴脚本中常用的一种Hook方式。通过替换网页上的函数,我们可以实现对函数的控制和修改。
在实际应用中,我们可以使用以下代码来替换网页上的函数:
// 替换原有函数
var originalFunction = window.functionName;
window.functionName = function() {
// 自定义操作和行为
originalFunction.apply(this, arguments);
};
这样,当网页上调用原有函数时,就会执行我们自定义的操作和行为。
Hook Cookie
Cookie Hook 用于定位 Cookie 中关键参数生成位置,以下代码演示了当 Cookie 中匹配到了 token 关键字, 则插入断点:
(function () {
'use strict';
var cookieTemp = '';
Object.defineProperty(document, 'cookie', {
set: function (val) {
if (val.indexOf('token') != -1) {
debugger;
}
console.log('Hook捕获到cookie token设置->', val);
cookieTemp = val;
return val;
},
get: function () {
return cookieTemp;
},
});
})();
(function () {
'use strict';
var org = document.cookie.__lookupSetter__('cookie');
document.__defineSetter__('cookie', function (cookie) {
if (cookie.indexOf('token') != -1) {
debugger;
}
org = cookie;
});
document.__defineGetter__('cookie', function () {
return org;
});
})();
Hook Header
Header Hook,顾名思义,是一种用于定位 Header 中关键参数生成位置的工具。它能够方便地进行调试和优化,让开发者能够更加轻松地定位问题。以下代码演示了当 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);
};
})();
Hook URL
URL Hook是一种用于定位请求URL中关键参数生成位置的工具。当请求的URL中包含关键字”login”时,以下代码可以演示如何使用URL Hook。
(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);
};
})();
Hook JSON.stringify
JSON.stringify()方法是将 JavaScript 数据转换成 JSON 字符串的常用方法。在某些网站的加密过程中,也可能会遇到它。,以下代码演示了遇到 JSON.stringify() 时,则插入断点:
(function() {
var stringify = JSON.stringify;
JSON.stringify = function(params) {
console.log("Hook JSON.stringify ——> ", params);
debugger;
return stringify(params);
}
})();
Hook JSON.parse
JSON.parse() 方法常用于将 JSON 字符串转换为 JavaScript 对象。在某些网站的加密过程中,也可能会遇到它。以下代码演示了遇到 JSON.parse() 时,则插入断点:
(function() {
var parse = JSON.parse;
JSON.parse = function(params) {
console.log("Hook JSON.parse ——> ", params);
debugger;
return parse(params);
}
})();
Hook eval
JavaScript 中的 eval() 函数常用于计算 JavaScript 字符串,并将其作为脚本代码来执行。如果参数是一个表达式,eval() 函数将执行表达式。如果参数是 JavaScript 语句,eval() 将执行 JavaScript 语句,经常被用来动态执行 JS。以下代码执行后,之后所有的 eval() 操作都会在控制台打印输出将要执行的 JS 源码:
(function() {
// 保存原始方法
window.__cr_eval = window.eval;
// 重写 eval
var myeval = function(src) {
console.log(src);
console.log("=============== eval end ===============");
debugger;
return window.__cr_eval(src);
}
// 屏蔽 JS 中对原生函数 native 属性的检测
var _myeval = myeval.bind(null);
_myeval.toString = window.__cr_eval.toString;
Object.defineProperty(window, 'eval', {
value: _myeval
});
})();
Hook Function
以下的代码执行后,所有的函数操作都会在控制台打印输出将要执行的 JavaScript 源码。这是一种常见的调试方法,可以帮助开发人员更好地了解代码的执行过程。示例代码如下:
(function() {
// 保存原始方法
window.__cr_fun = window.Function;
// 重写 function
var myfun = function() {
var args = Array.prototype.slice.call(arguments, 0, -1).join(","),
src = arguments[arguments.length - 1];
console.log(src);
console.log("=============== Function end ===============");
debugger;
return window.__cr_fun.apply(this, arguments);
}
// 屏蔽js中对原生函数native属性的检测
myfun.toString = function() {
return window.__cr_fun + ""
}
Object.defineProperty(window, 'Function', {
value: myfun
});
})();
JS逆向的更多相关文章
- 网络爬虫之记一次js逆向解密经历
1 引言 数月前写过某网站(请原谅我的掩耳盗铃)的爬虫,这两天需要重新采集一次,用的是scrapy-redis框架,本以为二次爬取可以轻松完成的,可没想到爬虫启动没几秒,出现了大堆的重试提示,心里顿时 ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
- 兄弟,你爬虫基础这么好,需要研究js逆向了,一起吧(有完整JS代码)
这几天的确有空了,看更新多快,专门研究了一下几个网站登录中密码加密方法,比起滑块验证码来说都相对简单,适合新手js逆向入门,大家可以自己试一下,试不出来了再参考我的js代码.篇幅有限,完整的js代码在 ...
- 兄弟,别再爬妹子图了整点JS逆向吧--陆金所密码加密破解
好久没有写爬虫文章了,今晚上得空看了一下陆金所登录密码加密,这个网站js加密代码不难,适合练手,篇幅有限,完整js代码我放在了这里从今天开始种树,不废话,直接开整. 前戏热身 打开陆金所网站,点击到登 ...
- 这个爬虫JS逆向加密任务,你还不来试试?逆向入门级,适合一定爬虫基础的人
友情提示:在博客园更新比较慢,有兴趣的关注知识图谱与大数据公众号吧.这次选择苏宁易购登录密码加密,如能调试出来代表你具备了一定的JS逆向能力,初学者建议跟着内容调试一波,尽量独自将JS代码抠出来,实在 ...
- 爬虫必看,每日JS逆向之爱奇艺密码加密,今天你练了吗?
友情提示:优先在公众号更新,在博客园更新较慢,有兴趣的关注一下知识图谱与大数据公众号,本次目标是抠出爱奇艺passwd加密JS代码,如果你看到了这一篇,说明你对JS逆向感兴趣,如果是初学者,那不妨再看 ...
- 通过JS逆向ProtoBuf 反反爬思路分享
前言 本文意在记录,在爬虫过程中,我首次遇到Protobuf时的一系列问题和解决问题的思路. 文章编写遵循当时工作的思路,优点:非常详细,缺点:文字冗长,描述不准确 protobuf用在前后端传输,在 ...
- JS逆向-抠代码的第二天【手把手学会抠代码】
今天的学习项目:沃支付:https://epay.10010.com/auth/login 清空浏览器缓存后,打开网页,输入手机号,密码222222,按照网站要求填入验证码(sorry,我没有账号密码 ...
- JS逆向-抠代码的第一天【手把手学会抠代码】
首先声明,本人经过无数次摸爬滚打及翻阅各类资料,理论知识极其丰富,但是抠代码怎么都抠不会. 无奈之下,只能承认:这个活,需要熟练度. 本文仅对部分参数进行解析,有需要调用,请自行根据现实情况调整. 第 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
随机推荐
- sql server 将数据库表里面的数据,转为insert语句,方便小批量转移数据
create proc [dbo].[proc_insert] (@tablename varchar(256)) as begin set nocount on declare @sqlstr va ...
- 【YashanDB知识库】汇聚库23.1环境发生coredump
[标题]汇聚库23.1环境发生coredump [问题分类]数据库错误 [关键词]YashanDB, 汇聚库, coredump [问题描述]在23.1.1.200版本数据库环境创建dblink.视图 ...
- Unity 中 Color 与 Color32 的区别
1. 存储方式 Color用四个浮点数(float)来表示RGBA,取值范围均是0到1 举例: var orange = new Color(1f, 0.5f, 0f, 1f); 而Color32使用 ...
- c程序设计语言 by K&R(二)指针与数组
指针与数组 1. c语言只有值传递,没有引用传递 可通过指针交换 #include <stdio.h> #include <stdlib.h> void swap(int* a ...
- SQL Server – 基本操作 Table 和 Column
前言 日常都是用 EF Core 来管理 Database, 偶尔也用 Management Studio, 就是很少手写 Command. 虽然网上一拉就有很多, 但是每次写单侧都要到处找还是挺烦的 ...
- HTML – Native Form 原生表单功能集
前言 以前写过 form 表单, 但很不齐全, 这篇想做一个大整理. 主要讲讲在网站中使用原生 Form 的功能, 不足和扩展. 前端是原生的 HTML/JS, 后端是 ASP.NET Core Ra ...
- SQL server temporal table 学习笔记
refer: https://blog.csdn.net/Hehuyi_In/article/details/89670462 https://docs.microsoft.com/en-us/sql ...
- LeetCode 730. Count Different Palindromic Subsequences (区间DP)
题意 给一个字符串S,求它所有子序列中不同非空回文串的数量.字符串由 'a' 'b' 'c' 'd' 四个字母组成. 由于题目要求的是不同回文串. abba 的回文串子序列为 a,b,aba,abba ...
- Perfetto分析进阶
一.Perfetto介绍 Perfetto是Android Q中引入的全新下一代平台级跟踪工具,为Android.Linux和Chrome平台提供了一种通用的性能检测和跟踪分析工具集.其核心是引入了一 ...
- torch和numpy的相互转换
import torch x = torch.rand(2,2) x1 = x.numpy() # torch转换到numpy x2 = torch.from_numpy(x1) #numpy转换to ...