JS逆向基础

news/2024/10/17 21:27:22/

JS逆向基础

  • 一、什么是JS逆向?
  • 二、接口抓包
  • 三、逆向分析

一、什么是JS逆向?

我们在网站进行账号登录的时候对网页源进行抓包就会发现我们输入的密码在后台会显示为一串由字母或数字等符号,这就是经过加密呈现的一段加密文字,而分析这些接口的加密算法并实现模拟调用的过程就叫做「逆向」。
  逆向对于爬虫说是一个永远绕不开的话题,而我们所做的解密工作,通过解密步骤得到密码的过程,称为JS逆向。
  
  我们将通过一个简单的案例来讲解JS的分析思路。

二、接口抓包

在这里插入图片描述
首先我们先点击网站的的登陆页面,打开网站的控制台,点击1(网络),再点击2(fetch/XHR),然后再点击3(清空信息),我们在进行输入(4)账号密码和验证码,为了教学,故意输错密码,点击登录,控制台跳出6(登陆包),在其中可以获取Signature(7)
在这里插入图片描述
点击1,在点击2,即可出现搜索页面(3),我们将Signature输入,即可获取Signature在网页源代码中的生成函数
在这里插入图片描述
可知3即为需要逆向分析的数据

三、逆向分析

U.Signature = Object(f.a)(U, M, l.j ? l.g : l.c);

按照下图操作获取Object(f.a)函数和U,M,和 l.j ? l.g : l.c的值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将代码复制到js文件中,运行代码报错,提示找不到f函数,将代码中相关函数全部复制

在这里插入图片描述
源码

l = {key: cryptoJs.enc.Utf8.parse("fX@VyCQVvpdj8RCa"),iv: cryptoJs.enc.Utf8.parse(function (t) {for (var e = "", i = 0; i < t.length - 1; i += 2) {var n = parseInt(t[i] + "" + t[i + 1], 16);e += String.fromCharCode(n)}return e}("00000000000000000000000000000000"))
}, v = function (data) {return function (data) {return cryptoJs.AES.encrypt(data, l.key, {iv: l.iv,mode: cryptoJs.mode.CBC,padding: cryptoJs.pad.Pkcs7}).toString()}(data)
}, d = function (data) {return cryptoJs.MD5(data).toString()
}, f = function (t) {var e = "";return Object.keys(t).sort().forEach((function (n) {e += n + ("object" === typeof (t[n]) ? JSON.stringify(t[n], (function (t, e) {return "number" == typeof e && (e = String(e)),e})).replace(/\//g, "\\/") : t[n])})),e
}h = function (t) {var data = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, e = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "a75846eb4ac490420ac63db46d2a03bf", n = e + f(data) + f(t) + e;return n = d(n),n = v(n)
}U = {"App-Ver": "","Os-Ver": "","Device-Ver": "","Imei": "","Access-Token": "","Timestemp": 1700571511,"NonceStr": "170057151176dni","App-Id": "4ac490420ac63db4","Device-Os": "web"
};let L = {"username": "qweqweqeqweqwe","password": "qweqweqweqweqwe","code": "65xv","hdn_refer": "https://www.epwk.com/"
};C = 'a75846eb4ac490420ac63db46d2a03bf'console.log(h(U, L, C))

又报错
在这里插入图片描述
导入crypto-js库替换o函数

const cryptoJs = require("crypto-js")
const cryptoJs = require("crypto-js")l = {key: cryptoJs.enc.Utf8.parse("fX@VyCQVvpdj8RCa"),iv: cryptoJs.enc.Utf8.parse(function (t) {for (var e = "", i = 0; i < t.length - 1; i += 2) {var n = parseInt(t[i] + "" + t[i + 1], 16);e += String.fromCharCode(n)}return e}("00000000000000000000000000000000"))
}, v = function (data) {return function (data) {return cryptoJs.AES.encrypt(data, l.key, {iv: l.iv,mode: cryptoJs.mode.CBC,padding: cryptoJs.pad.Pkcs7}).toString()}(data)
}, d = function (data) {return cryptoJs.MD5(data).toString()
}, f = function (t) {var e = "";return Object.keys(t).sort().forEach((function (n) {e += n + ("object" === typeof (t[n]) ? JSON.stringify(t[n], (function (t, e) {return "number" == typeof e && (e = String(e)),e})).replace(/\//g, "\\/") : t[n])})),e
}h = function (t) {var data = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, e = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : "a75846eb4ac490420ac63db46d2a03bf", n = e + f(data) + f(t) + e;return n = d(n),n = v(n)
}U = {"App-Ver": "","Os-Ver": "","Device-Ver": "","Imei": "","Access-Token": "","Timestemp": 1700571511,"NonceStr": "170057151176dni","App-Id": "4ac490420ac63db4","Device-Os": "web"
};let L = {"username": "qweqweqeqweqwe","password": "qweqweqweqweqwe","code": "65xv","hdn_refer": "https://www.epwk.com/"
};C = 'a75846eb4ac490420ac63db46d2a03bf'console.log(h(U, L, C))

在这里插入图片描述
运行又报错,替换r.a函数,
在这里插入图片描述

"object" === typeof (t[n]) 

在这里插入图片描述
最后代码运行出Signature

最后将js代码转成python,再与爬虫相结合最后写出代码

import requestscookies = {'Hm_lvt_387b8f4fdb89d4ea233922bdc6466394': '1698224816,1699438386,1700570522','PHPSESSID': 'ca8646d868cd69a35397b2a42dba42d0e7a8f02b','time_diff': '0','XDEBUG_SESSION': 'XDEBUG_ECLIPSE','adbanner_city': '%E5%8C%97%E4%BA%AC%E5%B8%82','banners_show_cookie_ip': '221.216.142.177','login_referer': 'https%3A%2F%2Fwww.epwk.com%2F','Hm_lpvt_387b8f4fdb89d4ea233922bdc6466394': '1700570526','login_fail_need_graphics': '0',
}headers = {'Accept': 'application/json, text/plain, */*','Accept-Language': 'zh-CN,zh;q=0.9','Access-Token': '','App-Id': '4ac490420ac63db4','App-Ver': '','CHOST': 'www.epwk.com','Cache-Control': 'no-cache','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded',# 'Cookie': 'Hm_lvt_387b8f4fdb89d4ea233922bdc6466394=1698224816,1699438386,1700570522; PHPSESSID=ca8646d868cd69a35397b2a42dba42d0e7a8f02b; time_diff=0; XDEBUG_SESSION=XDEBUG_ECLIPSE; adbanner_city=%E5%8C%97%E4%BA%AC%E5%B8%82; banners_show_cookie_ip=221.216.142.177; login_referer=https%3A%2F%2Fwww.epwk.com%2F; Hm_lpvt_387b8f4fdb89d4ea233922bdc6466394=1700570526; login_fail_need_graphics=0','Device-Os': 'web','Device-Ver': '','Imei': '','NonceStr': '1700570738pdcom','Origin': 'https://www.epwk.com','Os-Ver': '','Pragma': 'no-cache','Referer': 'https://www.epwk.com/login.html','Sec-Fetch-Dest': 'empty','Sec-Fetch-Mode': 'cors','Sec-Fetch-Site': 'same-origin','Signature': 'Ks5z+mbEmnNOLXsZKuOq84sn8ATLQmZxN9RmH1Gi4yuPWQWo+GYbhylLq4jxFy3F','Timestemp': '1700570738','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36','sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"macOS"',
}data = {'username': 'qweqweqeqweqwe','password': 'qweqweqweqweqwe','code': 'aaaa','hdn_refer': 'https://www.epwk.com/',
}response = requests.post('https://www.epwk.com/api/epwk/v1/user/login', cookies=cookies, headers=headers, data=data)
print(response.text)

http://www.ppmy.cn/news/1279145.html

相关文章

TCP的poll多路复用实现群聊

服务器 #include <myhead.h> #define SERIP "192.168.125.99" #define SERPORT 9999 int main(int argc, const char *argv[]) {int sfd-1;if((sfdsocket(AF_INET,SOCK_STREAM,0))-1){perror("socket error");return -1;}printf("sfd%d\n"…

内部FLASH模拟EPPROM

本例程基于STM32F103ZET6 FLASH大小为512K。 介绍FLASH 不同型号的 STM32&#xff0c;其 FLASH 容量也有所不同&#xff0c;最小的只有 16K 字节&#xff0c;最大的则达到了 1024K 字节。我们的精英 STM32 开发板选择的是 STM32F103ZET6 的 FLASH 容量为 512K 字节&#xff0…

计算机网络 网络安全技术

网络安全基本要素 机密性 不泄密完整性 信息不会被破坏可用性 授权用户 正常有效使用可控性 被控制可审查性 网络安全的结构层次 物理安全 物理介质安全控制 计算机操作系统安全服务 应用层次 被动攻击 :截获信息 主动攻击 : 中断信息,篡改,伪造 篡改 …

conda环境下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

2023年12月GESP Python五级编程题真题解析

【五级编程题1】 【试题名称】&#xff1a;小杨的幸运数 【问题描述】 小杨认为&#xff0c;所有大于等于a的完全平方数都是他的超级幸运数。 小杨还认为&#xff0c;所有超级幸运数的倍数都是他的幸运数。自然地&#xff0c;小杨的所有超级幸运数也都是幸运数。 对于一个…

Jenkins 构建触发器指南

目录 触发远程构建 (例如&#xff0c;使用脚本) 描述 配置步骤 安全令牌 在其他项目构建完成后触发构建 描述 配置步骤 定时触发构建 描述 配置步骤 GitHub钩子触发GITScm轮询 描述 配置步骤 Poll SCM - 轮询版本控制系统 描述 触发远程构建 (例如&#xff0c;使…

数据分析基础之《numpy(5)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

电机控制 相关基础概念

基本概念: 定子或者转子上有铁心或者绕铜线的地方,绕铜线的地方叫槽,而将槽分开的叫齿,将所有的齿连起来的部位较轭部。 磁感应强度与磁场强度之间的关系可以通过以下公式表示: B=μH 其中,B 是磁感应强度,H 是磁场强度,μ 是磁导率。这个关系表明,在给定磁场强度下…