一種獲得文件大小的巧妙方法(談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偏移,返回結果就是從文件起始處開始算起到文件尾的偏移值, 就是文件大小。 其實,破解這個軟體是不需要脫殼的,破解它的自校驗也是沒有必要的,但是,這一種方法是我們應該學習的。 -------------------------------------------------------------------------------- |
所有時間均為台北時間。現在的時間是 09:52 PM。 |
Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.
『服務條款』
* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *