返回列表 发新帖

刚接到的单子,嫌贵就直接发出来了 登录RSA加密模拟

  [复制链接]

5

主题

386

回帖

1087

积分

高中生

Rank: 4

金币
595
好评
1
信誉
100
发表于 2026-1-13 22:16:28 | 显示全部楼层 | 阅读模式  来自 江苏


嗯,对方只呢个出几十元,太廉价,还是算了。直接发出来研究吧
apk也不想分析了,直接抓包

  1. POST https://api.gdvaluechain.com/api/member/login HTTP/1.1
  2. Accept-Encoding: gzip
  3. Authorization: Bearer
  4. Connection: Keep-Alive
  5. Content-Length: 344
  6. Content-Type: application/json
  7. Cookie: server_name_session=a8ff308697289d8e34c7554aa6d0b9cd
  8. Host: api.gdvaluechain.com
  9. encrypted: true
  10. user-agent: Mozilla/5.0 (Linux; Android 9; SM-S9280 Build/PQ3B.190801.10161937; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36 uni-app Html5Plus/1.0 (Immersed/24.0)

  11. enwagHRQ2PUrLkS7jCZNMt4FeIbK6UCGwk0Z1oWPgiOENfnzwMVxG970KbjGyeKpydKLZyc7bgWLbrqQecQMb/bG2CsJR1DJ5FnyjC9ndtrVUd+hBSDRBGZcJwpNQENFY93xKK4FwBNLyYic79On3GyI81ruHk9gQHkLcvPgINP/dCxwUoYTIUQ0VOzRbcdfY80cw3OItsHsT5xaFIpEYHN3aJUnjJFMhf6ZE3E+ZsLgZPr3zBEACL7Qi2ZVQXKQsnYsaiVy6OlYDjOzKhBEv/7GA48uAINGa1KEZ7xgUmYzOlOQuqtqPTd7MQSW/11aL/6xcx8Gg5sselW9xTUeRw==
复制代码


看这个请求就明白起码是base64吧。在看看长度,肯定不是对称算法。因为每次请求都不一样,所以怀疑是rsa算法。而且客户自己也说了是rsa算法。
rsa是没办法解密的,除非能拿到私钥

我们直接上工具,把内存数据拉下来看看

先导出证书看看,能不能找到rsa证书



遗憾,不是明文,还有函数。
那么,我们从其他方面入手,还是先查内存数据,我们输入的密码看看


有收货啊

我们换个关键词,查看下接口api看看 member/login


很好,我们除了发现了接口api以及请求数据外,最主要的是我们发现了js文件。
这个js文件我们抓包的时候没抓到,所以可以肯定是apk内部生成释放到本地或者内存中的

复制到code里自行查看

文档中阅读比较清晰。post请求,data:a
所以加密函数就是_i

在文档中继续搜索_i的定义处
内存数据里找到了
一眼看见rsa公钥



很奇怪的是我们第一步导出公钥到时候竟然没导出到,看来我们的神器还需要继续优化

那简单了,结合我们刚才内存数据中找到的加密前的数据构造,公钥也有了,直接构造模仿请求测试下就能真相大白啊

  1. import json
  2. import base64
  3. import math
  4. import urllib.parse
  5. import requests
  6. from Crypto.PublicKey import RSA
  7. from Crypto.Cipher import PKCS1_v1_5

  8. # ==========================================
  9. # 1. 配置部分
  10. # ==========================================

  11. # 目标 URL
  12. URL = "https://api.gdvaluechain.com/api/member/login"

  13. # 公钥 (从之前的 JS 代码中提取)    这里我就省略部分中啊哟内容了
  14. PUBLIC_KEY_STR = """MIIBIjANBgkqhkiG9x x xxxxxxxxxxxxxxxeD/wn1fQLCGXTAQaTvt1KNQ7vq9tA0WaKxq31oHVXcwWqftYjs1/qRl9P41TQwddKtoEk4+2LkrqM+6qObAfzUvH8V9TeEb5Yh9XqwoItR2XSTsBfiTt9NZ/zNRUsRlDXOCZNXU7xs44SA7xMttycqvd3ZvLk0RcpTM8mmnCvNQIDAQAB"""      

  15. # 格式化公钥为 PEM 格式
  16. PEM_PUBLIC_KEY = f"-----BEGIN PUBLIC KEY-----\n{PUBLIC_KEY_STR}\n-----END PUBLIC KEY-----"

  17. # 我们请求的原始数据构造
  18. payload_data = {
  19.     "mobile": "1327710x x xxx", //真实值隐藏下了
  20.     "password": "123456aa",
  21.     "version": "1.1.9"
  22. }

  23. # 请求头
  24. headers = {
  25.     "Host": "api.gdvaluechain.com",
  26.     "Connection": "Keep-Alive",
  27.     "Accept-Encoding": "gzip",
  28.     "Content-Type": "application/json",
  29.     "encrypted": "true",  # 【关键】告诉服务器这是加密数据
  30.     "Authorization": "Bearer",
  31.     "User-Agent": "Mozilla/5.0 (Linux; Android 9; SM-S9280 Build/PQ3B.190801.10161937; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36 uni-app Html5Plus/1.0 (Immersed/24.0)",
  32.     "Cookie": "server_name_session=a8ff308697289d8e34c7554aa6d0b9cd"
  33. }

  34. # ==========================================
  35. # 2. 加密函数 (完全复刻 JS 逻辑)
  36. # ==========================================
  37. def encrypt_payload(data_dict):
  38.     # 1. JSON 序列化 (去除空格,模拟 JSON.stringify)
  39.     # JS: JSON.stringify(e.data)
  40.     json_str = json.dumps(data_dict, separators=(',', ':'))
  41.    
  42.     # 2. URL 编码
  43.     # JS: encodeURIComponent(e)
  44.     # Python 的 urllib.parse.quote 默认会转义很多字符,需要指定 safe 列表来模拟 JS 的行为
  45.     # JS 不转义的字符: A-Z a-z 0-9 - _ . ! ~ * ' ( )
  46.     encoded_str = urllib.parse.quote(json_str, safe='~()*!.\'')
  47.    
  48.     # 3. 加载公钥
  49.     key = RSA.importKey(PEM_PUBLIC_KEY)
  50.     cipher = PKCS1_v1_5.new(key)
  51.    
  52.     # 4. 分段加密
  53.     # JS 逻辑: 每次取 117 个字符
  54.     chunk_size = 117
  55.     encrypted_chunks = []
  56.    
  57.     length = len(encoded_str)
  58.     # 计算分段数量
  59.     num_chunks = math.ceil(length / chunk_size)
  60.    
  61.     print(f"[debug] 原始字符串: {json_str}")
  62.     print(f"[debug] 编码后字符串: {encoded_str}")
  63.    
  64.     for i in range(num_chunks):
  65.         start = i * chunk_size
  66.         end = min((i + 1) * chunk_size, length)
  67.         chunk = encoded_str[start:end]
  68.         
  69.         # RSA 加密 (需要转成 bytes)
  70.         ciphertext = cipher.encrypt(chunk.encode('utf-8'))
  71.         
  72.         # 转 Base64
  73.         b64_text = base64.b64encode(ciphertext).decode('utf-8')
  74.         encrypted_chunks.append(b64_text)
  75.         
  76.     # 5. 拼接
  77.     # JS: return a.join("$split$")
  78.     return "$split$".join(encrypted_chunks)

  79. # ==========================================
  80. # 3. 发送请求
  81. # ==========================================

  82. # 执行加密
  83. final_body = encrypt_payload(payload_data)

  84. print(f"\n[debug] 生成的加密Body (前50字符): {final_body[:50]}...")
  85. print(f"[debug] Body总长度: {len(final_body)}")

  86. # 发送 POST 请求
  87. # 注意:虽然 Header 写的是 application/json,但根据抓包,实际发送的是纯文本 Base64 字符串,不是 JSON 对象
  88. try:
  89.     response = requests.post(URL, headers=headers, data=final_body, verify=True) # verify=False 如果你没有SSL证书链
  90.    
  91.     print("\n" + "="*30)
  92.     print(f"响应状态码: {response.status_code}")
  93.     print("="*30)
  94.     print("响应内容:")
  95.     try:
  96.         # 尝试解析响应 JSON
  97.         print(json.dumps(response.json(), indent=4, ensure_ascii=False))
  98.     except:
  99.         print(response.text)
  100.         
  101. except Exception as e:
  102.     print(f"请求发生错误: {e}")
复制代码

看到这个结果就知道我们成功了。又一例从内存数据中直接分析逻辑的案例

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
已有1人评分好评 金币 理由
mykeyoo + 1 + 1 老哥可以私我一下这个软件吗?抓取内存的.

查看全部评分 总评分:好评 +1  金币 +1 

回复

使用道具 举报

3

主题

3028

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
3331
好评
7
信誉
100

MT论坛最佳新人考神

发表于 2026-1-13 22:18:41 来自手机  | 显示全部楼层  来自 山西–运城–永济
看看隐藏
回复

使用道具 举报

5

主题

1332

回帖

4633

积分

大学生

Rank: 5Rank: 5

金币
2636
好评
1
信誉
100
发表于 2026-1-13 22:21:08 来自手机  | 显示全部楼层  来自 江苏
看看隐藏
回复

使用道具 举报

87

主题

3214

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1076
好评
22
信誉
105

考神MT论坛最佳新人MT论坛帅哥

发表于 2026-1-13 22:21:26 来自手机  | 显示全部楼层  来自 浙江
看看
回复

使用道具 举报

39

主题

1192

回帖

6448

积分

硕士生

孤儿

Rank: 6Rank: 6

金币
1109
好评
82
信誉
98
发表于 2026-1-13 22:22:10 来自手机  | 显示全部楼层  来自 四川
看看
回复

使用道具 举报

24

主题

4586

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4377
好评
7
信誉
91
发表于 2026-1-13 22:22:48 来自手机  | 显示全部楼层  来自 湖南
看看隐藏
回复

使用道具 举报

1

主题

1862

回帖

5383

积分

硕士生

Rank: 6Rank: 6

金币
4598
好评
1
信誉
102
发表于 2026-1-13 22:24:00 来自手机  | 显示全部楼层  来自 重庆
学习一下
回复

使用道具 举报

282

主题

4134

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
5852
好评
23
信誉
128

考神MT论坛新人MT论坛最佳新人MT论坛帅哥MT论坛活跃会员MT论坛灌水老大

发表于 2026-1-13 22:24:36 来自手机  | 显示全部楼层  来自 天津
路过看看
回复

使用道具 举报

43

主题

2043

回帖

5540

积分

硕士生

喵~

Rank: 6Rank: 6

金币
856
好评
7
信誉
103

考神MT论坛新人MT论坛最佳新人

QQ
发表于 2026-1-13 22:25:03 来自手机  | 显示全部楼层  来自 山西
看看隐藏喵
回复

使用道具 举报

0

主题

326

回帖

934

积分

高中生

Rank: 4

金币
522
好评
0
信誉
100
发表于 2026-1-13 22:26:41 来自手机  | 显示全部楼层  来自 山东
看看怎么样
回复

使用道具 举报

4

主题

1641

回帖

5352

积分

硕士生

初级

Rank: 6Rank: 6

金币
3029
好评
5
信誉
46
发表于 2026-1-13 22:31:13 来自手机  | 显示全部楼层  来自 山东
这个软件是干啥用的?
回复

使用道具 举报

1

主题

1362

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4104
好评
7
信誉
100
发表于 2026-1-13 22:42:21 来自手机  | 显示全部楼层  来自 广东
学习一下
回复

使用道具 举报

28

主题

388

回帖

2846

积分

大学生

Rank: 5Rank: 5

金币
296
好评
1
信誉
96

考神

发表于 2026-1-13 22:42:27 来自手机  | 显示全部楼层  来自 广东
咳咳咳
回复

使用道具 举报

1

主题

3656

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
7754
好评
24
信誉
241
发表于 2026-1-13 22:42:31 来自手机  | 显示全部楼层  来自 广东
看看隐藏
回复

使用道具 举报

3

主题

1192

回帖

3739

积分

大学生

Rank: 5Rank: 5

金币
5262
好评
0
信誉
100
发表于 2026-1-13 22:43:07 来自手机  | 显示全部楼层  来自 山西
学习 看操作
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表