一个base64硬是没看出来....
还有就是标准版这个算t1-t5的过程已经是非常不友好了,
进阶版还有个两倍这么长的... 等待大佬的分析我看看结果就行了{:1_908:}
1. 调试分析
x32dbg载入,运行命令 bp GetDlgItem下断点,输入任意用户名和密码后点击Go
<!--more-->
程序顺利断下,可以看到程序使用SendMessage方式获取UserName和RegCode,并且判断是标准版or进阶版
之后,程序在call 0x00B25510之内进行详细的验证,将结果显示在Label上
进入func_verify函数,可以看到首先程序对UserName格式进行检查
然后检查UserName长度是否等于39
将输入的UserName转换大写
将输入的UserName末尾添加#字符并用#分割, 判断分割之后数目
将UserName分割后的得到的vector进行运算, 得到t1-t5
算法具体如下
用户名部分处理完毕, 进入RegCode处理部分
首先将RegCode进行一个类base64的解码
具体算法如下
判断解码后的RegCode的24-27位是否为’2018’, 28-31是否为0, 因此可以知道解码后至少为32位,
解码操作类似Base64, 四字节合并为三字节, 因此 RegCode 长度根据Base64算法
33/3 * 4 = 44位
最后的验证函数, 将UserName运算得到的t1-t5与解码后的RegCode进行运算
这实际是一个三元方程组, 需要根据t1-t5解出RegCode, 验证以及解密算法如下:
2. 算法流程
通过对验证流程的分析, 注册码验证流程如下
输入的UserName -> t1 t2 t3 t4 t5
输入的RegCode -> Base64(伪)解码得到32位 ->
a) 验证25-32 位是否为 “2018 x0x0x0x0”
b) 剩余24位看做三个int64整数, 与t1-t5运算
3. 程序实现
a) 输入合法用户名(39位) , 4位一组, “#”号分割, 计算出t1-t5,
b) 解方程算出xyz (3*int64, 共24位),
c) 实现此程序中Base64的Encode部分, 将xyz+2018+0编码, 得到RegCode
|