psde_demo_mj V1.4破解+演算法分析

看雪資料發表於2004-06-04

呵呵,看完前一篇了嗎?來,第二篇

【破解作者】 WXHing
【作者郵箱】 WXHing@163.com
【使用工具】 OllyDbg1.09
【破解平臺】 Win9x/NT/2000/XP
【軟體名稱】 psde_demo_mj V1.4
【下載地址】 中國共享軟體註冊中心
【軟體簡介】 這個是一個用來演示如何用PSDE製作視窗遊戲的軟體,起本身就是一個小遊戲,挺有意思的。
【軟體大小】 272Kb
【加殼方式】 註冊碼保護
【破解宣告】 初學破解,妄談破解,不當之處還請各位前輩指教!
--------------------------------------------------------------------------------
【破解內容】


首先用OLLYDBG裝載程式,F9執行,
輸入使用者名稱  WXHing
    試練碼  987654321
然後下斷點 bp GetDlgItem,確定,攔住,按F8直到這裡

00402E76    .  FFD3               call ebx                               ; \SendDlgItemMessageA            ;eax返回使用者名稱長度
00402E78    .  8B15 7C974000      mov edxdword ptr ds:[40977C]                                           ;從這裡出來 
00402E7E    .  52                 push edx                               ; /lParam => 12FA14
00402E7F    .  6A 10              push 10                                ; |wParam = 10
00402E81    .  6A 0D              push 0D                                ; |Message = WM_GETTEXT
00402E83    .  68 E9030000        push 3E9                               ; |ControlID = 3E9 (1001.)
00402E88    .  55                 push ebp                               ; |hWnd
00402E89    .  FFD3               call ebx                               ; \SendDlgItemMessageA              
00402E8B    .  A1 88974000        mov eaxdword ptr ds:[409788]         ;獲得使用者名稱,eax返回 
00402E90    .  8038 00            cmp byte ptr ds:[eax], 0               ;使用者名稱為空則出錯
00402E93    .  0F84 38010000      je PSDE_DEM.00402FD1                                                  
00402E99    .  8B0D 7C974000      mov ecxdword ptr ds:[40977C]         ;ecx指向試練碼
00402E9F    .  8039 00            cmp byte ptr ds:[ecx], 0               ;沒輸入則出錯
00402EA2    .  0F84 29010000      je PSDE_DEM.00402FD1
00402EA8    .  50                 push eax                               ;使用者名稱入棧
00402EA9    .  E8 22FEFFFF        call PSDE_DEM.00402CD0                 ;關鍵,跟進 
00402EAE    .  8B3D 7C974000      mov edidword ptr ds:[40977C]         ;edi指向試練碼
00402EB4    .  A1 88974000        mov eaxdword ptr ds:[409788]         ;eax為真正的註冊碼
00402EB9    .  83C4 04            add esp, 4
00402EBC    .  8BF7               mov esiedi
00402EBE    >  8A10               mov dlbyte ptr ds:[eax]                        
00402EC0    .  8ACA               mov cldl
00402EC2    .  3A16               cmp dlbyte ptr ds:[esi]              ;逐位比較註冊碼是否正確
00402EC4    .  75 1C              jnz short PSDE_DEM.00402EE2            ;不等則出錯
00402EC6    .  84C9               test clcl
00402EC8    .  74 14              je short PSDE_DEM.00402EDE
00402ECA    .  8A50 01            mov dlbyte ptr ds:[eax+1]
00402ECD    .  8ACA               mov cldl
00402ECF    .  3A56 01            cmp dlbyte ptr ds:[esi+1]
00402ED2    .  75 0E              jnz short PSDE_DEM.00402EE2            ;不等則出錯
00402ED4    .  83C0 02            add eax, 2
00402ED7    .  83C6 02            add esi, 2
00402EDA    .  84C9               test clcl
00402EDC    .^ 75 E0              jnz short PSDE_DEM.00402EBE
00402EDE    >  33C0               xor eaxeax
00402EE0    .  EB 05              jmp short PSDE_DEM.00402EE7
00402EE2    >  1BC0               sbb eaxeax
00402EE4    .  83D8 FF            sbb eax, -1
00402EE7    >  85C0               test eaxeax
00402EE9    .  0F84 8D000000      je PSDE_DEM.00402F7C
..............
..............


進入402EA9處的call,

00402CD0   /$  53                 push ebx                                    ;來到這裡
00402CD1   |.  56                 push esi
00402CD2   |.  57                 push edi
00402CD3   |.  8B7C24 10          mov edidword ptr ss:[esp+10]              ;edi指向使用者名稱
00402CD7   |.  32DB               xor blbl                                  ;bl清零
00402CD9   |.  8BCF               mov ecxedi                                ;ecx=edi
00402CDB   |.  8A07               mov albyte ptr ds:[edi]                   ;al取使用者名稱字元
00402CDD   |.  84C0               test alal                                 ;等於0嗎
00402CDF   |.  74 0A              je short PSDE_DEM.00402CEB                  ;為零則跳走
00402CE1   |>  02D8               /add blal                                 ;bl=bl+al
00402CE3   |.  8A41 01            |mov albyte ptr ds:[ecx+1]                ;al指向下一字元
00402CE6   |.  41                 |inc ecx                                    ;ecx指向下一字元
00402CE7   |.  84C0               |test alal                                ;取完了嗎
00402CE9   |.^ 75 F6              \jnz short PSDE_DEM.00402CE1                ;沒有則繼續
00402CEB   |>  A1 78974000        mov eaxdword ptr ds:[409778]
00402CF0   |.  33F6               xor esiesi
00402CF2   |.  A3 84974000        mov dword ptr ds:[409784], eax
00402CF7   |.  A1 74974000        mov eaxdword ptr ds:[409774]
00402CFC   |.  85C0               test eaxeax
00402CFE   |.  7E 2D              jle short PSDE_DEM.00402D2D
00402D00   |>  8A0C3E             /mov clbyte ptr ds:[esi+edi]             ;取使用者名稱字元
00402D03   |.  32CB               |xor clbl      ;cl與bl異或,存入cl,bl為使用者名稱字元16進位制和低位元組
00402D05   |.  51                 |push ecx                                      ;ecx入棧
00402D06   |.  E8 95FFFFFF        |call PSDE_DEM.00402CA0                         ;關鍵,跟進
00402D0B   |.  83C4 04            |add esp, 4
00402D0E   |.  88043E             |mov byte ptr ds:[esi+edi], al                                  
00402D11   |.  3C 0A              |cmp al, 0A                                   ;al>=0A嗎
00402D13   |.  0FBEC0             |movsx eaxal                                 ;擴充套件存入eax
00402D16   |.  7D 05              |jge short PSDE_DEM.00402D1D                   ;大於等於則跳
00402D18   |.  83C0 30            |add eax, 30                                   ;eax=eax+30
00402D1B   |.  EB 03              |jmp short PSDE_DEM.00402D20
00402D1D   |>  83C0 41            |add eax, 41                                    ;eax=eax+41
00402D20   |>  88043E             |mov byte ptr ds:[esi+edi], al                  ;計算結果返回並存入edi指向的地址,esi為計數器 
00402D23   |.  A1 74974000        |mov eaxdword ptr ds:[409774]                  ;eax=8
00402D28   |.  46                 |inc esi                                         ;esi=esi+1
00402D29   |.  3BF0               |cmp esieax                                    ;esi>8嗎?
00402D2B   |.^ 7C D3              \jl short PSDE_DEM.00402D00                      ;小於則繼續
00402D2D   |>  C60438 00          mov byte ptr ds:[eax+edi], 0
00402D31   |.  5F                 pop edi
00402D32   |.  5E                 pop esi
00402D33   |.  5B                 pop ebx
00402D34   \.  C3                 retn

進入402D06處的call,

00402CA0   /$  0FBE4424 04        movsx eaxbyte ptr ss:[esp+4]                     ;eax等於使用者名稱字元與使用者名稱字元和的異或值
00402CA5   |.  0305 84974000      add eaxdword ptr ds:[409784]                     ;eax=eax+989681 ,[409784]初始值為0x989881
00402CAB   |.  69C0 697DAE42      imul eaxeax, 42AE7D69                            ;eax等於eax*42ae7d69的低八位
00402CB1   |.  05 31D40000        add eax, 0D431                                     ;eax=eax+0d431
00402CB6   |.  A3 84974000        mov dword ptr ds:[409784], eax                     ;eax計算後的值存入[409784],下次迴圈時呼叫          
00402CBB   |.  C1F8 10            sar eax, 10                                        ;eax右移4位
00402CBE   |.  83E0 0F            and eax, 0F                                         ;eax=eax AND 0F
00402CC1   \.  C3                 retn                                     


以我的名字WXHing為例,字元16進位制和為57+58+48+69+6E+67=235,取低2位為35,

第一字元‘W’的變換
eax=57 xor 35 =62,
eax=62+[409784]=62+989681=9896E3
eax=9896E3*42AE7D69=27BEE7D48CBA1B,取低八位為D48CBA1B
eax=D48CBA1B+0D431=D48D8E4C , [409784]=D48D8E4C
eax=D48D8E4C SAR 10=D48D
eax=D48D AND 0F=0D  > 0A
所以eax=0D+41=4E,    轉換為字元是'N'

'X'的變換
eax=58 xor 35 =6D,
eax=6D+[409784]=62+D48D8E4C=D48D8EB9
eax=D48D8EB9*42AE7D69=375D5F23007DDEE1,取低八位為007DDEE1
eax=007DDEE1+0D431=007EB312 , [409784]=007EB312
eax=007EB312 SAR 10=007E
eax=007E AND 0F=0E  > 0A
所以eax=0D+41=4E,    轉換為字元是'O'

'H'的變換
eax=48 xor 35 =7D,
eax=7D+[409784]=7D+007EB312=7EB38F
eax=7EB38F*42AE7D69=2100A6FAD678A7,取低八位為FAD678A7
eax=FAD678A7+0D431=FAD74CD8 , [409784]=FAD74CD8 
eax=FAD74CD8 SAR 10=FAD7
eax=FAD7 AND 0F=07 < 0A
所以eax=0D+30=37,    轉換為字元是'7'

在向下我就不分析了,‘i’,‘n’,‘g’,分別轉換為‘9’‘6’‘6’,
因為註冊碼為8個字元,而使用者名稱‘WXHing’只有6個,所以要補上二個0,分別轉換為‘N’‘8’
將以上字元連在一起就是註冊碼‘NO7966N8’
收工!
--------------------------------------------------------------------------------
【破解總結】


這個軟體的保護很脆弱,還是採用明碼保護的,但是我主要是為了研究它的演算法,所以才羅裡羅嗦的寫了那麼一大篇。

最後還是非常非常的感謝您看完本文!
--------------------------------------------------------------------------------
【版權宣告】 本文純屬技術交流, 轉載請註明作者並保持文章的完整, 謝謝!

相關文章