JS逆向,po jie 喜马拉雅Xm-Sign

前言

最近练习js逆向,记录一下

目标声明:仅仅记录一下自己的学习方法,不作为学习参考、更不作为商业用途。如有侵犯请联系本人删除

目标url: aHR0cHM6Ly93d3cueGltYWxheWEuY29tLw==
目标加密

1、分析

密文: 135a791df3418106bd30a4cec24918ea(64)1693202056545(17)1693202045790
结构:

  • 135a791df3418106bd30a4cec24918ea:32位,像是md5加密
  • (64),(17):暂时搞不懂是什么?
  • 1693202056545,1693202045790:两个时间戳

2、定位加密位置

这个站比较简单直接拿Xm-Sign搜索就能搜索到
在这里插入图片描述
我们打个断点,看下是否在这里!!!
在这里插入图片描述
发现就是在d.getSign()这个方法生成的!!

这里使用XHR去定位,也可以,调用几个堆栈就能找到

2、加密算法实现

上面发现加密结果时 d.getSing()方法返回的,我们进去看一下
在这里插入图片描述
这里我们分析一下这个function,

 t.prototype[c("0x27")] = function() {
     var t, e, r, n = 0;
     return n = s() ? Date.now() : window.XM_SERVER_CLOCK || 0,
     t = this[c("0x13")],
     e = n,
     r = Date[c("0x25")](), ("{" + t + e + "}(" + u(100) + ")" + e + "(" + u(100) + ")" + r)[c("0xa")](/{([\w-]+)}/, (function(t, e) {
         return a(e)
     }))
 }
  1. n的值: 这明显是个三元运算符
    • s()方法返回true,则n=Date.now(),时间戳。
    • s()方法返回false,则n=window.XM_SERVER_CLOCK ,如果window.XM_SERVER_CLOCK没有定义,则 n=0;
      这里就要看下s()函数了
      在这里插入图片描述
      可以看出 s函数,只会返回false
      所以n=window.XM_SERVER_CLOCK
      这里看下window.XM_SERVER_CLOCK 是什么值:
      在这里插入图片描述
      可以看到也是个时间戳,那这个时间戳是什么时候生成的呢????这里留个问题

接下来看看 t的值:
在这里插入图片描述
结果多次调试,t的值是固定的,直接下一个
e=n,所以e也不用看了
在这里插入图片描述

 r = Date[c("0x25")](),
 //根据上面截图,可以看出,r=Date.now()    还是一个时间戳。

下面这一坨是什么,大致一眼看不懂我们在控制台输出一下
在这里插入图片描述
诶,看见我们的密文了,
这里分析下这个段代码
将{}大括号里面的值替换为后面函数生成的值a(e),
u(100) 看起来像是,生成100以内的随机数,
e:上面分析的 e=n ,n=window.XM_SERVER_CLOCK
r: r=Date.now()

这里重点就看下a(e)是什么鬼了 ,,,
在这里插入图片描述
e:t+e = ‘himalaya-’+window.XM_SERVER_CLOCK

a(e)函数:
在这里插入图片描述
上面抛出异常不用分析
直接看

 var n = r[c("0x3c")](u(t, e));

因为明文直接传递给了u函数 ,我们直接看u函数干了什么东西
在这里插入图片描述
发现这里不就是md5了吗?再结合他的密文是32位的,
所以目前剩下的问题就是 window.XM_SERVER_CLOCK 是什么时候生成的??
根据开始断点和window.XM_SERVER_CLOCK 值可以分析出来在执行d.getSign()方法之前就有了
那我们在 d生成的地方
在这里插入图片描述
下个断点
重点这里需要刷新页面,才能断到这里
在这里插入图片描述
进去一步一步跟
在这里插入图片描述
发现this[]中括号里面没有XM_SERVER_CLOCK的值那么继续单步调试,到下一个方法
最后

this[c("0x36")]()方法异步的调用了 
下面这个方法
 return t[c("0x9")][c("0x36")] = function(t) {
	var e = this;
	void 0 === t && (t = !1),
	s() || window.XM_SERVER_CLOCK && !t || this[c("0x44")]()[c("0x45")]((function(t) {
		e[c("0x12")] = t,
		window[c("0x20")] = t,
		e[c("0x48")]()
	}))
}

在这里插入图片描述
t就是这个时间戳
那么这个t哪里来的呢?,跟栈发现这个this.url也很可疑
在这里插入图片描述
去访问一下
在这里插入图片描述
到此所有问题分析完成

代码实现

js代码

const crypto = require('crypto');

function getKey(dataTime){
    var  r = Date.now();
    var e= dataTime;
    var t = "himalaya-";
    return  crypto.createHash('md5').update("himalaya-"+dataTime).digest('hex')+"(" + u(100) + ")" + e + "(" + u(100) + ")" + r;
}
function u(t) {
    return ~~(Math["random"]() * t)
}

python代码

import requests
import execjs

headers = {
    "Accept": "*/*",
    "Accept-Language": "en,zh-CN;q=0.9,zh;q=0.8",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "Pragma": "no-cache",
    "Referer": "https://www.ximalaya.com/",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
    "sec-ch-ua": "\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\""
}

url = "https://www.ximalaya.com/revision/time"
response = requests.get(url, headers=headers)

print(response.text)


with open('./喜马拉雅.js', 'r',encoding='utf-8') as f:
    js = f.read()
resCode=execjs.compile(js).call('getKey',response.text)

print(resCode)


headers = {
    "Accept": "*/*",
    "Accept-Language": "en,zh-CN;q=0.9,zh;q=0.8",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive",
    "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
    "Pragma": "no-cache",
    "Referer": "https://www.ximalaya.com/",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
    "sec-ch-ua": "\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "xm-sign": resCode
}

url = "https://www.ximalaya.com/revision/search/main"
params = {
    "core": "all",
    "kw": "音乐",
    "spellchecker": "true",
    "device": "iPhone",
    "live": "true"
}
response = requests.get(url, headers=headers, params=params)

print(response.text)

结果
在这里插入图片描述
其实这段加密和发包,完全可以用python来实现了,这里小编就不在各位大佬面前班门弄斧了。。。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
小红书是一个社交电商平台,为了保护用户的数据安全和防止恶意攻击,平台采用了加密算法对一些敏感参数进行加密处理,比如x-s和x-t。逆向工程是指通过对应用程序或代码的逆向分析和解析,以获取其内部的机制、算法或逻辑流程。 要逆向解密小红书的x-s和x-t参数,通常需要进行以下步骤: 1. 获取加密的js文件:首先,我们需要获取小红书的相关js文件,可以通过抓包工具或者浏览器开发者工具获取到与加密相关的js文件。 2. 分析加密算法:通过对js文件的逆向分析,我们可以寻找到相关的加密算法或函数。一般来说,加密参数通常会用到一些常见的加密算法,比如AES、RSA、MD5等。分析加密算法的关键是找到加密所使用的密钥和加密的处理过程。 3. 提取密钥和参数:一旦我们找到了加密算法和处理过程,接下来需要尝试提取出密钥和参数。这需要根据具体的算法和代码逻辑进行实际的代码分析和编写。 4. 解密参数:当我们获取到了正确的密钥和参数后,就可以编写相应的解密函数来对加密的x-s和x-t参数进行解密。 需要注意的是,逆向工程涉及对他人软件的解密和分析,这可能涉及到法律和道德等方面的问题,建议在合法和合规的前提下使用逆向工程技术。此外,小红书作为一款商业应用,也会不断更新其加密算法和安全机制,因此逆向解密可能随着时间的推移需要不断更新和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值