前幾天看見有全國電話通 1.07的貼子,其中說到記憶體中的註冊碼不一致,經過對全國電話通 Ver1.09的分析,得出了註冊演算法,也找到了註冊碼不一致的原因。
1、機器碼生成部分:
:00478D87 E8DC9CF8FF call 00402A68
:00478D8C 52 push edx
:00478D8D 50 push eax
:00478D8E 8D45EC lea eax, dword ptr [ebp-14]
:00478D91 E802F4F8FF call 00408198
:00478D96 8B45EC mov eax, dword ptr [ebp-14] eax=ASCII 997
:00478D99 8D4DF4 lea ecx, dword ptr [ebp-0C]
:00478D9C 5A pop edx
:00478D9D E85E33FBFF call 0042C100
:00478DA2 8B45F4 mov eax, dword ptr [ebp-0C] eax=ASCII 99
:00478DA5 E83EF4F8FF call 004081E8 eax=63(十六進位制的99)
:00478DAA 69C0D3020000 imul eax, 000002D3 eax=eax*2D3=11799
:00478DB0 05F9030000 add eax, 000003F9 eax=eax+3F9=11B92
:00478DB5 8D55F8 lea edx, dword ptr [ebp-08]
:00478DB8 E8EFF2F8FF call 004080AC 轉換成十進位制
:00478DBD 8B4DF8 mov ecx, dword ptr [ebp-08] ecx=ASCII 72594機器碼
:00478DC0 8D45FC lea eax, dword ptr [ebp-04]
* Possible StringData Ref from Code Obj ->"您的機器碼:"
2、註冊碼生成部分
:004786C8 E89BA3F8FF call 00402A68
:004786CD 52 push edx
:004786CE 50 push eax
:004786CF 8D85ECFDFFFF lea eax, dword ptr [ebp+FFFFFDEC]
:004786D5 E8BEFAF8FF call 00408198
:004786DA 8B85ECFDFFFF mov eax, dword ptr [ebp+FFFFFDEC] eax=ASCII 994
:004786E0 8D8DF4FDFFFF lea ecx, dword ptr [ebp+FFFFFDF4]
:004786E6 5A pop edx
:004786E7 E8143AFBFF call 0042C100
:004786EC 8B85F4FDFFFF mov eax, dword ptr [ebp+FFFFFDF4] eax=ASCII 99
:004786F2 E8F1FAF8FF call 004081E8 eax=63(十六進位制的99)
:004786F7 05F9030000 add eax, 000003F9 eax=eax+3F9=145C
:004786FC 69C0D3020000 imul eax, 000002D3 eax=eax*2D3=C4FD4(806868)真註冊碼十六進位制
總結如下:
註冊演算法:
註冊碼(十六進位制)=((機器碼(轉成十六進位制)-3F9)/2D3+3F9)*2D3
註冊後,在軟體安裝目錄生成檔案user.ini,內容如下:
[user]
username=coldeye 使用者名稱,可任意填寫,不參與校驗
usercode=806868 註冊碼(和機器有關)
由於軟體中生成註冊碼的時候採用浮點運算,有誤差存在,在破解過程中,eax的初值就有所不同,儘管略去最後一位,但還是有可能影響到最後生成的註冊碼。