Python JS逆向篇(一)

2023-11-20

逆向主题:51job请求头headers中携带的sign参数。
(注:文章所涉及内容只做学习参考交流,不做除此之外的任何其它用途!!!)
在本次逆向的网站中,里面涉及了大量js对象语法的使用,真的难受。而我也只会js的少部分基础语法知识(还没了解过js类对象的使用),所以这次js逆向的结果只能说是连拼带凑+运气 进行实现的(欧皇),也测试过多种参数,好像也都行得同,所以代码能跑就行也不是么!!!
好了,直接开搞!

效果实现

在这里插入图片描述

思路

最后一步

F12打开浏览器调试工具,直接全局搜索sign,如图,找到js文件后鼠标右键在资源面板中打开。
在这里插入图片描述


然后Ctrl+F,在当前代码中搜索sign,然后挨个挨个的找到下面此处,打上断点。

在这里插入图片描述


接下来浏览器刷新,或者将滚动条拉到最下面点击下一页(推荐)(因为这样方便直接抓接口好调试)。其中,p.a.HmacSHA256(t, s[“a”].state.commonStore.cupid_sign_key) 从这里可以看到,
加密所用的是HmacSHA256算法,参数1=t,参数2=s[“a”].state.commonStore.cupid_sign_key
从上面图片中第3步看到,在浏览器中打印
参数 t为每次发送请求所携带的参数,
在这里插入图片描述


**参数 2**为网站所提供的,网站没改就是可以直接写死。

在这里插入图片描述


接下来,嗯... 我们直接先打上下一个断点调试,先看看这行代码得到的到底是什么东西。

在这里插入图片描述
看到的结果一脸懵逼,居然不是字符串,而是一个对象,里面还有一大堆的数字。最开始的时候我真的是反复都没想明白,调试很多次后,发现得到的结果都是这样。然后我就被逼无赖的从当前这得到的结果开始往下面一步一步的调试…


反正一步一步的调试 (这期间会对headers里面的所有参数进行逐个处理,sign在header中)
就会走到下面js文件 里面的断点处,在控制台打印参数e看到的结果和直接得到的一模一样,好家伙,直接nice,终于等到你了。

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

最后控制台输出 i.join(“”)得到结果 与 找到抓包 对比得到的sign一模一样,nice,这样 相当于我们的最后一步就完成,哈哈哈。但是,这是最后一步,最后一步才是巨简单的一步,前面想要从p.a.HmacSHA256(t, s[“a”].state.commonStore.cupid_sign_key) 中逆向返回结果,我觉得是巨难的,当然,我本来也就是菜!!!


逆向 p.a.HmacSHA256(t, s[“a”].state.commonStore.cupid_sign_key)

这里就只能提供大概的思路了。

首先,直接跟进去new v.HMAC.init(e,n).finalize(t) 两部分组成,挨着调试。
在这里插入图片描述

在这里插入图片描述
这里的this._hasher.words得到的一个数组重要,在代码中写死。


然后,第一部分new v.HMAC.init(e,n)调试完,得到的结果不会变的,在代码中需要。
在这里插入图片描述


接着进入第二部分
在这里插入图片描述
此时的this._hasher.words得到的一个数组也重要,在代码中写死。


这里是第一次把参数进行加密。

在这里插入图片描述

在这里插入图片描述


第二次加密。
在这里插入图片描述

在这里插入图片描述


第三次加密,注意标注红色框的坑。
在这里插入图片描述
在这里插入图片描述


第四次加密,重复第二次步骤,其中的参数注意之前提及到可以死写的。


第五次加密,重复第三次步骤,其中的参数注意之前提及到可以死写的。


嗯…这里大致的细节就这些,里面涉及到对象变量的赋值,传值这些我也没法具体说清楚。


JS实现

import execjs

def get_sign(msg):
    return execjs.compile(open('./js实现.js', mode='r', encoding='utf-8').read()).call('get_sign', msg)

msg = '/open/noauth/search-pc?api_key=51job&timestamp=1678433991&keyword=java&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=2&requestId=b8d4157ef77dbe6504a2af4066fe9bc2&pageSize=50&source=1&accountId=&pageCode=sou%7Csou%7Csoulb'

print(get_sign(msg))

算法经过魔改,连拼带凑,实现!

function get_sign(params){

    function decodeE(e){
        for (var t = e.length, n = [], i = 0; i < t; i++)
        n[i >>> 2] |= (255 & e.charCodeAt(i)) << 24 - i % 4 * 8;
        return n;
    }
    var n1 = decodeE(params);

    function _doFinalize(n) {
        var n = n, i = 8 * (params.length+64), r = 8 * params.length; // #################374
        n[r >>> 5] |= 128 << 24 - r % 32,
            n[14 + (r + 64 >>> 9 << 4)] = 0,
            n[15 + (r + 64 >>> 9 << 4)] = i
        return n;
    }
    var n2 = _doFinalize(n1)
    // console.log(n2)
    // console.log(n2.length)
    // console.log('------------------------------')

    let u = []
    let l = [1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987, 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998]
    function _doProcessBlock(_hasher, e, t) {
        for (var n = _hasher, i = n[0], r = n[1], a = n[2], o = n[3], s = n[4], c = n[5], d = n[6], h = n[7], f = 0; f < 64; f++) {
            if (f < 16)
                u[f] = 0 | e[t + f];
            else {
                var p = u[f - 15]
                    , m = (p << 25 | p >>> 7) ^ (p << 14 | p >>> 18) ^ p >>> 3
                    , v = u[f - 2]
                    , g = (v << 15 | v >>> 17) ^ (v << 13 | v >>> 19) ^ v >>> 10;
                u[f] = m + u[f - 7] + g + u[f - 16]
            }
            var _ = s & c ^ ~s & d
                , y = i & r ^ i & a ^ r & a
                , b = (i << 30 | i >>> 2) ^ (i << 19 | i >>> 13) ^ (i << 10 | i >>> 22)
                , w = (s << 26 | s >>> 6) ^ (s << 21 | s >>> 11) ^ (s << 7 | s >>> 25)
                , k = h + w + _ + l[f] + u[f]
                , x = b + y;
            h = d,
            d = c,
            c = s,
            s = o + k | 0,
            o = a,
            a = r,
            r = i,
            i = k + x | 0
        }
        n[0] = n[0] + i | 0,
        n[1] = n[1] + r | 0,
        n[2] = n[2] + a | 0,
        n[3] = n[3] + o | 0,
        n[4] = n[4] + s | 0,
        n[5] = n[5] + c | 0,
        n[6] = n[6] + d | 0,
        n[7] = n[7] + h | 0
        return n;
    }

    var n3, o = 16;
    for (var h = 0; h < n2.length; h += o){
        if (h===0){
            var _hasher1 = [1117030989, -313930070, 1220769150, 2145608982, 349080574, -404652517, 2003086084, -179720659]
            n3 = _doProcessBlock(_hasher1,n2, h);
        }else{
            n3 = _doProcessBlock(n3,n2, h);
        }
    }
    // console.log(n3)
    // console.log(n3.length)
    // console.log('------------------------------')

    var _oKey = [1027488319, 1681548600, 1060791359, 1866100536, 1681735022, 1701330239, 1765436991, 980303679, 1802201707, 963209573, 1852401004, 980378943, 1866099052, 1869507437, 943221348, 1768582718]
    var n4 = _oKey.concat(n3);
    function _doFinalize2(n) {
        var n = n, i = 8 * 96, r = 8 * 96;
        n[r >>> 5] |= 128 << 24 - r % 32,
            n[14 + (r + 64 >>> 9 << 4)] = 0,
            n[15 + (r + 64 >>> 9 << 4)] = i
        return n;
    }
    var n5 = _doFinalize2(n4);
    // console.log(n5)
    // console.log(n5.length)
    // console.log('------------------------------')

    var n6, o = 16;
    for (var h = 0; h < n5.length; h += o){
        if (h===0){
            var _hasher2 = [1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225]
            n6 = _doProcessBlock(_hasher2,n5, h);
        }else{
            n6 = _doProcessBlock(n6,n5, h);
        }
    }
    // console.log(n6)
    // console.log(n6.length)
    // console.log('------------------------------')

    // 将上面得到的数组转为字符串
    function arrayResToString(n) {
        for (var t = n, n = 32, i = [], r = 0; r < n; r++) {
            var a = t[r >>> 2] >>> 24 - r % 4 * 8 & 255;
            i.push((a >>> 4).toString(16)),
                i.push((15 & a).toString(16))
        }
        return i.join("")
    }

    return arrayResToString(n6);

}

//var params = '/open/noauth/search-pc?api_key=51job&timestamp=1678433991&keyword=java&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=2&requestId=b8d4157ef77dbe6504a2af4066fe9bc2&pageSize=50&source=1&accountId=&pageCode=sou%7Csou%7Csoulb'
//console.log("sign="+get_sign(params))

py实现(先苦后甜)

python 不愧是世界上最好的语言(手动狗头)。
别人封装封装再封装,我们就调用调用再调用,主打的就是一个调包。

import hmac
from hashlib import sha256

def get_sign(msg):
    key = 'abfc8f9dcf8c3f3d8aa294ac5f2cf2cc7767e5592590f39c3f503271dd68562b'.encode('utf-8')
    return hmac.new(key=key, msg=msg.encode('utf-8'), digestmod=sha256).hexdigest()

msg = '/open/noauth/search-pc?api_key=51job&timestamp=1678433991&keyword=java&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=2&requestId=b8d4157ef77dbe6504a2af4066fe9bc2&pageSize=50&source=1&accountId=&pageCode=sou%7Csou%7Csoulb'

print(get_sign(msg=msg))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python JS逆向篇(一) 的相关文章

  • Django 中的 Rpy2 错误 - 未为“”类型的对象定义转换“py2rpy”

    我以前从未使用过 R 并且正在尝试使用 rpy2 从 python 调用 R 函数 它可以在独立的 python 终端上运行 但不能在 Django 中运行 但rpy2似乎无法将python字符串转换为r对象 我正在使用同事提供的自定义库
  • Python:使用 string.format() 将单词大写

    是否可以使用字符串格式将单词大写 例如 user did such and such format user foobar 应该返回 Foobar 做了这样那样的事情 请注意 我很清楚 capitalize 但是 这是我正在使用的代码 非常
  • 如何让python优雅地失败?

    我只是想知道如何让 python 在所有可能的错误中以用户定义的方式失败 例如 我正在编写一个处理 大 项目列表的程序 并且某些项目可能不符合我定义的格式 如果 python 检测到错误 它目前只会输出一条丑陋的错误消息并停止整个过程 但是
  • 正则表达式,选择最接近的匹配

    假设以下单词序列 BLA text text text text text text BLA text text text text LOOK text text text BLA text text BLA 我想做的是将 BLA 中的文本
  • matplotlib 中的 R 风格数据轴缓冲区

    R 绘图自动设置 x 和 y 限制 以在数据和轴之间留出一些空间 我想知道 matplotlib 是否有办法自动执行相同的操作 如果没有 是否有一个好的公式或 经验法则 来说明 R 如何设置其轴限制 在 matplotlib 中 您可以通过
  • 使用 pandas 将字符串对象转换为 int/float

    import pandas as pd path1 home supertramp Desktop 100 life 180 data csv mydf pd read csv path1 numcigar Never 0 1 5 Ciga
  • 将一维数组转换为下三角矩阵

    我想将一维数组转换为较低的零对角矩阵 同时保留所有数字 我知道numpy tril函数 但它用零替换了一些元素 我需要扩展矩阵以包含所有原始数字 例如 10 20 40 46 33 14 12 46 52 30 59 18 11 22 30
  • 如何使用 i18n 切换器将“LANGUAGE_CODE”保存到数据库,以便在 Django 中的不同浏览器中语言不会更改?

    有什么办法可以改变它的值LANGUAGE CODE单击按钮 发送请求 时 settings py 中的变量会动态变化吗 我希望用户设置自己的 默认语言 他们的帐户 现在 用户可以使用下拉列表选择他们的首选语言 并且网站会得到完美的翻译 并且
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • 在 iPython/pandas 中绘制多条线会生成多个图

    我试图了解 matplotlib 的状态机模型 但在尝试在单个图上绘制多条线时遇到错误 据我了解 以下代码应该生成包含两行的单个图 import pandas as pd import pandas io data as web aapl
  • 将列表中的 None 替换为最左边的非 none 值

    Given a None 1 2 3 None 4 None None I d like a None 1 2 3 3 4 4 4 目前我已经用以下方法强制它 def replaceNoneWithLeftmost val last Non
  • 根据第三个变量更改散点图中的标记样式

    我正在处理多列字典 我想绘制两列 然后根据第三列和第四列更改标记的颜色和样式 我很难改变 pylab 散点图中的标记样式 我的方法适用于颜色 不幸的是不适用于标记样式 x 1 2 3 4 5 6 y 1 3 4 5 6 7 m k l l
  • Jupyter Notebook 中的深色模式绘图 - Python

    我正在使用 Jupyter Notebook 目前正在使用 JupyterThemes 的深色日光主题 我注意到我的绘图不是处于黑暗模式 并且文本仍然是黑色并且在日光照射的背景上无法读取 JupyterThemes 的自述文件建议在 ipy
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • 在 matplotlib 中绘制多边形的并集[重复]

    这个问题在这里已经有答案了 我正在尝试绘制几个多边形的并集matplotlib 具有一定的 alpha 水平 我当前的代码在交叉点处颜色较深 有没有办法让交叉路口与其他地方的颜色相同 import matplotlib pyplot as
  • python dicttoxml 多次使用相同的键

    我正在尝试做如下所示的 xml
  • 更新 SQLAlchemy 中的特定行

    我将 SQLAlchemy 与 python 一起使用 我想更新表中等于此查询的特定行 UPDATE User SET name user WHERE id 3 我通过 sql alchemy 编写了这段代码 但它不起作用 session
  • 沿轴 0 重复 scipy csr 稀疏矩阵

    我想重复 scipy csr 稀疏矩阵的行 但是当我尝试调用 numpy 的重复方法时 它只是将稀疏矩阵视为对象 并且只会将其作为 ndarray 中的对象重复 我浏览了文档 但找不到任何实用程序来重复 scipy csr 稀疏矩阵的行 我
  • Streamlabs API 405 响应代码

    我正在尝试使用Streamlabs API https dev streamlabs com Streamlabs API 使用 Oauth2 来创建应用程序 因此 首先我将使用我的应用程序的用户发送到一个授权链接 其中包含我的应用程序的客
  • 使用 SERVER_NAME 时出现 Flask 404

    在我的 Flask 配置中 我将 SERVER NAME 设置为 app example com 之类的域 我这样做是因为我需要使用url for with external网址 如果未设置 SERVER NAME Flask 会认为服务器

随机推荐

  • Java 6-1 项目模块化-概念

    6 1 项目模块化 概念 一 组件化与模块化 组件化 以功能为依据 解决复用问题 初衷 可复用的代码 进行工具性的封装 目的 复用 解耦 依赖 各组件之间独立 低依赖甚至零依赖 架构 纵向 位于项目底层 被其他上层依赖 举例 Dialog
  • 完全数

    my0163 完全数 HOBO浩 描述 求正整数 2 和 n 之间的完全数 一行一个数 完全数 因子之和等于它本身的自然数 如 6 1 2 3 输入 输入n 1 n 5000 输出 一行一个数 按由小到大的顺序 输入样例 7 输出样例 6
  • 自学网络安全(黑客)的误区

    前言 网络安全入门到底是先学编程还是先学计算机基础 这是一个争议比较大的问题 有的人会建议先学编程 而有的人会建议先学计算机基础 其实这都是要学的 而且这些对学习网络安全来说非常重要 一 网络安全学习的误区 1 不要试图以编程为基础去学习网
  • java 二阶段提交,二阶段提交协议(Two Phase Commitment Protocol)

    一 典型的分布式事务实例 跨行转账问题是一个典型的分布式事务 用户A向B的一个转账1000 要进行A的余额 1000 B的余额 1000 显然必须保证这两个操作的事务性 类似的还有 电商系统中 当有用户下单后 除了在订单表插入记 还要在商品
  • mysql数据库常用sql语句

    数据库可以用图形化工具来实现一系列操作 这里涉及一些cmd命令行 首先要配置好环境变量可以全局操作命令 不然只能在mysql的安装目录下进行操作 这里不再叙述 1 进入数据库 mysql u root p 默认用户名为root 这个与mys
  • Flutter 中的单元测试:从工作流基础到复杂场景

    对 Flutter 的兴趣空前高涨 而且早就应该出现了 Google 的开源 SDK 与 Android iOS macOS Web Windows 和 Linux 兼容 单个 Flutter 代码库支持所有这些 单元测试有助于交付一致且可
  • 3种方法更改Linux系统的主机名(hostname)

    3种方法更改Linux系统的主机名 hostname
  • type-aliases-package的作用

    mapper xml文件中resultType或者parameterType会使用JavaBean作为返回结果或者参数需要使用完全限定名来指定引用 例如
  • undefined reference to ceil 链接错误

    undefined reference to ceil 链接错误 原因今天编译一个C文件 输入下面的代码后 GOP12 c文件代码大致为 include
  • 森林的先序和中序遍历

    森林的先序和中序遍历 先序遍历 中序遍历 最靠谱的方法 先序遍历 中序遍历 最靠谱的方法 把森林转为二叉树 左孩子 右兄弟的那种 然后对二叉树进行先序或中序遍历即得正确结果
  • 机器ubuntu20.04和ubuntu16.04在局域网下ros通信

    多台机器ros局域网通信 试过在ubuntu16 04的机器人和ubuntu20 04下安装不同版本ros通信 测试成功 首先保证两台机器在同一个局域网内 可以相互ping通 1 查看ip地址 ifconfig 2 ssh远程登录机器人计算
  • Qt界面制作简单教程,调用python代码

    利用Qt5design或Qt5Creator制作界面的布局 包括设置按钮的个数 布局和大小等 注意记得为每个按钮添加槽函数 保存生成 ui文件 利用pyuic5 xxx ui gt xxx py或pyuic5 xxx ui o xxx py
  • 最全的雅思8000词汇pdf_助力9分

    词汇是雅思学习的基础 对此我们特别设立 9分词汇 小栏目 专门分享词汇相关干货 包括但不限于 高频词解析 场景词汇总结 熟词辟义 同义替换等等 如果你还有其他有关词汇想要学习了解的 欢迎给我们留言 一定及时为大家补充 雅思听力part 1
  • html点击收缩展开菜单栏,jquery实现点击向下展开菜单项(伸缩导航)效果

    本文实例讲述了jquery实现点击向下展开菜单项 伸缩导航 效果 分享给大家供大家参考 具体如下 这里演示基于jquery打造的向下展开的多级导航条效果 纵向垂直排列 风格非常的简洁 鼠标点击时候展开菜单的二级项 再次点击的时候又向上合拢
  • Spring事务传播属性

    参考文献 Spring事务传播属性和隔离级别 https www cnblogs com eunice sun p 11024584 html spring事务传播机制总结 https blog csdn net m18330808841
  • GBA编程和汉化常用软件汇总

    内容来自GBA吧中的痴狂小黑 本人只是做个汇总和搬运 1 简易图片导入导出套装 PicSimpleImEx AutoPicRock Ver1 0 这两个软件是用C 写的 想要用 先装dotNetFx40 Full x86 x64 exe 然
  • 算法问题实战策略

    算法问题实战策略 基本信息作者 韩 具宗万 译者 崔盛一出版社 人民邮电出版社ISBN 9787115384621上架时间 2015 2 4出版日期 2015 年3月开本 16开页码 738版次 1 1 内容简介 算法问题实战策略 本书收录
  • 手动搭建torch2.0环境

    一 下载相关whl 1 从Previous PyTorch Versions PyTorch检查相互版本是否兼容 否则会出现无法使用cuda的问题 2 从https download pytorch org whl torch stable
  • 阶乘质因子分解(唯一分解定理)

    阶乘质因子分解 题目描述 对N 进行质因子分解 输入输出格式 输入格式 输入数据仅有一行包含一个正整数N N lt 10000 输出格式 输出数据包含若干行 每行两个正整数p a 中间用一个空格隔开 表示N 包含a个质因子p 要求按p的值从
  • Python JS逆向篇(一)

    Python JS逆向篇 一 效果实现 思路 最后一步 逆向 p a HmacSHA256 t s a state commonStore cupid sign key JS实现 py实现 先苦后甜 逆向主题 51job请求头headers