由于本网站较为特殊 目标网站加密与其他稍有不同

目标网站

68747470733a2f2f65632e6d696e6d6574616c732e636f6d2e636e2f6f70656e2f686f6d652f70757263686173652d696e666f2f3f746162496e6465783d31

需求

爬取所有的列表页 标题 时间 url 以及详情页内容

分析

在爬取列表页时 会发现 有两个请求,说明有两个请求是一起发送的。

第一个请求



可以发现这个请求 直接发起post 请求就可以拿到数据

第二个请求



可以发现请求体是一串代码 估计和第一个参数有关

寻找参数

这个网站是几个月前爬的,目前很多JS以及混淆了,所以本篇文章只记录自己的爬取,不提供代码了

这里提供网站混淆前的JS代码

  function hex2b64(d) {
let b;
let e;
let a = '';
const b64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
const b64pad = '='; for (b = 0; b + 3 <= d.length; b += 3) {
e = parseInt(d.substring(b, b + 3), 16);
a += b64map.charAt(e >> 6) + b64map.charAt(e & 63);
} if (b + 1 === d.length) {
e = parseInt(d.substring(b, b + 1), 16);
a += b64map.charAt(e << 2);
} else {
if (b + 2 === d.length) {
e = parseInt(d.substring(b, b + 2), 16);
a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4);
}
} while ((a.length & 3) > 0) {
a += b64pad;
} return a;
} //重新定义分段加密方法(加密参数过长)
JSEncrypt.prototype.encryptLong = function (string) {
const k = this.getKey(),
maxLength = ((k.n.bitLength() + 7) >> 3) - 11; try {
let lt = '',
ct = ''; if (string.length > maxLength) {
lt = string.match(/.{1,50}/g);
lt.forEach(entry => {
const t1 = k.encrypt(entry);
ct += t1;
});
return hex2b64(ct);
}
const t = k.encrypt(string),
y = hex2b64(t);
return y;
} catch (ex) {
return ex;
}
}; //导出加密方法
function getDataByEncrypted(requestData = {}) {
const rsaInstance = new JSEncrypt(); rsaInstance.setPublicKey("");
const newRequestData = {
...requestData,
sign: md5(JSON.stringify(requestData)),
timeStamp: +new Date(),
};
const encryptionData = JSEncrypt.prototype.encryptLong(JSON.stringify(newRequestData));
return encryptionData;
}

根据代码可知 这串代码是通过JS来进行的加密

公钥就是上文所指的第一个请求请求到的结果

私钥就是第二个请求反加密的值 也就是newRequestData

知道了公钥和私钥,我们可以自己通过代码解出来了。

注意

这里有个小坑 如果用Python 去改写

JSON.stringify (Javascript) 和 json.dumps (Python) 不等价

不同之处在于 json.dumps 默认应用一些小的 pretty-print ,但 JSON.stringify 没有。

要删除所有空格,例如 JSON.stringify,您需要 specify the separators .

json_text = json.dumps(source, separators=(',', ':'))

JS逆向实战10——某集团RSA长加密的更多相关文章

  1. JS逆向实战1——某省阳光采购服务平台

    分析 其实这个网站基本没有用到过什么逆向,就是简单的图片base64加密 然后把连接变成2进制存成文件 然后用ocr去识别即可 !! 注意 在获取图片连接 和对列表页发起请求时一定要用一个请求,也就是 ...

  2. JS逆向实战3——AESCBC 模式解密

    爬取某省公共资源交易中心 通过抓包数据可知 这个data是我们所需要的数据,但是已经通过加密隐藏起来了 分析 首先这是个json文件,我们可以用请求参数一个一个搜 但是由于我们已经知道了这是个json ...

  3. JS逆向实战9——cookies DES加密混淆

    cookie加密 DES 混淆 目标网站:aHR0cHM6Ly90bGNoZW1zaG9wLnlvdXpoaWNhaS5jb20vbWFpbi90ZW5kP05vdGljZUNhdGVJZD0xJk5 ...

  4. JS逆向实战8——某网实战(基于golang-colly)

    其实本章算不上逆向教程 只是介绍golang的colly框架而已 列表页分析 根据关键字搜索 通过抓包分析可知 下一页所请求的参数如下 上图标红的代表所需参数 所以其实我们真正需要的也就是Search ...

  5. JS逆向实战7-- 某省在线审批网站params 随机生成

    参数分析 我们首先通过抓包 发现这个就是我们所需要的数据 然后我们通过fidder 发起请求 结果: 通过我们反复测试 发现这个params的参数是每次请求中都会变化的 断点查找 我们通过 这个t参数 ...

  6. JS逆向实战6-- x轴 y轴 过点触验证码

    点触验证码是一种常见的反爬手段 解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间的对应关系. 这 ...

  7. JS逆向实战5--JWT TOKEN x_sign参数

    什么是JWT JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式).它是在Web环境下 ...

  8. JS逆向实战4--cookie——__jsl_clearance_s 生成

    分析 网站返回状态码521,从浏览器抓包来看,浏览器一共对此地址请求了三次(中间是设置cookie的过程): 第一次请求:网站返回的响应状态码为 521,响应返回的为经过 混淆的 JS 代码:但是这些 ...

  9. JS逆向实战2--cookie-AcwScV2加密—某招标信息网

    cookies的获取 首先拿到第一次访问原链接 拿到acw_tc的值,然后放到session中去 再用这个session再次访问原链接拿到js加载的加密的真实数据.用了一些反混淆. 最后获取这个数据中 ...

  10. GIF Movie Gear逆向实战+注册代码+补丁

    GIF Movie Gear逆向实战+注册代码+补丁 准备 我是在windows 8.1 x64上进行的操作.有不足之处,还望大虾指出. 获取资源 网站下载:http://www.gamani.com ...

随机推荐

  1. leecode62不同路径(动态规划)

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为 &quo ...

  2. python ElementTree 节点标签修改

    在网上能找到很多关于xml库ElementTree的增删改查用法,这里我就不重复写那么多了. 主要记录一个,不是很容易查到的用法,比如一个标签,<name></name>,我需 ...

  3. 查询某数据库的某字段存在于哪些表 mysql

    select column_name,column_comment,data_type ,table_name  from information_schema.columns where table ...

  4. shell语法2-默认变量、数组

    一:文件参数变量 1.在执行shell脚本时,可以向脚本传递参数.$1是第一个参数,$2是第二个参数,以此类推.特殊的,$0是文件名(包含路径) #! /bin/bashecho "文件名: ...

  5. 安装robotframwork 报错Requirement already satisfied

    pip install 的时候报错信息为,在这里插入图片描述对于这样的问题需要指定安装路径pip install --target=d:\python\python37\lib\site-packag ...

  6. 使用 GIT Bash Here 打tar包文件

    1.进入要被  打包的文件目录下 2.点击  Git Bash Here  ---> tar cvf server.tar server/ ok!!!!!!

  7. Hackintool查看CFG锁显示空白

    Hackintool是黑苹果配置的得力工具,通过在Hackintool > 工具 > 从AppleIntelInfo中获取 可以看到cfg是否成功解锁.但是如果点击该按钮后输入密码执行CP ...

  8. bzoj 4573

    LCT神题... 首先暴力的做法就是每次在一个区间上link,然后暴力查询,时间复杂度$O(爆炸)$ 但是我们可以发现的是,每棵树之间互不影响! 因此我们可以考虑离线之后分别统计每棵树 但是这样做其实 ...

  9. CF546E

    这题并不是太难 首先题目我们将每个城市拆点,由源点向一端连容量为初始人数的边,由另一端向汇点连容量为最后人数的边,然后按照题目要求从一端向另一端连容量无穷大的边 这样跑出最大流之后我们只需比较这个流量 ...

  10. LeetCode LCP 2. 分式化简

    从最后一项依次叠加 1 class Solution(object): 2 def fraction(self, cont): 3 """ 4 :type cont: L ...