ToB企服应用市场:ToB评测及商务社交产业平台

标题: js逆向实战之烯牛数据请求参数加密和返回数据解密 [打印本页]

作者: 农妇山泉一亩田    时间: 2024-9-22 13:58
标题: js逆向实战之烯牛数据请求参数加密和返回数据解密
声明:本篇文章仅用于知识分享

实战网址:https://www.xiniudata.com/industry/newest?from=data
请求参数加密

  1. var f = Object(u.c)(Object(u.d)(JSON.stringify(s.payload))), p = Object(u.e)(f);
复制代码
涉及到一个变量和三个函数,一个一个看。
(1)变量s.payload:直接输出看即可。

(2)函数Object(u.c):控制台输出,定位。

(3)函数Object(u.d):控制台输出,定位。

(4)函数Object(u.e):控制台输出,定位。

上面三个函数的代码可以不用看,直接调用js代码就可以了。
4. 目前的js代码如下。
  1. s = {
  2.     "payload": {
  3.         "sort": 1,
  4.         "start": 20,
  5.         "limit": 20
  6.     }
  7. }
  8. function e1(e) {
  9.     if (null == e)
  10.         return null;
  11.     for (var t, n, r, o, i, a, u, c = "", l = 0; l < e.length;)
  12.         o = (t = e.charCodeAt(l++)) >> 2,
  13.             i = (3 & t) << 4 | (n = e.charCodeAt(l++)) >> 4,
  14.             a = (15 & n) << 2 | (r = e.charCodeAt(l++)) >> 6,
  15.             u = 63 & r,
  16.             isNaN(n) ? a = u = 64 : isNaN(r) && (u = 64),
  17.             c = c + _keyStr.charAt(o) + _keyStr.charAt(i) + _keyStr.charAt(a) + _keyStr.charAt(u);
  18.     return c
  19. }
  20. function e2(e) {
  21.     if (null == (e = _u_e(e)))
  22.         return null;
  23.     for (var t = "", n = 0; n < e.length; n++) {
  24.         var r = _p.charCodeAt(n % _p.length);
  25.         t += String.fromCharCode(e.charCodeAt(n) ^ r)
  26.     }
  27.     return t
  28. }
  29. function sig(e) {
  30.     return md5(e + _p).toUpperCase()
  31. }
  32. var f = e1(e2(JSON.stringify(s.payload)))
  33.     , p = sig(f);
  34. console.log(f);
  35. console.log(p);
复制代码
运行提示_u_e is not defined,去找一下补到代码中。

运行提示_p is not defined,去找_p。

运行提示md5 is not defined,这里需要导入crypto-js库,可以通过npm install crypto-js下令下载。
  1. const CryptoJS = require("crypto-js");
  2. function sig(e) {
  3.     return CryptoJS.MD5(e + _p).toUpperCase()
  4. }
复制代码
运行提示CryptoJS.MD5(...).toUpperCase is not a function,是因为在转换为大写之前需要先用toString函数转为字符串。
完整代码如下:
  1. // query_parameter_encrypt.js
  2. const CryptoJS = require("crypto-js");
  3. s = {
  4.     "payload": {
  5.         "sort": 1,
  6.         "start": 0,
  7.         "limit": 20
  8.     }
  9. }
  10. function _u_e(e) {
  11.     if (null == e)
  12.         return null;
  13.     e = e.replace(/\r\n/g, "\n");
  14.     for (var t = "", n = 0; n < e.length; n++) {
  15.         var r = e.charCodeAt(n);
  16.         r < 128 ? t += String.fromCharCode(r) : r > 127 && r < 2048 ? (t += String.fromCharCode(r >> 6 | 192),
  17.             t += String.fromCharCode(63 & r | 128)) : (t += String.fromCharCode(r >> 12 | 224),
  18.             t += String.fromCharCode(r >> 6 & 63 | 128),
  19.             t += String.fromCharCode(63 & r | 128))
  20.     }
  21.     return t
  22. }
  23. var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
  24.     , _p = "W5D80NFZHAYB8EUI2T649RT2MNRMVE2O";
  25. function e1(e) {
  26.     if (null == e)
  27.         return null;
  28.     for (var t, n, r, o, i, a, u, c = "", l = 0; l < e.length;)
  29.         o = (t = e.charCodeAt(l++)) >> 2,
  30.             i = (3 & t) << 4 | (n = e.charCodeAt(l++)) >> 4,
  31.             a = (15 & n) << 2 | (r = e.charCodeAt(l++)) >> 6,
  32.             u = 63 & r,
  33.             isNaN(n) ? a = u = 64 : isNaN(r) && (u = 64),
  34.             c = c + _keyStr.charAt(o) + _keyStr.charAt(i) + _keyStr.charAt(a) + _keyStr.charAt(u);
  35.     return c
  36. }
  37. function e2(e) {
  38.     if (null == (e = _u_e(e)))
  39.         return null;
  40.     for (var t = "", n = 0; n < e.length; n++) {
  41.         var r = _p.charCodeAt(n % _p.length);
  42.         t += String.fromCharCode(e.charCodeAt(n) ^ r)
  43.     }
  44.     return t
  45. }
  46. function sig(e) {
  47.     return CryptoJS.MD5(e + _p).toString().toUpperCase();
  48. }
  49. function generate(s) {
  50.     var payload = e1(e2(JSON.stringify(s.payload))), sign = sig(payload);
  51.     return [payload, sign];
  52. }
  53. console.log(generate(s));
复制代码
运行结果如下。

成功,接下来就是编写python代码获取数据了。
  1. import requests
  2. import json
  3. import execjs
  4. url = "https://www.xiniudata.com/api2/service/x_service/person_industry_list/list_industries_by_sort"
  5. # 这里面最重要的就是content-type参数,否则获取不到数据
  6. headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
  7.                          "Chrome/129.0.0.0 Safari/537.36",
  8.            # "cookie": "btoken=82SLKQK1ESJ7A9NZ1C3ZAKREOC0I3AAC",
  9.            # "referer": "https://www.xiniudata.com/industry/newest?from=data",
  10.            # "origin": "https://www.xiniudata.com",
  11.            "content-type": "application/json"}
  12. # 生成payload和sig
  13. s = {
  14.     "payload": {
  15.         "sort": 1,
  16.         "start": 0,
  17.         "limit": 20
  18.     }
  19. }
  20. file = open("query_parameter_encrypt.js", mode="r")
  21. exec_code = file.read()
  22. exec_js = execjs.compile(exec_code)
  23. payload, sig = exec_js.call("generate", s)
  24. data = {
  25.     "payload": payload,
  26.     "sig": sig,
  27.     "v": 1
  28. }
  29. # 注意需要转换为json数据传输
  30. resp = requests.post(url, headers=headers, data=json.dumps(data))
  31. print(json.loads(resp.text))
复制代码
运行结果如下。

返回数据解密

[code]// response_data_decrypt.jsvar _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="              , _p = "W5D80NFZHAYB8EUI2T649RT2MNRMVE2O";function d1(e) {    var t, n, r, o, i, a, u = "", c = 0;    for (e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""); c < e.length;)        t = _keyStr.indexOf(e.charAt(c++)) > 4,            n = (15 & o) > 2,            r = (3 & i)  191 && r < 224 ? (o = e.charCodeAt(n + 1),            t += String.fromCharCode((31 & r)




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4