查看單個文章
舊 2003-12-12, 01:06 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 一種獲得文件大小的巧妙方法(談QuickCHM2.49的自校驗方法)

一種獲得文件大小的巧妙方法(談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偏移,返回結果就是從文件起始處開始算起到文件尾的偏移值,
就是文件大小。

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

--------------------------------------------------------------------------------
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次