feat(huya): OTP内部串池取证 - MsgRegSendSms协议标签现形(登录/注册请求加密器)+双钥相邻
This commit is contained in:
@@ -738,3 +738,10 @@ UdbAESUtilC1(…) + encrypt ← 后段
|
|||||||
### appSign (ed0db8) 明文族爆破 (复刻引擎 × 8 钥 × 19 材料 × 8 形态 = 零命中)
|
### appSign (ed0db8) 明文族爆破 (复刻引擎 × 8 钥 × 19 材料 × 8 形态 = 零命中)
|
||||||
- md5/sha1/sha256 摘要 16B、首尾 16B、双 md5、hex 编码等全灭
|
- md5/sha1/sha256 摘要 16B、首尾 16B、双 md5、hex 编码等全灭
|
||||||
- 结论: 明文 ≠ 简单材料哈希 — 可能是 config 解密产物 / 复合序列化 (下轮: OTP insert-pos 差分 + config 88B 解码路径)
|
- 结论: 明文 ≠ 简单材料哈希 — 可能是 config 解密产物 / 复合序列化 (下轮: OTP insert-pos 差分 + config 88B 解码路径)
|
||||||
|
|
||||||
|
## §11.24 OTP 内部字符串缓存池取证 (R2 前夜, 0x127ddbe0 1056B dump)
|
||||||
|
- 相邻 string 对象: key1(24B ZMHAV!) + "abc"(SSO) + "k"(SSO) + "ivx"(SSO) + key2(owNMia!) + ...
|
||||||
|
- **`MsgRegSendSms`(13) + `MsgResponceRegSendSms`(21) 协议标签现形** → OTP = 注册/登录
|
||||||
|
wup 请求加密器 (消息名入串池, 参与 md5/xxtea/AES 组合!) — 纯协议路线的关键拼图
|
||||||
|
- 各对象 = std::string (data/cap/len/ptr) 排布, 与§11.23 堆节点同区
|
||||||
|
- 下步: 消息名 + 请求字段序列化 进入 OTP 组合的完整还原 (md5_char16 输入=消息级结构)
|
||||||
|
|||||||
@@ -179,6 +179,20 @@ public class AesProbe {
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dumpRegion(String tag, long addr, long size) {
|
||||||
|
UnidbgPointer pp = UnidbgPointer.pointer(emulator, addr);
|
||||||
|
if (pp == null) { System.out.println("[dump] " + tag + " null"); return; }
|
||||||
|
byte[] buf = new byte[(int) size];
|
||||||
|
try { pp.read(0, buf, 0, buf.length); } catch (Throwable t) { System.out.println("[dump] " + tag + " err " + t); return; }
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < buf.length; i++) {
|
||||||
|
byte b = buf[i];
|
||||||
|
sb.append(String.format("%02x", b & 0xff));
|
||||||
|
if ((i + 1) % 16 == 0) sb.append(' ');
|
||||||
|
}
|
||||||
|
System.out.println("[dump] " + tag + " (" + size + "B): " + sb);
|
||||||
|
}
|
||||||
|
|
||||||
void scanMemoryForKeys() {
|
void scanMemoryForKeys() {
|
||||||
byte[] needle = "ZMHAVPRaxJ3MtXDjduUnXAKQ".getBytes(java.nio.charset.StandardCharsets.ISO_8859_1);
|
byte[] needle = "ZMHAVPRaxJ3MtXDjduUnXAKQ".getBytes(java.nio.charset.StandardCharsets.ISO_8859_1);
|
||||||
long[] ranges = {0x0L, 0x1000000L, 0x40000000L, 0x80000000L, 0x100000000L, 0x300000000L, 0x70200000L};
|
long[] ranges = {0x0L, 0x1000000L, 0x40000000L, 0x80000000L, 0x100000000L, 0x300000000L, 0x70200000L};
|
||||||
@@ -365,7 +379,8 @@ public class AesProbe {
|
|||||||
p.callOtp("1e8bdf7d4f7a01d3" + "13.4.22" + "1.0.80138" + "127.0.0.1" + "xiaomi", "ZMHAVPRaxJ3MtXDjduUnXAKQ");
|
p.callOtp("1e8bdf7d4f7a01d3" + "13.4.22" + "1.0.80138" + "127.0.0.1" + "xiaomi", "ZMHAVPRaxJ3MtXDjduUnXAKQ");
|
||||||
p.callOtp("5008" + "13.4.22" + "1.0.80138", "ZMHAVPRaxJ3MtXDjduUnXAKQ");
|
p.callOtp("5008" + "13.4.22" + "1.0.80138", "ZMHAVPRaxJ3MtXDjduUnXAKQ");
|
||||||
p.callOtp("ed0db8334cadd236c00cadf7e11ab5a5", "ZMHAVPRaxJ3MtXDjduUnXAKQ");
|
p.callOtp("ed0db8334cadd236c00cadf7e11ab5a5", "ZMHAVPRaxJ3MtXDjduUnXAKQ");
|
||||||
p.scanMemoryForKeys();
|
p.dumpRegion("0x127ddbe0", 0x127ddf00L, 0x420);
|
||||||
|
p.dumpRegion("0x127ddf00", 0x127ddf00L, 0x200);
|
||||||
p.emulator.close();
|
p.emulator.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user