现在发现,要想最快找到答案,还是得自己研究啊,高手们一般都没时间来回答我等小菜提出的问题啊!
经过仔细追踪,发现了算法部分,现分析如下,并给出注册算法:
0040B96E |. 8B75 08 mov esi, dword ptr [ebp+8] ; 取用户名
0040B971 |. 8B4D 0C mov ecx, dword ptr [ebp+C] ; 取用户名的长度n
0040B974 |. 8B45 10 mov eax, dword ptr [ebp+10] ; EAX=0
0040B977 |. BF 93010001 mov edi, 1000193
0040B97C |. 33DB xor ebx, ebx
0040B97E |> F7E7 /mul edi ; eax*=100193h
0040B980 |. 8A1E |mov bl, byte ptr [esi] ; username[i]
0040B982 |. 33C3 |xor eax, ebx ; eax^=username[i]
0040B984 |. 46 |inc esi ; i++
0040B985 |. 49 |dec ecx ; n--
0040B986 |.^ 0F85 F2FFFFFF \jnz 0040B97E
0040B98C |. 8985 68FFFFFF mov dword ptr [ebp-98], eax
上面的算法应该很简单,用C++描述一下如下:
ULONG64 x = 0;
for(int i=0; i<m_s1.GetLength();i++)
{
x = (x*0x1000193)^m_s1.GetAt(i);
}
这个x,就是程序计算到的注册码,只不过将它字串化了。