个人总结 - JS逆向解析
目前加密的方式总结有下面几点:
对称加密(加密解密密钥相同):DES、DES3、AES
非对称加密(分公钥私钥):RSA
信息摘要算法/签名算法:MD5、HMAC、SHA
前端实际使用中MD5、AES、RSA,自定义加密函数使用频率是最高的
几种加密方式配合次序:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,用签名算法生成非对称加密的摘要
DES、DES3、AES、RSA、MD5、SHA、HMAC传入的消息或者密钥都是bytes数据类型,不是bytes数据类型的需要先转换;密钥一般是8的倍数
Python实现RSA中,在rsa库中带有生成签名和校对签名的方法
安全性:DES<DES3=AES<RSA,至于MD5、SHA、HMAC不好说了
搜其他关键词如RSA、encrypt,尤其是encrypt
其中this.exponent是RSA加密偏移量 ,数值一般在HTML文件里面,全局搜索,其value值就是
密钥的值一般在网页源码的一个元素值。全局搜索,其value值就是,或者是js中找到
AES:案例ewt360.com
AES是典型的对称加密,密钥就在前端源码里,相对于非对称的RSA安全性很低
var com_str = {_KEY: "20171109124536982017110912453698",//32位_IV: "2017110912453698",//16位*str:需要加密的字符串Encrypt: function (str) {var key = CryptoJS.enc.Utf8.parse(this._KEY);var iv = CryptoJS.enc.Utf8.parse(this._IV);var encrypted = '';var srcs = CryptoJS.enc.Utf8.parse(str);encrypted = CryptoJS.AES.encrypt(srcs, key, {iv: iv,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});return encrypted.ciphertext.toString();},}
此处还调用了CryptoJS,它是加密的核心类,但发现没有,其实是藏在另外一个js文件中,找到并复制出来,将两个js合并即可
自定义加密:空中网
这个网站是以get方式登陆的,由一个eval加密的js
function encrypt ()
this.encrypt(pwd, this.j_data["dc"])加密原理:在打开网站的时候服务器会返回一串字符串,用于加密,加密的js是通过eval方式处理的
js混淆:就是把其中的变量、方法位置顺序打乱,但是又用一些无关的变量或者方法来保证执行顺序
解决方法:复制完整的混淆代码去js混淆还原网站还原。
注意:很多时候,js代码的生成函数都进行了伪装,核心的东西只有一句,但有一堆混淆视听的js,只需要找到核心代码,进行解析就行
eval加密:
eval()方法:js中的eval()方法就是一个js语言的执行器,它能把其中的参数按照JavaScript语法进行解析并执行,简单来说就是把原本的js代码变成了eval的参数,变成参数后代码就成了字符串,其中的一些字符就会被按照特定格式“编码” 。
例如下:
eval(function(p,a,c,k,e,d){e=function(c)
{return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?
String.fromCharCode(c+29):c.toString(36))};
if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return
d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new
RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('5 4="粘贴要加密/解密的3代码到这里";2(0==0){
1(4);}',62,6,'1|alert|if|javascript|showmsg|var'.split('|'),0,{}))
解决方法:将代码字符串放入javascript Eval官网解密
再看eval解密后的js文件尾部,有下面一个函数
function encryptString(str, e, m) {var key = RSAUtils.getKeyPair(e, '', m);return RSAUtils.encryptedString(key, str)
}
发现是RSA加密方式,那现在从RSA加密逆向搜索encryptString关键词 ,找到下面
var timesign = (new Date).getTime() + timespan;$("#p1User").val(encryptString(timesign + encodeURIComponent($("#passwordUser").val()), $("#rsaExponent").val(), $("#rsaModulus").val()));$("#password_value").val($("#passwordUser").val());$("#btnSubmitUser").val("登录中...");$("#usernameUser").addClass("fontcolor_cccUser").attr("readonly", "readonly");$("#passwordUser").val("").addClass("fontcolor_cccUser").attr("readonly", "readonly");
筛选核心代码
encryptString(timesign + encodeURIComponent($("#passwordUser").val()),$("#rsaExponent").val(), $("#rsaModulus").val());
("#passwordUser").val(),rsaExponent").val(), $("#rsaModulus").val()
这三个参数分别是从页面获取id,去html搜索这三个关键词
rsaExponent 看到value为01001,故此RSA加密偏移量为01001
rsaModulus 也是看到value为一群乱码,它是RSA密钥
用户认证的话会涉及到cookie
解决方法:查看cookie数据,找到经过例如:fingerprint进行URL解码,对比请求参数fingerprint修改
那么,逆向解密解决思路呢?
逆向解密解决思路:
(1)是根据加密参数,如“x-uab”关键字在所有关键中查找
打开chrome浏览器 按F12
找到点击source中 按ctrl + shift + F快捷键 ,输入x-uab找到js代码
接下来,打个断点调试一下:在数字那里点一下,数字位置出现蓝点,表示添加断点成功
然后刷新获取店铺列表的页面,程序会在断点处停下,在控制台调试o.getUA()函数,看一下输出
继续向下查看这个关键词参数 js 生成函数的引用,一步步往回推,找到最原始的 js 生成方法
找到以后,把这个function 方法全部代码取出来,另存为一个js文件。
(2)怎么用python执行js脚本?
方法一:
自己搞懂生成的过程,是md5还是AES加密,找到key值,时间戳其余参数啥的也可以生成,做过后台开发的会比较清楚其生成原理,因为需要对接前后端接口
方法二:execjs
因为在上面复制出来的脚本中,只单单定义了一个方法,并没有调用这个方法,所以,要在js文件的末尾添加一些代码来调用
function getParam() {var a;var param = e(2,a);return param
};
然后,开始撸Python代码吧
原理:将execjs的引擎换成PhantomJS这个无头浏览器,换句话说就是用PhantomJS来执行js脚本,PhantomJS是一个浏览器,自然就会创建window对象。
import execjsimport os
os.environ["EXECJS_RUNTIME"] = "PhantomJS"
node = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)
不用PhantomJS方法
import execjsnode = execjs.get()
file = 'eleme.js'
ctx = node.compile(open(file).read())
js_encode = 'getParam()'
params = ctx.eval(js_encode)
print(params)可能会报错:execjs._exceptions.ProgramError: TypeError: 'window' 未定义
原因:window对象估计是浏览器打开是创建的,蕴含浏览器的信息,所以用Python来执行这段代码时,没有这个对象
方法三:
思路和方案二类似,不过更加粗暴一些。因为没在浏览器执行,那就模拟浏览器来执行。
在执行之前,同样要修改js脚本,在js文件末尾调用e方法,添加如下代码,例:
var a;
var param = e(2,a);
return param;
注意:调用方法不要放在任何函数里面,我之前就是因为将这段代码放在函数里头强制执行,导致的结果就是在浏览器里可以获取加密字符串,但是在Python中获取到的却是None
模拟浏览器用的selenium和chrome的webDriver,代码如下:
from selenium import webdriverbrowser = webdriver.Chrome(executable_path='chromedriver.exe')
with open('eleme.js', 'r') as f:js = f.read()
print(browser.execute_script(js))
最终获得加密之后的字符串
最后,有必要说一下,如果需要获取大量的x-uab,采用方案三效率会高一下,因为采用方案二的话,可以自打开一个浏览器(都调用一个webdriver对象),然后快速执行js,返回加密字符串。
文章有点乱,是之前自己做过的一些笔记,主要用来记录自己的一些理解
个人总结 - JS逆向解析相关推荐
- JS逆向解析---某知名小说网站内容加密
该小说网站的全部内容都是经过一个JS的加密,要想爬取这个网站那么将其内容解析是不可避免的,本文将讲解如何对其进行JS的逆向解析.网站:shuqi 随便点开一本书,打开浏览器自带的抓包工具: 点击第一个 ...
- Python爬虫入门之淘宝JS逆向解析请求参数Sign加密(一)
关于JS逆向,相信这是很多小伙伴学习爬虫的一个门槛之一,如果你是初学者入门,开发一款爬虫,要以思路为主,代码是其次的 这里所说的思路指两个方面,一,分析观察目标站点思路,二,代码开发思路,二者缺一不可 ...
- 淘宝直播h5页面js逆向解析
最近公司需要爬取直播商品的一些数据,其中就有淘宝直播. 分析淘宝直播app 很显然,直接搞难度很大,想到找h5页面,半天没找见:然后搞淘宝直播app,先抓包,请求尝试: import requests ...
- js逆向解析技巧--selenium
由于工作后期偏向架构方向,很久没做单独的爬取操作,居然有点忘记js的逆向过程了,研究了一晚上终于有了点头绪,记录下来免得以后忘记. 下面内容以对美团店铺抓取时需要破解的_token加密为准. 1. c ...
- JS逆向之巨量创意signature签名
文章目录 目标网站 接口分析 定位_signature生成位置 补环境还原js 编码测试 往期逆向文章推荐: JS逆向之百度翻译 JS逆向解析之有道翻译 JS逆向之企名科技 JS逆向之人口流动态势 j ...
- JS逆向之巨量星图sign签名
文章目录 1. 目标网站 2. 初步抓包分析 3. 定位加密参数生成位置 4. 编码测试 往期逆向文章推荐: JS逆向之百度翻译 JS逆向解析之有道翻译 JS逆向之企名科技 JS逆向之人口流动态势 j ...
- Scrapy实战案例--抓取股票数据并存入SQL数据库(JS逆向)
目标网址:http://webapi.cninfo.com.cn/#/marketDataZhishu 之前在这篇文章里面对该网站的JS进行了一个逆向的解析:JS逆向解析案例 接下来我们来创建一个Sc ...
- Python爬虫从入门到精通:(43)JS逆向:完美世界RAS逆向_Python涛哥
完美世界有很多游戏,比较出名的就是诛仙.魔兽世界等.完美今天就来看下完美世界登陆的逆向分析! JS逆向解析 登陆的时候这里有个点击认证.没关系,完美先忽略它,直接点击.完美主要探讨密码的逆向方式. 抓 ...
- js逆向之有道词js加密解析
js逆向之有道词js加密解析 文章目录 js逆向之有道词js加密解析 需要用到的工具: 下面就介绍一下3种看js加密的代码方法: 第一种方法: 第二种: 第三种: 下面我们来了解我们要用什么解密md5 ...
- JS逆向之美团网模拟登录h5Fingerprint、password(RSA)加密参数解析
文章目录 前言 一.页面分析 二.加密解析 1.password解析 加密定位 参数解密 2.h5Fingerprint解析 加密定位 参数解密 3.python调用模拟请求 总结 前言 最近和几位大 ...
最新文章
- unity 半透明混合问题_Unity Shader 透明度混合的双面渲染(十八)
- 三种流行防火墙配置方案分析与对比
- Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
- c# MEF框架(一 MEF简介及简单的Demo)
- 英语口语练习软件测试简历,软件测试员英语简历范文
- Initialization failed for Block pool
- Entity Framework 数据并发访问错误原因分析与系统架构优化
- C++ 接口继承与实现继承的区别和选择
- Scala:集合类型Collection和迭代器
- 用计算机弹清明上河图谱,[TIF超清] 《清明上河图》北宋 张择端 单幅画1.85GB全卷扫描...
- 鸡兔同笼c语言代码while,鸡兔同笼(C语言代码)
- 【qq机器人】机器人发美女图片
- hive优化:大表关联数据倾斜问题
- Go将中文转换为拼音
- python 简单的颜色序列生成器
- 科普 | 你需要了解的物联网卡基础知识
- springboot运行自动关闭Completed shut down of DiscoveryClient的解决方法
- .NET自助建站系统开发框架源码 PC端+WAP端+微信端
- 各品类市场占有率——通过互联网大数据了解各品类的市场占有率
- 把win7电脑变成无线路由器
热门文章
- 设置selected选中的多种方法(总结)
- 关于菜鸟的圆通电子面单打印
- Cannot determine path to ‘tools.jar‘ library for 1.8 (C:/Program Files/Java/jdk-18)
- 前端知识总结之浏览器知识
- 《机器学习实战》笔记-介绍
- 大屏布局css,前端大屏项目的屏幕适配方案
- Java8 Instant 时间戳
- VHDL串口通信 在FPGA开发板上测试 并解决没有识别到下载接口USB_Blaster(No Hardware问题)
- VS-code输入感叹号没有提示
- [ProblemSolving]教育网下载速度慢,如何解决?