一種獲得檔案大小的巧妙方法(談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偏移,返回結果就是從檔案起始處開始算起到檔案尾的偏移值,
就是檔案大小。
其實,破解這個軟體是不需要脫殼的,破解它的自校驗也是沒有必要的,但是,這一種方法是我們應該學習的。