Make your own free website on Tripod.com


解除 WinImp 的自校驗


聲明

個人可以自由轉載本文,不過應保持原文的完整性,並通知我;商業轉載先請和我聯繫。

本文沒有任何明確或不明確地提示說本文完全正確,閱讀和使用本文的內容是您自己的選擇,本人不負任何責任。

如果您發現本文有錯漏的地方,請您給我指出;如果有什麼不理解的,請您給我提出。

意見、建議和提出的問題最好寫在我的首頁 http://llf.126.com 的留言版上。

前言

最近知道,類似 WinImp 這樣的軟體有自校驗的功能,如果軟體被修改任何一個字節,都會出現出錯提示,從而不能進入軟體界面。這好像也是一個遙遠的回憶了,很久以前的軟體使用這種方法來檢測病毒,而且 pctools 自帶的查毒軟體就有一種功能,可以給任何軟體加上一個自檢測的外殼。不過,隨著 Windows 的流行,以前的病毒作者好像不習慣這種變化,像以前這種修改可執行檔案方式的 Windows 病毒幾乎絕跡,所以目前使用自校驗的程式也比較少,但是畢竟還有。另外,因為這並非為了加密,而只是檢測檔案安全性的手段,所以破解很簡單,我在這裡介紹一下,希望那些並不會編譯語系的同志們也可以看懂並且自行修改。

(除了這一類自校驗以外,我以前常用的是 Arj ,只要輸入「Arj i」,Arj 就進行自校驗,如果自校驗出錯的話,一般總是中了毒的。)

解除

我使用 WinImp 1.11 做例子。首先修改 winimp32.exe ,使之出現錯誤提示,我們見到一個消息框 (MessageBox) ,其中的提示為:

  The WinImp executable file has been modified during or after extraction. It may have been damaged by a disk or download error, or your computer may have a virus. Make sure your virus scanner is the latest version. You may need to download WinImp again.

現在,用 W32dasm 開啟 winimp32.exe ,然後保存,結果得到一個 winimp32.alf 檔案,關閉 W32dasm ,我們現在對 winimp32.alf 檔案進行分析。

用一個純文字編輯器開啟 winimp32.alf ,可以看到開頭的幾行是這樣的:

Disassembly of File: winimp32.exe
Code Offset = 00000400, Code Size = 0003BE00
Data Offset = 0003DE00, Data Size = 00012000

Number of Objects = 0006 (dec), Imagebase = 00400000h

 Object01: AUTO RVA: 00001000 Offset: 00000400 Size: 0003BE00 Flags: 60000020

在上面見到,藍色的部分說明此程式的基地址為 00400000h ,而綠色的部分說明它的代碼的實際地址和虛擬地址之間有 00001000h - 00000400h = 00000C00h 的差別,所以整體的可執行檔案中的偏移量和程式代碼中的偏移量的差別是 00400000h + 00000C00h = 00400C00h 。

現在,我們尋找在消息框中出現的純文字,因為不是殺毒軟體,所以出現 virus 的概率很低,尋找 virus ,發現和以上消息框同樣的字串,其前後的代碼如下:

:00430D45 E856A6FFFF call 0042B3A0
:00430D4A 3B051CD24400 cmp eax, dword ptr [0044D21C]
:00430D50 741C je 00430D6E
:00430D52 6A30 push 00000030

* Possible StringData Ref from Data Obj ->"WinImp"
 |
:00430D54 6830D24400 push 0044D230

* Possible StringData Ref from Data Obj ->"The WinImp executable file has "
 ->"been modified during or after "
 ->"extraction. It may have been damaged "
 ->"by a disk or download error, or "
 ->"your computer may have a virus. "
 ->"Make sure your virus scanner is "
 ->"the latest version. You may need "
 ->"to download WinImp again."
 |
:00430D59 68C0AE4400 push 0044AEC0
:00430D5E 6A00 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0048h
 |
:00430D60 2EFF150CD84300 Call dword ptr cs:[0043D80C]
:00430D67 B8FFFFFFFF mov eax, FFFFFFFF
:00430D6C EB65 jmp 00430DD3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00430D50(C)
|
:00430D6E A140384500 mov eax, dword ptr [00453840]
:00430D73 31C9 xor ecx, ecx

其中綠色的部分說明這一次調用 (Call) 的是 MessageBoxA ,正和我們的預測相同。MessageBoxA 有四個參數,所以上面也有四個 push 語句,不理會它。再向上,藍色的部分是比較語句 (cmp) ,而紅色的部分是條件跳轉語句 (在這裡是 je) ,那麼這次跳轉究竟跳到哪裡了呢 ? 就是最後紫色的 00430D6E 的位置,正好跳過這個 MessageBoxA ,而且在 00430D6E 之上的一句是跳轉 (jmp) 語句,更說明紅色的部分就是我們要修改的部分。

記下紅色部分的偏移量 00430D50 ,和總的偏移量差別進行運算,00430D50 - 00400C00h = 00030150h ,說明此代碼在可執行檔案的 00030150h 偏移處。用 UEdit 開啟 winimp32.exe ,跳到 0x30150 處,發現這裡就是代碼「je 00430D6E」 (741C) 所在的地方,je 就是 74 ,我們把它改成跳轉 jmp ,就是 eb ,所以就是把此處的「74」改成「EB」,儲存,執行,成功 !

如果不習慣計算偏移量,可以使用尋找的方法,在「741C」上面是「3B051CD24400」,就尋找「3B051CD24400」,發現只有一處,後面是「741C」,把「74」改成「EB」,儲存,執行,成功 !

這種方法只是簡單的跳過檢測,如果可以查到重新計算的數值,把它寫入可執行檔案的話,就仍然保留了原程式的病毒檢測功能,應該是比較完美的,不過這樣的話,一定要使用 Trw2000 ,要求就高了一些,如果有興趣的,可以一試 !

另類的完全破解

偉告訴我,用以上的方法破解,有一個問題,就是 WinImp 只能開啟 *.imp 檔案了 (也可以開啟 *.rar) ,對於原來支援的各種格式,比如 zip 現在都不支援了,這實在是不好,所以我又對它進行了分析,結果發現它進行了多次的自校驗,如果只是簡單的像上面那樣修改的話,就可能出現各種問題,但是因為它調用校驗的次數太多 (大約一百餘次) ,所以真的全部修改的話會非常繁瑣,想必非人力所能及,最後我終於想出一種完全破解的方法。

對於這種方法,因為需要太多的編譯語系的知識,所以我就不詳細講了,只簡單介紹一下原理。

WinImp 的自校驗在開始的時候先開啟自己 ( winimp32.exe ) ,並放進記憶體,然後的校驗都是對於這一塊記憶體進行的,我的方法是讓他開啟一個名為 winimp32.ex 的檔案,把此檔案放進記憶體進行校驗,這個 winimp32.ex 檔案就是原始的 winimp32.exe 檔案的副本,所以校驗一定會透過。

具體方法是,先把原始的 winimp32.exe 在同一目錄複製一份為 winimp32.ex ,然後修改 winimp32.exe 。修改方法是,尋找「68040100008D85F8FEFFFF50FF35101245002EFF1508D64300 BA000000808D85F8FEFFFFE8E348000089C183F8FF750AB8FBFFFFFF」,把它修改成「8D85F8FEFFFF506A7F50FF35101245002EFF1508D6430003442400 48C6000058BA00000080E8E248000089C183F8FF75096AFB5890」即可。

不過這種方法有一種限制,就是目標檔案的全路徑名不能長於 127 個字節,雖然大多數情況成立,但是畢竟是一種限制,如果用這種方法做中文化的時候,請一定在說明裡註明此問題。

下面附上對於上面修改的字節流的編譯代碼,如有興趣,不妨讀一讀,如果能把上面所說的 127 字節的限制取消的話,請一定通知我。

s
6804010000 push 00000104
8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8]
50 push eax
FF3510124500 push dword ptr [00451210]
2EFF1508D64300 Call dword ptr cs:[0043D608]
BA00000080 mov edx, 80000000
8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8]
E8E3480000 call 004355B1
89C1 mov ecx, eax
83F8FF cmp eax, FFFFFFFF
750A jne 00430CDF
B8FBFFFFFF mov eax, FFFFFFFB
E9F4000000 jmp 00430DD3

c
8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8]
50 push eax
6A7F push 7F
50 push eax
FF3510124500 push dword ptr [00451210]
2EFF1508D64300 Call dword ptr cs:[0043D608]
03442400 add eax,dword ptr[esp+0]
48 dec eax
C60000 mov byte ptr [eax], 00
58 pop eax
BA00000080 mov edx, 80000000
E8E2480000 call 004355B1
89C1 mov ecx, eax
83F8FF cmp eax, FFFFFFFF
7509 jne 00430CDF
6AFB push FB
58 pop eax
90 nop
E9F4000000 jmp 00430DD3

上面,s 部分表示原檔案中的編譯代碼,而 c 部分表示修改後的編譯代碼。

最後說一下,上一節介紹的方法對於其它進行自校驗的程式仍然很可能是可以的,下面這種方法只是用來對付像 WinImp 這種非常頑固的程式的。 :)

解除 127 字節限制

要解除上面所說的 127 字節的限制,主要的困難在於沒有空間,所以我把更下面的一段代碼也加入,從那裡得到了兩個字節,其編譯代碼如下:

s
6804010000 push 00000104
8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8]
50 push eax
FF3510124500 push dword ptr [00451210]
2EFF1508D64300 Call dword ptr cs:[0043D608]
BA00000080 mov edx, 80000000
8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8]
E8E3480000 call 004355B1
89C1 mov ecx, eax
83F8FF cmp eax, FFFFFFFF
750A jne 00430CDF
B8FBFFFFFF mov eax, FFFFFFFB
E9F4000000 jmp 00430DD3
A114D24400 mov eax, dword ptr [0044D214]
E8A7590000 call 00436690
A340384500 mov dword ptr [00453840], eax
85C0 test eax, eax
750A jne 00430CFC
B8FEFFFFFF mov eax, FFFFFFFE
E9D7000000 jmp 00430DD3

c
8D85F8FEFFFF lea eax, dword ptr [ebp+FFFFFEF8]
50 push eax
6804010000 push 00000104
50 push eax
FF3510124500 push dword ptr [00451210]
2EFF1508D64300 Call dword ptr cs:[0043D608]
03442400 add eax,dword ptr[esp+0]
48 dec eax
C60000 mov byte ptr [eax], 00
58 pop eax
BA00000080 mov edx, 80000000
E8DF480000 call 004355B1
89C1 mov ecx, eax
83F8FF cmp eax, FFFFFFFF
7508 jne 00430CDF
6AFB push FB
58 pop eax
E9F2000000 jmp 00430DD3
A114D24400 mov eax, dword ptr [0044D214]
E8A5590000 call 00436690
A340384500 mov dword ptr [00453840], eax
85C0 test eax, eax
7508 jne 00430CFC
6AFE push FE
58 pop eax
E9D7000000 jmp 00430DD3

其字節代碼也在其中,我就不再寫了,不過因為改起來非常麻煩,所以我提供了破解自校驗後的程式的下載,想中文化的話用這個破解版就可以了。

點睛工作室梁利鋒 結稿於 2000.7.12 (15 補充;16 再補充)



回教學