Python JS逆向篇(一)

news2024/11/28 5:49:09

Python JS逆向篇(一)

  • 效果实现
  • 思路
    • 最后一步
    • 逆向 p.a.HmacSHA256(t, s["a"].state.commonStore.cupid_sign_key)
  • JS实现
  • py实现(先苦后甜)

逆向主题: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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows基于Nginx搭建RTMP流媒体服务器(附带所有组件下载地址及验证方法)

RTMP服务时常用于直播时提供拉流推流传输数据的一种服务。前段时间由于朋友想搭建一套直播时提供稳定数据传输的服务器&#xff0c;所以就研究了一下如何搭建及使用。 1、下载nginx 首先我们要知道一般nginx不能直接配置rtmp服务&#xff0c;在Windows系统上需要特殊nginx版本…

centos8 安装 pcs pacemaker

一、背景 在centos-8中安装pcs、pacemaker会显示找不到源 &#xff08;yum install pcs pacemaker 也是一样的&#xff09; 通过搜索引擎&#xff0c;有说&#xff1a;dnf config-manager --set-enable HighAvailability 也有的说&#xff1a;执行dnf update 也有的说执行 dn…

AB测试——流程介绍(设计实验)

前言&#xff1a; 作为AB测试的学习记录&#xff0c;接上文内容&#xff0c; 本文继续介绍假设建立和实验设计部分&#xff0c;包括实验对象、样本量计算&#xff08;显著性水平、统计功效及最小可检测效应&#xff09;、实验周期。 相关文章&#xff1a; AB测试——原理介绍 A…

【PyTorch】教程:torch.nn.PReLU

torch.nn.PReLU 原型 CLASS torch.nn.PReLU(num_parameters1, init0.25, deviceNone, dtypeNone) 参数 num_parameters ([int]) – 需要学习的 aaa 的数量&#xff0c;尽管作为输入&#xff0c;只有两个值是合法的&#xff0c;1 或者 输入的通道数&#xff0c;默认为 1 。ini…

各种光照模型的shader实现

大家好&#xff0c;我是阿赵。 这里打算给大家介绍一些常用的光照模型的shader实现方法。虽然这些光照模型很多都会在各大引擎内置&#xff0c;一般不需要自己写。但我觉得学习一下&#xff0c;首先对了解渲染原理有帮助&#xff0c;然后对写一些复合效果的shader时&#xff0c…

java安全编码规范考试

java安全编码规范考试 整理不易&#xff0c;收点币&#xff01;&#xff01; 安全编码规范考试.md 下面对zip文件的安全解压缩描述&#xff0c;错误的是 A.zip文件解压时&#xff0c;可以使用entry.getSize(&#xff09;对解压缩文件进行文件大小判断 B.zip文件解压时&…

Spring Cloud ( Eureka集群的搭建 )

操作步骤&#xff1a; 添加主机映射创建Eureka服务 导入依赖编写启动类编写yml复制服务实例测试一、添加主机映射 以 Windows系统为例&#xff0c;如果要构建集群&#xff0c;需要修改 hosts 文件&#xff0c;为其添加主机名的映射。 打开C:\Windows\System32\drivers\etc\h…

DJ1-4 计算机网络和因特网

目录 一、协议层及其服务模型 ISO/OSI 七层参考模型 TCP/IP 参考模型 1. 网际协议栈&#xff08;protocol stack&#xff09; 2. 分层&#xff1a;逻辑通信 3. 协议分层与数据 二、攻击威胁下的网络 1. 植入恶意软件 2. 攻击服务器和网络基础设施 3. 嗅探分组 4. 伪…

为什么机器人操作系统ROS1、ROS2这么难学

AI回复&#xff1a;ROS1、ROS2是机器人操作系统&#xff0c;涉及到很多复杂的概念和技术&#xff0c;需要有一定的编程和机器人知识基础才能学习。此外&#xff0c;ROS1和ROS2的架构和设计也有很大的不同&#xff0c;需要花费一定的时间和精力去学习和适应。但是&#xff0c;一…

DHCP的配置

实验目的熟悉DHCP的应用场景掌握DHCP的配置方法实验拓扑DHCP的配置如图15-2所示: 图15-2:DHCP的配置 实验步骤配置IP地址<Huawei>system-view Enter system view, return user view with Ctrl+Z.

新手入门python实现神经网络,超级简单!

前言&#xff1a; 这篇文章完全是为新手准备的。我们会通过用Python从头实现一个神经网络来理解神经网络的原理。 文章目录神经元1、一个简单的例子2、编码一个神经元把神经元组装成网络1、例子&#xff1a;前馈2、编码神经网络&#xff1a;前馈训练神经网络 第一部分1、损失2、…

C51---串口发送指令,控制LED灯亮灭

1.Code: #include "reg52.h" #include "intrins.h" sfr AUXR 0x8E; sbit D5 P3^7; void UartInit(void) //9600bps11.0592MHz { //PCON & 0x7F; //波特率不倍速 AUXR 0x01; SCON 0x50; //8位数据,可变波…

Spark-RDD 转换算子(双 Value 类型、Key - Value 类型)

双 Value 类型 1、intersection&#xff08;交集&#xff09; 2、union&#xff08;并集&#xff09; 3、subtract&#xff08;差集&#xff09; 4、zip&#xff08;拉链&#xff09; Key - Value 类型 1、partitionBy 2、reduceByKey 3、groupByKey 4、aggregateByK…

FinOps首次超越安全成为企业头等大事|云计算趋势报告

随着云计算在过去十年中的广泛应用&#xff0c;云计算用户所面临的一个持续不变的趋势是&#xff1a;安全一直是用户面临的首要挑战。然而&#xff0c;这种情况正在发生转变。 知名IT软件企业 Flexera 对云计算决策者进行年度调研已经持续12年&#xff0c;而今年安全问题首次…

3.初识Vue

目录 1 vue 浏览器调试工具 1.1 安装 1.2 配置 2 数据驱动视图与双向数据绑定 3 简单使用 3.1 下载 3.2 将信息渲染到DOM上 4 使用vue浏览器调试工具 5 vue指令 1 vue 浏览器调试工具 chrome可能是我浏览器的原因&#xff0c;装上用不了&#xff0c;我们使…

javaWeb核心05-FilterListenerAjax

文章目录Filter&Listener&Ajax1&#xff0c;Filter1.1 Filter概述1.2 Filter快速入门1.2.1 开发步骤1.2.2 代码演示1.3 Filter执行流程1.4 Filter拦截路径配置1.5 过滤器链1.5.1 概述1.5.2 代码演示1.5.3 问题1.6 案例1.6.1 需求1.6.2 分析1.6.3 代码实现1.6.3.1 创建F…

JavaScript Date(日期)对象

日期对象用于处理日期和时间。在线实例返回当日的日期和时间如何使用 Date() 方法获得当日的日期。getFullYear()使用 getFullYear() 获取年份。getTime()getTime() 返回从 1970 年 1 月 1 日至今的毫秒数。setFullYear()如何使用 setFullYear() 设置具体的日期。toUTCString()…

要做一个关于DDD的内部技术分享,记录下用到的资源,学习笔记(未完)

最后更新于2023年3月10日 14:28:08 问题建模》软件分层》具体结构&#xff0c;是层层递进的关系。有了问题建模&#xff0c;才能进行具体的软件分层的讨论&#xff0c;再有了分层&#xff0c;才能讨论在domain里面应该怎么实现具体结构。 1、问题建模&#xff1a;Domain、Mod…

手写模拟SpringMvc源码

MVC框架MVC是一种设计模式&#xff08;设计模式就是日常开发中编写代码的一种好的方法和经验的总结&#xff09;。模型&#xff08;model&#xff09;-视图&#xff08;view&#xff09;-控制器&#xff08;controller&#xff09;&#xff0c;三层架构的设计模式。用于实现前端…

无公网IP快解析实现移动app访问内网应用

随着移动化的发展&#xff0c;国内各大管理软件厂商纷纷推出相应的移动应用服务。移动端为企业提供了不一样的办公方式&#xff0c;从碎片化应用到一体化&#xff0c;同时也为企业办公提供了更高效便捷办公体验。 移动办公和传统pc端在服务器端部署时并没有太大的区别。企业为了…