一種獲得檔案大小的巧妙方法(談QuickCHM2.49的自校驗方法) (4千字)

看雪資料發表於2003-02-09

一種獲得檔案大小的巧妙方法(談QuickCHM2.49的自校驗方法)

作者:lzrlzr
時間:2003年2月9日
信箱:lzrlzr_crack@163.com
主檔案QuickCHM.exe大小:1.35MB (1425920 位元組)

QuickCHM 2.49的破解有很多方法,並不太難(已經有很多序號產生器了),但它的自校驗方法,簡單巧妙,卻令人感到有趣,可見作者的一番用心。
QuickCHM.exe是用ASPACK 2.1壓縮過的程式,軟體脫殼後,執行時程式的主視窗一閃而過,程式自動退出,這是程式的自校驗啟動了。

下面這是我得到的程式自校驗的關鍵部分:

0167:004FC2A2  E80D09FAFF          CALL      0049CBB4
0167:004FC2A7  8B9564FEFFFF        MOV      EDX,[EBP-019C]
0167:004FC2AD  8B45F8              MOV      EAX,[EBP-08]
0167:004FC2B0  E8AF22F2FF          CALL      0041E564
0167:004FC2B5  8B45F8              MOV      EAX,[EBP-08]
0167:004FC2B8  8B10                MOV      EDX,[EAX]
0167:004FC2BA  FF12                CALL      [EDX]==========(1)====這個呼叫返回來的是檔案大小,
0167:004FC2BC  83FA00              CMP      EDX,00                為了知道軟體是如何得到檔案
0167:004FC2BF  7509                JNZ      004FC2CA              大小的,在此跟進
0167:004FC2C1  3D20A10700          CMP      EAX,0007A120==========EAX 中存放的是真正的檔案大小。
0167:004FC2C6  7610                JBE      004FC2D8              7A120H十進位制是500000,檔案大
0167:004FC2C8  EB02                JMP      004FC2CC              小低於或等於/不高於500000時,
0167:004FC2CA  7E0C                JLE      004FC2D8              自校驗透過,如果大於500000時,
0167:004FC2CC  A1405E5000          MOV      EAX,[00505E40]        程式會自動退出。
0167:004FC2D1  8B00                MOV      EAX,[EAX]
0167:004FC2D3  E8B803FAFF          CALL      0049C690


跟進(1)後,來到這裡:

0167:004098DC  55                  PUSH      EBP
0167:004098DD  8BEC                MOV      EBP,ESP
0167:004098DF  83C4F8              ADD      ESP,-08
0167:004098E2  53                  PUSH      EBX
0167:004098E3  56                  PUSH      ESI
0167:004098E4  8BF2                MOV      ESI,EDX
0167:004098E6  8BD8                MOV      EBX,EAX
0167:004098E8  8B4508              MOV      EAX,[EBP+08]
0167:004098EB  8945F8              MOV      [EBP-08],EAX
0167:004098EE  8B450C              MOV      EAX,[EBP+0C]
0167:004098F1  8945FC              MOV      [EBP-04],EAX
0167:004098F4  56                  PUSH      ESI==========ESI的值是 00000002H
0167:004098F5  8D45FC              LEA      EAX,[EBP-04]
0167:004098F8  50                  PUSH      EAX==========EAX的值是 007AF9CC
0167:004098F9  8B45F8              MOV      EAX,[EBP-08]
0167:004098FC  50                  PUSH      EAX==========EAX的值是 00000000
0167:004098FD  53                  PUSH      EBX==========EAX的值是 00000080 (檔案控制程式碼)
0167:004098FE  E82DD9FFFF          CALL      KERNEL32!SetFilePointer  函式共有四個引數。
0167:00409903  8945F8              MOV      [EBP-08],EAX===========EAX 中存放的是真正的檔案大小
0167:00409906  8B45F8              MOV      EAX,[EBP-08]          這裡是15C200H (1425920)
0167:00409909  8B55FC              MOV      EDX,[EBP-04]
0167:0040990C  5E                  POP      ESI
0167:0040990D  5B                  POP      EBX
0167:0040990E  59                  POP      ECX
0167:0040990F  59                  POP      ECX
0167:00409910  5D                  POP      EBP
0167:00409911  C20800              RET      0008


查 api手冊得到:

DWORD SetFilePointer(  //功能:在一個檔案中設定當前的讀寫位置

    HANDLE  hFile,    // Long,系統檔案控制程式碼
    LONG    lDistanceToMove,    // Long,位元組偏移量
    PLONG  lpDistanceToMoveHigh,    // Long,指定一個長整數變數,其中包含了要使用的一個高雙字偏移。可設為零 
    DWORD  dwMoveMethod     // Long,下述常數之一
  );

dwMoveMethod常數:
FILE_BEGIN    = 0  lOffset將新位置設為從檔案起始處開始算的起的一個偏移
FILE_CURRENT  = 1  lOffset將新位置設為從當前位置開始計算的一個偏移
FILE_END      = 2  lOffset將新位置設為從檔案尾開始計算的一個偏移


函式返回值 :Long,返回一個新位置,它採用從檔案起始處開始算起的一個位元組偏移量。

總結:

看到這裡,相信大家已經明白了這種方法的原理,就是用SetFilePointer函式把檔案指標移到檔案最後,
這時EAX中返回的就是檔案大小,再和一個數去比較,比較結果就是自校驗成功與否的標誌。

在這個軟體中,作者從檔案尾移動0偏移,返回結果就是從檔案起始處開始算起到檔案尾的偏移值,
就是檔案大小。

其實,破解這個軟體是不需要脫殼的,破解它的自校驗也是沒有必要的,但是,這一種方法是我們應該學習的。

相關文章