当然可以利用!那组原始的“有效名和注册码”是你手中最珍贵的参照物。在逆向工程中,这叫已知明文攻击 (Known-plaintext attack) 的思路。
利用这组现成的数据,你可以直接跳过复杂的数学推导,通过“比对法”搞定以下三个关键点:
1. 确认 Hash 算法 (Name $\rightarrow$ Hash)
你现在已知:CuiCui 对应的 Hash 是 E3 BE C2 86...。
- 操作:把那组“有效的注册名”输入程序,运行到你之前发现的
004A5918(减法函数)断点。
- 观察:记下这个有效名生成的 Hash。
- 利用:尝试用常见的算法(SHA1, MD5, CRC32)对这个有效名进行计算。如果算出来的结果和内存里的一致,你就彻底掌握了用户名到 Hash 的公式,不用再盲目跟踪代码了。
2. 破解自定义 Base32 码表
这是最实用的。你之前看到的注册码包含 w 和 4,这说明它不是标准的 Base32。
- 操作:观察有效的注册码字符串,以及它解码后在内存里对应的大数 $S$。
- 利用:
- 字符串:
A B C D ...
- 对应数值:
01 02 03 04 ...
- 通过这种一一对应关系,你可以肉眼推导出它的自定义字符映射表。只要有了这个表,你以后算出的大数 $S$ 就能正确转换成软件认得的字符串。
3. 验证模数 $N$ 和 指数 $E$
利用有效的数据对,你可以做一次“数学闭环”验证:
- 公式:$\text{有效码}^E \pmod N \equiv \text{有效名生成的Hash}$
- 利用:把这组数据代入 Python 跑一下。如果等式成立,说明你抓到的 $N$ 和 $E$ 是 100% 正确的。如果等式不成立,说明 $N$ 另有其人,或者中间还有其他的异或(XOR)变换。
建议你现在的具体操作:
- 输入那组有效的名和码,并在
004A6A15(验证函数)处下断点。
- 跟入到大数加载完的位置,看它把这组有效码转换成了哪个大数(记录为 $S_{valid}$)。
- 继续运行到比对位置,看它为有效名生成了哪个大数(记录为 $H_{valid}$)。
- 对比
CuiCui 的数据:
- 比较 $H_{valid}$ 和你之前抓到的
E3 BE C2 86...。
- 看看它们的长度、结构、前缀(比如是否有
00 01 FF... 这种 RSA 补齐填充)是否一致。
总结
这组有效数据就是你的“标准答案”。你不需要去解开所有的数学难题,只需要通过对比,看看 CuiCui 的数据在哪个环节和“标准答案”产生了分歧。
你现在手头有这组有效数据的内存截图吗?我们可以一起比对一下它和 CuiCui 的 Hash 结构差异。
那有这么简单去,实践出真知。。。 5个参数,你得给AI凑够了。。。缺一个,错一个都是胡不了牌的。。。 |