氪金兽爬虫(上架账号监控),nonce、sign参数逆向

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

氪金兽 爬虫(新上架账号监控)


前言

本次介绍一下氪金兽平台的sign加密逆向思路,以此完成对上架账号的查询,实现新账号的监控
本次爬虫文章仅供学习和参考目的,不得用于任何商业活动或非法行为。爬取网站数据可能涉及到法律和道德问题,请在合法和合理的范围内使用。在使用爬虫程序时,请务必遵守相关法律法规,尊重网站的使用规则和隐私政策。

文章中的数据、信息和观点仅代表作者个人观点,不代表本平台的立场。作者对文章中的内容的准确性和完整性不承担任何责任。读者在使用文章中提供的任何信息时应自行判断和承担相应风险。

对于由于个人使用文章中提供的信息和工具所带来的任何直接或间接损失,包括但不限于因软件故障、网络中断、数据损失等,本平台和作者概不负责。

如您对本文或文章中的信息有任何疑问或异议,请及时与我联系,我将根据实际情况进行调整或删除。


逆向地址:aHR0cHM6Ly93d3cua2VqaW5zaG91LmNvbS9tL21haW4vaG9tZS80Ny80

一、逆向步骤

这是商品的查询页面,这里很明显这个lists的接口就是商品的查询接口了
在这里插入图片描述

先看一下请求的参数
在这里插入图片描述
大概看一下可以分析出来,有可能的加密逻辑为:根据timestamp和随机字符串生成nonce,再对整个参数体进行摘要,得到sign,这个sign的长度很明显可以看出不是通用的md5算法,接下来就是需要定位一下加密位置

在这里插入图片描述
首先出场的肯定是搜索大法了,
大部分情况下使用sign进行搜索都是不明智的行为,因为这个词的出现频率太高了,一般来说都是会得到一大堆的结果,结合上文猜测的加密逻辑,这里直接对nonce进行搜索,很幸运,只有两个结果,而且这两处都带有sign,所以十分的可疑,这里直接对这两处都下个断点试试

在这里插入图片描述下了断点之后下拉一下商品以触发新请求的加载,这里一下就断住了,大概看一下逻辑。很明显nonce的结果就是由这个 wu(u) 生成,而后再由 bu(c, s || “”, o, Cn) 生成sign,先看一下wu的逻辑

在这里插入图片描述很简单的一个逻辑,依次跟一下 fs、fe、nf几个算法就可以完成nonce的生成。
然后继续看一下sign,由上可知sign的加密需要c, s || “”, o, Cn四个参数的参与,这里在控制台打印一下看一下各个参数的结果
在这里插入图片描述

可以看的出来,c是请求体,其中带有nonce,o和Cn代表不同的平台和版本号,那么接下来看一下bu的逻辑
在这里插入图片描述整体的代码量并不多,大致抓一下重点,返回值由a取不同的位置加上变量c和u拼接而成,a由s,n,r拼接加密取md5,c,u由a参加计算而成,这里的逻辑比较简单,所以直接用python写一下算法就行了,就不nodejs来执行js了。,这样打包出来的程序就不用依赖与node了。

到这里就所有的逆向就完成了,接下来就是请求接口而后根据实际的需求对上架的账号进行监控了

欢迎 私信技术交流 v: remake2456

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的示例代码,用于调用一个API,其中AccessKey、sign、timestamp和nonce作为查询参数,hsPartyId作为标头,JSON作为请求正文: ``` import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.Random; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class ApiCaller { private static final String API_URL = "https://example.com/api"; private static final String ACCESS_KEY = "my_access_key"; private static final String SECRET_KEY = "my_secret_key"; private static final String HS_PARTY_ID = "my_hs_party_id"; public static void main(String[] args) throws Exception { String timestamp = String.valueOf(System.currentTimeMillis() / 1000); String nonce = generateNonce(); // 构造查询参数 Map<String, String> queryParams = new HashMap<>(); queryParams.put("AccessKey", ACCESS_KEY); queryParams.put("sign", generateSign(SECRET_KEY, timestamp, nonce)); queryParams.put("timestamp", timestamp); queryParams.put("nonce", nonce); // 构造标头 Map<String, String> headers = new HashMap<>(); headers.put("hsPartyId", HS_PARTY_ID); // 构造请求正文 String requestBody = "{\"key\":\"value\"}"; // 发送请求 String response = sendGetRequest(API_URL, queryParams, headers, requestBody); // 处理响应 System.out.println(response); } private static String sendGetRequest(String url, Map<String, String> queryParams, Map<String, String> headers, String requestBody) throws Exception { StringBuilder sb = new StringBuilder(url); if (!queryParams.isEmpty()) { sb.append('?'); for (Map.Entry<String, String> entry : queryParams.entrySet()) { sb.append(entry.getKey()).append('=').append(entry.getValue()).append('&'); } sb.deleteCharAt(sb.length() - 1); } HttpURLConnection conn = (HttpURLConnection) new URL(sb.toString()).openConnection(); conn.setRequestMethod("GET"); for (Map.Entry<String, String> entry : headers.entrySet()) { conn.setRequestProperty(entry.getKey(), entry.getValue()); } if (requestBody != null && !requestBody.isEmpty()) { conn.setDoOutput(true); conn.getOutputStream().write(requestBody.getBytes()); } BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); conn.disconnect(); return response.toString(); } private static String generateSign(String secretKey, String timestamp, String nonce) throws Exception { String message = timestamp + nonce; SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "HmacSHA256"); Mac mac = Mac.getInstance("HmacSHA256"); mac.init(keySpec); byte[] rawHmac = mac.doFinal(message.getBytes("UTF-8")); return Base64.encodeBase64String(rawHmac); } private static String generateNonce() { return String.valueOf(new Random().nextInt(1000000)); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值