標 題: 【原創】WinImage 7.0 序列號演算法
發帖人:lionel
時 間: 2005-01-20 13:36
詳細資訊:
TITLE : WinImage 7.0 序列號演算法
AUTHOR : lionel@nkbbs.org
WEBLOG : http://lionel.blogchina.com/
DATE : 01/19/2005
SOFTWARE : WinImage Version 7.0.7000
COMPANY : Gilles Vollant
HOMEPAGE : http://www.winimage.com/
CONTEXT : WinImage使用的序列號演算法應該是自創的,所以演算法比較簡單,只是對使用者
名進行了簡單的四則運算,每一個使用者名稱應該可以有10種不同的序列號可用,下面
是對使用者名稱進行運算的程式碼:
初始化時,ECX = 0,[EBP - 4] = 0x47694C
0044883C /MOV EAX,ECX ; eax = 0
0044883E |PUSH 0E
00448840 |CDQ ; edx = 0
00448841 |POP EBX ; ebx = 0x0E
00448842 |IDIV EBX ; edx = eax % ebx
00448844 |TEST EDX,EDX ; eax = eax / ebx
00448846 |JNZ SHORT winimage.0044884B
00448848 |PUSH 27
0044884A |POP ESI ; esi = 0x27
0044884B |LEA EAX,DWORD PTR DS:[ECX+3] ; eax = ecx + 3
0044884E |MOVZX EDX,BYTE PTR DS:[EDI+EAX] ; edx = user_name[ecx]
00448852 |IMUL EDX,ESI ; edx = edx * esi
00448855 |ADD DWORD PTR SS:[EBP-4],EDX ; [EBP-4] += edx
00448858 |PUSH 0E
0044885A |CDQ ; edx = 0
0044885B |POP EBX ; ebx = 0x0E
0044885C |IDIV EBX ; edx = eax % ebx
0044885E |TEST EDX,EDX ; eax = eax / ebx
00448860 |JE SHORT winimage.00448867
00448862 |LEA ESI,DWORD PTR DS:[ESI+ESI*2] ; esi = esi * 3
00448865 |JMP SHORT winimage.0044886A
00448867 |IMUL ESI,ESI,7 ; esi = esi * 7
0044886A |INC ECX
0044886B |CMP ECX,DWORD PTR SS:[EBP-8] ; [ebp-8] = strlen(user_name)
0044886E \JL SHORT winimage.0044883C
經過上述運算,如果user_name = "lionel"的話,那麼運算後[ebp-4] = 0x579453
程式在這裡還有一處判斷,就是[ebp-4] != 0xB8DCDD26,但我不清楚什麼使用者名稱能
算出來這種結果。
下面對剛算出來的結果進一步計算,總共有10步,但每一步的演算法都是一樣的:
這裡我們把剛剛算出來的結果記作val0 = 0x579453
0044887F PUSH DWORD PTR SS:[EBP+C] ; /val0
00448882 MOV ESI,DWORD PTR SS:[EBP+8] ; |
00448885 LEA EAX,DWORD PTR SS:[EBP-10] ; |
00448888 PUSH winimage.0045A2D0 ; |Format = "%lX"
0044888D PUSH EAX ; |buf
0044888E CALL DWORD PTR DS:[<&USER32.wsprintfA>] ; \wsprintfA
00448894 MOV AL,BYTE PTR SS:[EBP-10]
00448897 ADD ESP,0C
0044889A TEST AL,AL
0044889C JE SHORT winimage.004488BB
0044889E LEA ECX,DWORD PTR SS:[EBP-10]
004488A1 SUB ECX,ESI
004488A3 /CMP AL,38 ; if(al == '8')
004488A5 |JNZ SHORT winimage.004488AB ; al += 0x0A;
004488A7 |ADD AL,0A
004488A9 |JMP SHORT winimage.004488B1
004488AB |CMP AL,42 ; else if(al == 0x42)
004488AD |JNZ SHORT winimage.004488B1 ; al -= 0x0A;
004488AF |ADD AL,0F6
004488B1 |MOV BYTE PTR DS:[ESI],AL
004488B3 |INC ESI
004488B4 |MOV AL,BYTE PTR DS:[ECX+ESI]
004488B7 |TEST AL,AL
004488B9 \JNZ SHORT winimage.004488A3
其實上面的運算就是把 val0中的 8替換成B,把 B換成 8,然後與輸入的序列號進
行比較;如果不相等,那麼val1 = val0 + 0x14051948,再進行上面的替換,然後
比較;如果還不相等,那麼val2 = val1 + 0x17061954,再進行上面的替換,然後
比較;算上第一次,總共是比較了10次,這10次中,每次加上的常量分別是:
0x00000000 0x14051948 0x17061954 0x10051981 0x40111995
0x20611997 0x12091999 0x16062004 0x21042002 0x13062004
大家可以看出,後面 4位竟然都是年份!我覺得這很可能是對前幾個版本序列號的
相容,或者說著幾個年份對Gilles Vollant公司有什麼特別的意義,呵呵。
下面是我根據以上演算法寫的keygen,算出來的序列號是第一次比較就能透過的。
http://xs.blogchina.com/upload/2005...41006881133.zip