duelist crackme 2 破解(上) (6千字)

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

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

作者    丁丁蝦  ddxia/[CCG]
目標     duelist crackme 2
目標URL    http:\\go.163.com\~ddxia\crackme\DueList\Due-cm2.zip
工具          SoftIce4.01 for NT  WinHex    winapi.hlp

    我們讀一下它的readme.txt,就知道這是一道解keyfile型別crackme。

    keyfile型別解決方法:
        1、得到檔名
        2、透過分析程式碼來獲得檔案內容!

    首先執行它,看看有什麼出錯訊息---->>"你的使用期限到了,請複製keyfile到

該目錄下!"。它要讀取檔案一定用CreateFileA這個API函式。於是在目標程式執行前下

中斷
    bpx CreateFileA
    被攔截下來,按F11回到程式程式碼中
001B:0040105C  6A00                    PUSH      00
001B:0040105E  686F214000    PUSH      0040216F
001B:00401063  6A03                    PUSH      03
001B:00401065  6A00          PUSH      00
001B:00401067  6A03                  PUSH      03
001B:00401069  68000000C0    PUSH      C0000000
001B:0040106E  6879204000      PUSH      00402079
001B:00401073  E80B020000    CALL      KERNEL32!CreateFileA
001B:00401078  83F8FF              CMP      EAX,-01
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果開啟檔案失敗,eax=-01
001B:0040107B  751D                  JNZ      0040109A 
001B:0040107D  6A00                  PUSH      00
001B:0040107F  6801204000      PUSH      00402001
001B:00401084  6817204000      PUSH      00402017
001B:00401089  6A00                    PUSH      00
001B:0040108B  E8D7020000      CALL      USER32!MessageBoxA
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>出錯資訊
001B:00401090  E824020000      CALL      KERNEL32!ExitProcess       

    讓我們看一下呼叫CreateFileA API的引數含義。

HANDLE CreateFile(

    LPCTSTR lpFileName,    // 指向檔名的指標
    DWORD dwDesiredAccess,    //讀寫模式
    DWORD dwShareMode,    // 共享模式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,    // 安全屬性指標
    DWORD dwCreationDistribution,    // 建立標誌
    DWORD dwFlagsAndAttributes,    // 檔案屬性
    HANDLE hTemplateFile     // 檔案屬性的複製控制程式碼
  );    

    其中我們最關心的是    LPCTSTR lpFileName這個引數。需要注意的是在API

的呼叫中ASM和高階語言是有區別的,最先出現的引數,ASM中最後PUSH。然後我們

就看出是以下這行程式碼是檔名指標
     PUSH      00402079
    d  402079           
                  看到什麼??-----due-cm2.dat----->>>keyfile的名字
    到目前我們就完成了第一步!

    接著我們進行下面一步進行挖掘檔案的內容,好象有的點觀看挖掘老山漢墓的

感覺 呵呵~~~~~~
    在目錄下建一個檔名字為due-cm2.dat,再跟蹤看一看是怎樣的情形。
001B:00401073  E80B020000    CALL      KERNEL32!CreateFileA
001B:00401078  83F8FF              CMP      EAX,-01
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果開啟檔案失敗,eax=-01
001B:0040107B  751D                  JNZ      0040109A 
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果成功,就跳到40109A

    然後看一看40109A的程式碼
001B:0040109A  6A00                  PUSH      00        //資料結構指標
001B:0040109C  6873214000    PUSH      00402173        //實際讀取的位元組數
001B:004010A1  6A46                    PUSH      46        //需要讀取的位元組數
001B:004010A3  681A214000    PUSH      0040211A        //存放內容的檔案指標
001B:004010A8  50                    PUSH      EAX                                  //檔案的控制程式碼
001B:004010A9  E82F020000    CALL      KERNEL32!ReadFile
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>返回引數為非零,就成功
    ReadFile API中需要注意的三個引數:402173    46      40211A

001B:004010AE  85C0                TEST      EAX,EAX
001B:004010B0  7502                  JNZ      004010B4
001B:004010B2  EB43                JMP      004010F7
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>出錯跳遠
001B:004010B4  33DB                XOR      EBX,EBX
001B:004010B6  33F6                  XOR      ESI,ESI
001B:004010B8  833D7321400012      CMP      DWORD PTR [00402173],12
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>檔案的位元組數是否大於12,

注意12是十六進位制=18,小於18個位元組就出錯!
001B:004010BF  7C36                JL        004010F7
001B:004010C1  8A831A214000        MOV      AL,[EBX+0040211A]
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>取每一個位元組進行比較
001B:004010C7  3C00                CMP      AL,00
001B:004010C9  7408                JZ        004010D3
001B:004010CB  3C01              CMP      AL,01
001B:004010CD  7501                JNZ      004010D0
001B:004010CF  46                    INC      ESI
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>ESI是累計01的個數
001B:004010D0  43                    INC      EBX
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>檔案偏移指標
001B:004010D1  EBEE              JMP      004010C1
001B:004010D3  83FE02            CMP      ESI,02
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>01的個數要大於等於2
001B:004010D6  7C1F                JL        004010F7
001B:004010D8  33F6                XOR      ESI,ESI
001B:004010DA  33DB                XOR      EBX,EBX
001B:004010DC  8A831A214000        MOV      AL,[EBX+0040211A]
001B:004010E2  3C00                CMP      AL,00
001B:004010E4  7409                JZ        004010EF
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>判斷是否到檔案尾部
001B:004010E6  3C01                CMP      AL,01
001B:004010E8  7405                JZ        004010EF
001B:004010EA  03F0                ADD      ESI,EAX
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>當不等於01和00的時候進行

累加
001B:004010EC  43                    INC      EBX
001B:004010ED  EBED              JMP      004010DC
001B:004010EF  81FED5010000        CMP      ESI,000001D5
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>當累加到1D5時,就跳轉,

否則出錯!!!
001B:004010F5  741D                JZ        00401114

001B:004010F7  6A00                PUSH      00
001B:004010F9  6801204000  PUSH      00402001
001B:004010FE  6886204000  PUSH      00402086
001B:00401103  6A00                PUSH      00
001B:00401105  E85D020000  CALL      USER32!MessageBoxA
             ^^^^^^^^^^^^^^^^^^^^^^^^^^------>錯誤資訊。
001B:0040110A  E8AA010000 CALL      KERNEL32!ExitProcess
    到這裡我們中場休息10分鐘,看看目前戰果如何?^_^
    1、檔案的長度至少18個位元組。
    2、檔案中01的位元組至少有2個。
    3、檔案中再遇到01位元組前,至少累加和為1D5。
    aa+aa+81=1d5 (十六進位制數字順便取)
    檔案內容至少是這樣 AA AA 81 01 01 00 00......湊夠18個位元組就行了

    下課了,3點俺要上班了,下回接著講啊!呵呵~~~~~~~~~~~~
    啊哦!!遲到了,沒有關係,領導不在!!呵呵~~~~~~~~~~~~
                時間:2000.10.17 15:02:33

相關文章