今天工作太忙了!好不容易才可以上來5分鐘---》duelist crackme 4 破解(上) (7千字)

看雪資料發表於2000-10-20

duelist crackme 4 破解      (希望轉載的時候保持完整)

作者    丁丁蝦  ddxia/[CCG]
E_mail        ddxia@263.net (如果Crackme教學文章中有錯,請來信:))
Web            http://go18.163.com/~ddxia
目標     duelist crackme 4
目標URL    http://go18.163.com/~ddxia/crackme/DueList/Due-cm4.zip
工具          SoftIce4.01 for NT    winapi.hlp 

    據readme.txt說,用秘密表的形式來進行加密,解起來有些困難。同時要做一個KEYGEN
    這次不用BPX MESSAGEBOXA 換一下口味!:)
    因為這次Crackme是要輸入USER/CODE,一定要經過變化才進行比較,所以在Crackme得到
假的USER/CODE時,把它斷下來。
    bpx getwindowtexta  ------啊哦!!沒有用!
    bpx getdlgitem      ------與DLG操作有都斷下來。
    結果按下check後,就給斷下來了,F11 然後再按F12 返回Crackme的程式碼空間
    用SICE截下如下程式碼,COME ON BABY!!分析程式碼哦!!非常的有趣的活哦!:)

:u 401127 L13d
001B:00401127  6A00                PUSH      00
001B:00401129  6A00                PUSH      00
001B:0040112B  6A0E                PUSH      0E
001B:0040112D  6A03                PUSH      03
001B:0040112F  FF7508              PUSH      DWORD PTR [EBP+08]
001B:00401132  E841020000          CALL      USER32!SendDlgItemMessageA

    SendDlgItemMessage這個API呼叫了四次,來我們看一看它到底有什麼用?

LONG SendDlgItemMessage(

    HWND hDlg,        // 對話方塊的控制程式碼
    int nIDDlgItem,    // 控制元件的ID號
    UINT Msg,        // 傳送的訊息
    WPARAM wParam,    // 第一個訊息引數
    LPARAM lParam     // 第二個訊息引數
  );
    從程式中我們可以知道當UINT Msg=E 時 是取輸入字元的個數
                當UINT Msg=D 時 是取輸入字元的內容
001B:00401137  A3AF214000          MOV      [004021AF],EAX
                  ^^^^^^^^^^^^^^^^^^^^^^^^---->取輸入USER的個數
001B:0040113C  83F800              CMP      EAX,00
001B:0040113F  0F84D5000000        JZ        0040121A
001B:00401145  83F808              CMP      EAX,08
001B:00401148  0F8FCC000000        JG        0040121A
                  ^^^^^^^^^^^^^^^^^^^^^^^----->檢查輸入個數是否
                                大於0小於8
001B:0040114E  8BF0                MOV      ESI,EAX
                  ^^^^^^^^^^^^^^^^^^^^^^^----->注意這個
001B:00401150  6A00                PUSH      00
001B:00401152  6A00                PUSH      00
001B:00401154  6A0E                PUSH      0E
001B:00401156  6A04                PUSH      04
001B:00401158  FF7508              PUSH      DWORD PTR [EBP+08]
001B:0040115B  E818020000          CALL      USER32!SendDlgItemMessageA
001B:00401160  83F800              CMP      EAX,00
001B:00401163  0F84B1000000        JZ        0040121A
001B:00401169  3BF0                CMP      ESI,EAX
001B:0040116B  0F85A9000000        JNZ      0040121A
                  ^^^^^^^^^^^^^^^^^^^^^^^------>比較user/code
                                 輸入的個數是否相等
                                 相等就繼續    
001B:00401171  6860214000          PUSH      00402160
001B:00401176  6A08                PUSH      08
001B:00401178  6A0D                PUSH      0D
001B:0040117A  6A03                PUSH      03
001B:0040117C  FF7508              PUSH      DWORD PTR [EBP+08]
001B:0040117F  E8F4010000          CALL      USER32!SendDlgItemMessageA
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->取的USER 放入402160    
001B:00401184  6879214000          PUSH      00402179
001B:00401189  6A10                PUSH      10
001B:0040118B  6A0D                PUSH      0D
001B:0040118D  6A04                PUSH      04
001B:0040118F  FF7508              PUSH      DWORD PTR [EBP+08]
001B:00401192  E8E1010000          CALL      USER32!SendDlgItemMessageA
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->取的CODE 放入402160
001B:00401197  B9FFFFFFFF          MOV      ECX,FFFFFFFF
001B:0040119C  41                  INC      ECX
001B:0040119D  0FBE8160214000      MOVSX    EAX,BYTE PTR [ECX+00402160]
001B:004011A4  83F800              CMP      EAX,00
001B:004011A7  7432                JZ        004011DB
001B:004011A9  BEFFFFFFFF          MOV      ESI,FFFFFFFF
001B:004011AE  83F841              CMP      EAX,41
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->41=‘A’                 
001B:004011B1  7C67                JL        0040121A
001B:004011B3  83F87A              CMP      EAX,7A
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->7A=‘z’
001B:004011B6  7762                JA        0040121A
001B:004011B8  83F85A              CMP      EAX,5A
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->41=‘Z’
001B:004011BB  7C03                JL        004011C0
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->這幾句程式碼是判斷
                                USER是否輸入了字元                    
001B:004011BD  83E820              SUB      EAX,20
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->全部轉化為大寫
001B:004011C0  46                  INC      ESI
001B:004011C1  0FBE9617204000      MOVSX    EDX,BYTE PTR [ESI+00402017]
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->在402017表相對應的
                                位置
001B:004011C8  3BC2                CMP      EAX,EDX
001B:004011CA  75F4                JNZ      004011C0
                  ^^^^^^^^^^^^^^^^^^^^^^^^----->表中找到後在去另一
                                40203C表去尋找對應
                                的值。
001B:004011CC  0FBE863C204000      MOVSX    EAX,BYTE PTR [ESI+0040203C]
001B:004011D3  898194214000        MOV      [ECX+00402194],EAX
001B:004011D9  EBC1                JMP      0040119C
:d 402017
0023:00402017 41 31 4C 53 4B 32 44 4A-46 34 48 47 50 33 51 57  A1LSK2DJF4HGP3QW
0023:00402027 4F 35 45 49 52 36 55 54-59 5A 38 4D 58 4E 37 43  O5EIR6UTYZ8MXN7C
0023:00402037 42 56 39 00                       BV9.

:d 40203c
0023:0040203C 53 55 37 43 53 4A 4B 46-30 39 4E 43 53 44 4F 39  SU7CSJKF09NCSDO9
0023:0040204C 53 44 46 30 39 53 44 52-4C 56 4B 37 38 30 39 53  SDF09SDRLVK7809S
0023:0040205C 34 4E 46 00                       4NF.


001B:004011DB  FF35AF214000        PUSH      DWORD PTR [004021AF]
001B:004011E1  6894214000          PUSH      00402194
001B:004011E6  6879214000          PUSH      00402179
001B:004011EB  E854000000          CALL      00401244
                  ^^^^^^^^^^^^^^^^^^^^^^----->比較子程式
                                  轉換後的值與CODE相比較

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
比較程式程式碼:(雖然簡單,但是有漏洞哦!:) 呵呵~~~ )
        當USER為一個字母的時候,CODE可以為任意字元 :)
        可以試一下 user:a /code:= 是可以的!!
        想一想,關鍵就在這個JCXZ      00401260的判斷
        不知道是作者故意的,還是BUG,自己去想吧 呵呵~~~~~~
:u 401244 L20
001B:00401244  C8000000            ENTER    0000,00
001B:00401248  B801000000          MOV      EAX,00000001
001B:0040124D  8B7D08              MOV      EDI,[EBP+08]
001B:00401250  8B750C              MOV      ESI,[EBP+0C]
001B:00401253  8B4D10              MOV      ECX,[EBP+10]
001B:00401256  F3A6                REPZ CMPSB
001B:00401258  67E305              JCXZ      00401260
001B:0040125B  B800000000          MOV      EAX,00000000
001B:00401260  C9                  LEAVE
001B:00401261  C20C00              RET      000C
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


001B:004011F0  83F801              CMP      EAX,01
001B:004011F3  0F84DEFEFFFF        JZ        004010D7
001B:004011F9  EB1F                JMP      0040121A
001B:004011FB  837D1001            CMP      DWORD PTR [EBP+10],01
001B:004011FF  0F8422FFFFFF        JZ        00401127
001B:00401205  837D1002            CMP      DWORD PTR [EBP+10],02
001B:00401209  752F                JNZ      0040123A
001B:0040120B  E8B4000000          CALL      KERNEL32!ExitProcess
001B:00401210  B801000000          MOV      EAX,00000001
001B:00401215  E9FFFEFFFF          JMP      00401119
001B:0040121A  6800200000          PUSH      00002000
001B:0040121F  6801204000          PUSH      00402001
001B:00401224  68AE204000          PUSH      004020AE
001B:00401229  6A00                PUSH      00
001B:0040122B  E836010000          CALL      USER32!MessageBoxA
001B:00401230  B800000000          MOV      EAX,00000000
001B:00401235  E9DFFEFFFF          JMP      00401119
001B:0040123A  B800000000          MOV      EAX,00000000
001B:0040123F  E9D5FEFFFF          JMP      00401119

                    時間:2000.10.19 20:99

相關文章