Sorry,一直没有发觉,没贴完,续: (3千字)
* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:0044B633(C)
|
:0044B655 mov ecx, dword ptr [esp+1C]
:0044B659 mov byte ptr [esp+ecx+000002AC], 00
:0044B661 lea ecx, dword ptr [esp+00000090]
:0044B668 call 00407640 <==在EAX中返回4075E4处存储的值
:0044B66D mov edx, dword ptr [esp+28] <==取406FAE处存储的校验关键字
:0044B671 and edx, 000000FF
:0044B677 cmp eax, edx <==关键校验
:0044B679 jne 0044B6C9 <==失败则跳
:0044B67B mov eax, dword ptr [esp+0000031C]
:0044B682 mov dword ptr [004771C4], 002E8B00
:0044B68C test eax, eax
:0044B68E je 0044B69F
:0044B690 lea ecx, dword ptr [esp+000001DC]
:0044B697 push ecx
:0044B698 push eax
* Reference To: KERNEL32.lstrcpyA, Ord:0000h
|
:0044B699 Call dword ptr [0046712C]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044B68E(C)
|
:0044B69F mov eax, dword ptr [esp+00000320]
:0044B6A6 test eax, eax
:0044B6A8 je 0044B6B9
:0044B6AA lea edx, dword ptr [esp+00000241]
:0044B6B1 push edx
:0044B6B2 push eax
* Reference To: KERNEL32.lstrcpyA, Ord:0000h
|
:0044B6B3 FF152C714600 Call dword ptr [0046712C]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0044B6A8(C)
|
:0044B6B9 pop edi
:0044B6BA pop esi
:0044B6BB pop ebp
:0044B6BC mov eax, 00000001
:0044B6C1 pop ebx
:0044B6C2 add esp, 00000304
:0044B6C8 ret
第二遍运算结果的第4、5位包含了注册时申请连接的运算机台数,程序会将其由长整
数转换为ASC码,如果校验成功,这个码会显示在ABOUT窗口中。
注册成功后程序会将注册结果另行加密后存入注册表的HKEY_LOCAL_MACHINE\Software\
SPIS Ltd\TurboNote\Registration键中,并在REGISTER TURBONOTE+选项卡和ABOUT弹
出窗口中显示一个握手的图标、注册用户名和允许连接的计算机台数。
上面的校验过程程序会在程序加载、注册和ABOUT中多次重复进行。
好,现在总结一下:
TurboNote+的注册码限定在0-9、A-Z、a-z、“+”和“/”的有效值范围内,由以下部
分组成:
第一部分,4位,随机码。
第二部分,4位,经两遍运算可得出注册时申请连接的计算机台数。
第三部分,4位,随机码。
第四部分,4-36位,经两遍运算可得出用户给出的全注册名。
第五部分,4位,经一遍运算可得出由用户给出的注册名的累加和,允许末两位为
“==”。
注意:累加和只是以指定的算法求出的有限长度的前N位注册名的累加和。
运算模式一,用于第二部分和第四部分的第一遍运算以及第五部分的运算:
查表:
A(i) B(i) C(i) D(i)
↓ ↓ ↓ ↓
A'(i) B'(i) C'(i) D'(i)
四位ASC码一组:
((A'(i)<<6|B'(i))<<6|C'(i))<<6|D'(i)
得到的结果再以3位为一组:
P(i)Q(i)R(i)/0x100取余得R'(i)
(P(i)Q(i)R(i)/0x100)/0x100取余得Q'(i)
(P(i)Q(i)R(i)/0x100)/0x100取商得P'(i)
重组为P'(i)Q'(i)R'(i).
运算模式二,用于第二部分和第四部分的第二遍运算:
四位ASC码一组:
A(i)B(i)C(i)D(i) xor 0xff3f7fde
以上混合使用了算术表达和逻辑表达,只是为了较清楚地说明运算过程。这里:
<<6 等效于 *0x40
>>8 等效于 /0x100
运算模式三,用于求出计算累加和的有限长度的位数N
N = 第四部分求出的用户给出的全注册名长度减1后的能被3整除的最大数。
运算模式四,用于求出计算前N位注册名的累加和:
累加和 = 用户给出的全注册名前N位的累加和
校验:
经运算模式四计算出的累加和的末字节 = 对第五部分经运算模式二所得结果的末字节
由于N的算法的局限性,在REGISTER TURBONOTE+选项卡和ABOUT弹出窗口中显示的用户
名无法保证是全名,又由于TURBONOTE+不支持注册名中使用空格,所以显示出的用户名
有时会使你显得很尴尬。
用以上方法逆运算求出注册码:
用户名: Cubprisoner/FCG/
申请连接的计算机台数: 11
注册码: 006jNP8AN66AnQpdj6wWTJCwGk3QmDx40N5/iwUA
显示出的用户名: Cubprisoner/FCG
我用LCC-WIN32(一个小巧的C集成编译环境)写了一个窗口界面的注册机,在用户界面
友好方面做了一些改进,将另文发表。
