不脫殼破解ACDSee v3.0 trial build 1209(SMC初步,很詳細,國外文章) (8千字)

看雪資料發表於2001-10-04

破解ACDSee v3.0 trial build 1209

由於本人英語水平有限,文中不懂之處請參見原文:http://users.belgacom.net/blackb/acdsee.html

                                                                                            翻譯:大波羅

標題: Cracking
題目:Cracking
目標: ACDSee v3.0 trial build 1209
地址: http://www.acdsystems.com
作者: BlackB
日期: 2000-03-05
所用工具: SoftICE, Regmon, RegView, HIEW, Procdump
難度級別 (1-5): 3

寫在開始之前:
這篇文章僅以教授知識為目的。軟體生產者們花費大量時間用於編寫他們的程式。他們依靠賣軟體所得的錢生活,請購買正版軟體吧!!!

I. 導言:
嗨!又一篇文章。這次是ACDSee。注意在這篇文章中用到了一些更高階的Cracking技巧。更深的Cracking知識和Hiew的用法是必須的。如果你是一個新手,我建議你先讀一下這個站點的其它文章,如果你想做這些,那麼繼續吧。再次宣告,這篇文章是面向高階cracker們的!也就是需要有高深的crack知識。
II. 關於它的保護:
30天試用期/NAGscreen/ ASpacked/ anti-w32dasm
III. 讓我們開始吧:
好的,這將會是一段比較長而且不太容易的文章,我會盡力解釋。首先我來對要接觸的這的軟體作個小小的總結。
1.這個軟體被ASPack壓縮,所以我們必須手工解壓
2.不能用W32dasm發現它的保護,所以我們要用SoftICE對付它
3.EXE檔案在解壓後太大了,我將告訴你在不解壓的情況下打補丁的方法

安裝和執行程式。你會注意到無法輸入序列號,也就是,你無法註冊它,我們叫它試用版。當用反彙編時,W32dasm死鎖了…mmmm.。如果我們看一眼十六進位制編輯器,能發現(在開頭部分)一個.aspack的段!那告訴我們程式被壓縮了,所以讓我們來解開它。但是!!!等等!在你開始之前我將告訴你如何做。用SoftICE的symbol loader裝入壓縮的程式(它在裝入程式後就直接中斷了),開始透過程式碼跟蹤,直到你看到‘ret’指令和新的入口點(這點我將以後解釋)。然後讓程式無限迴圈,退出SoftICE和用prodump把整個過程dump下來。然後修復PE-header,意思是:將oep(原始入口點)寫入到你在解壓的過程之後發現的入口點。如果你沒弄清,沒有關係,以後我會做詳細解釋。

讓我們開始做吧。單擊“Open map”圖示,雙擊ACDsee.exe,然後點選“Load”…什麼!!??SoftICE沒有攔住!不要緊,可能是段已經設定了屬性為C00000020。那些在決定段屬性是隻讀,可寫等方面有一定的意義,總之,要使ACDSee中斷,我們要改變.text段的屬性為C00000040,怎麼做?啟動prodump,單擊“PE-editor”,裝載“acdsee.exe”,點選“sections”。右鍵點選.text段,點選“edit section”,改變C00000020為C00000040。點選ok退出。

現在可以用symbol loader裝入並且被中斷了,現在我們來透過解開的程式碼來跟蹤直到出現‘ret’指令。注意,我們將設定一些斷點離開SoftICE,直到再次被中斷,以便更好的跟蹤。否則那樣花費大量時間在跟蹤上。如果你還是不懂,那就先讀一下Volatility的關於手工脫殼的文章吧。

好了,當看到了‘ret’,你將看到:

0137:005554B4  OR        EBX,EBX
0137:005554B6  MOV      [EBP+00442E5C],EAX
0137:005554BC  POPAD
0137:005554BD  JNZ      005554C7              ß總是會跳
0137:005554BF  MOV      EAX,00000001
0137:005554C4  RET      000C
0137:005554C7  PUSH      004A33BF              ß這就是真正程式的開始處
0137:005554CC  RET

如果在執行完popad後你看一眼EAX,會是00555001。那就是我們的新入口點。注意,當你停在‘ret’指令上…停止跟蹤!現在我們要對程式脫殼了。這時如果退出SoftICE,ACDSee將執行,我們便不能脫殼了…所以讓我們在這裡作一些改動,如果退出ICE程式永遠迴圈。如何做到?輸入以下指令

a eip 按Enter鍵
jmp 5554CC按兩次Enter鍵

現在按ctrl-d,啟動procdump,捲動應用程式列表捲軸,你在列表末尾會看到ACDSee。在它上面單右鍵,再點選Dump full。取名為ACDunp.exe存檔,然後用PE-edit修改它的原來的入口點為新的入口點…但是…它已經是00555001…,那麼,我們不得不再作一些改變。不要忘記ACDSee仍然在迴圈…讓我們返回上一步吧:按ctrl-d,sice視窗又彈出,你將看見我們仍停在退出sice的位置,現在輸入:

a eip  按Enter鍵
ret 按兩次Enter鍵

按ctrl-d,ACDSee開始執行了,關閉它,執行ACDunp.exe。如果你每一步都做得很好,它將和ACDSee執行的結果一樣,注意到它比原始的.exe大了不少。

我試著反彙編解壓的.exe檔案,但是不行。讓我們再次拿出SoftICE來crack它吧。第一件要做的是破解它的試用版限制。我花了一段時間搜尋在那裡作比較,終於找到了。我不想告訴你其它許多沒有用的方法,但正確的方法是這樣:設斷點bpx getsystemtime,執行ACDSee,被SoftICE中斷,按F12五次就可得到比較點,可以看到下面:

:0137:00433A85 CMP EAX,-04 [<- 錯誤檢查]
:0137:00433A88 JNZ 00433AB4 [<-如果正確則跳]
..........
:0137:00433AB4 CMP EAX,-05[<- 過期了?]
:0137:00433AB7 JNZ 00433ACC [<- 如果過期了,不要跳,這裡讓它跳]
.........
[繼續跟蹤一段程式碼,直到…]
:0137:004045AD ADD ESP,04
:0137:004045B0 TEST EAX,EAX [<- 過期了?]
:0137:004045B2 JNZ 004045C6 [<- 如果過期了,不要跳]

因為要將JNZ 00433ACC 和 JNZ 004045C6 改為 JMP 00433ACC 和 JMP 004045C6。所以必須知道真實的偏移量。執行HIEW,裝入ACDunp.exe,按F4,按F3,向下移直到偏移量為401000.按F3你將看風401000變成了真實的偏移量:600。為了得到偏移00433AB7的真正偏移,讓我們來做些計算:43AB7-401000+600=330B7.所以真正的偏移量是3300B7。按F5,輸入330B7,就在這裡了,把JNZ改成JMP,將下一個也做同樣的改動。

哇!沒有過期提示了!

現在你是否注意到第一次執行ACDSee時,會顯示一個提示試用版本的對話方塊?而且如果你在同一天內執行多次,它也不再顯示?好吧,至少我是注意到了。開啟Regview看看登錄檔裡有沒有象“remind”的鍵值。ACDSee的鍵值在HKLM\SOFTWARE\ACD Systems\ACDSee\。讓我們來看一下。哈!看到了:EvalRemind!它的值代表了一月中的哪一天。它是這樣工作的:ACDSee儲存了你上一次使用它的時間。假設你在1-01-2000用了它,在EvalRemind儲存為‘01’。你睡一覺醒來再用它,就是2-01-2000,ACDSEE比較儲存的值‘01’和今天的日期‘02’…,當它不等的時候就會跳出“提示”視窗。 讓我們想想,更深地想想。我們可以在RegQueryValueExa上設斷點,但那將在等待這個程式被呼叫上千次上浪費許多時間,我們永遠找不到在何處讀EvalRemind。但是我以前說了什麼?每次你用了ACDSee後它將儲存天數在EvalRemind的值裡面…所以,大概用了RegSetValueExa來儲存。讓我們試一下:用symbol loader裝載ACDunp.exe,載入後設斷點在RegSetValueExa上。你能注意到這個API函式被呼叫了5次!其中有一次就是將日期存在了EvalRemind鍵上。我們如何找到的?用Regmon.執行Regmon,設定過濾器排除下列程式:iexplore;explorer;regmon。然後在執行ACDunp.exe,看看登錄檔的修改動作。到冗長的列表開頭(大約4500條動作,知道為什麼windows會這麼慢了吧?)查詢“setvalue”。你可以發現有五次……看看….第五次就是我們的EvilRemind鍵!!

再裝入ACDunp.exe,在RegSetValueExa上設斷點,當SoftICE視窗彈出第五次的時候,按F12兩次,退出子程式,你會看到:

:0137:00407BF2 CALL 00498670
:0137:00407BF9 JNZ 00407C12 <- 你在這裡

如果這裡跳了,就不在顯示提示框了。你能找得出來嗎?用跟蹤整個CALL和試著讀懂程式碼(正如我那樣),或在跳轉上設定斷點,改變系統時鐘再重新執行ACDunp.exe再看看發生了什麼嗎(將不會跳轉)?將JNZ改也為JMP,工作完成了!
做完了?好的,檔案尺寸現在變得很大,我們能否修改壓縮的檔案?是的,我們能!
讓我想想……!我們在程式解壓以前不能更改它,因為程式在壓縮時,我們要修改的指令不在那兒。沒問題,我們知道已解壓的程式的末尾(看看文章的前面),然後我們在ACDSee.exe發現一些空的區域以便來插入我們的補丁程式碼。你可以這樣做:用HIEW裝入ACDSee,exe,往下翻頁,再往下翻頁,再往下翻頁直到你發現你認為沒有用到的空間(象許多0000000十六進位制值)。現在小心了,因為一些這樣的“空間”是用來儲存沒有壓縮的資料。總之,我用了偏移量00556C25來插入補丁程式碼(真實偏移量是88025).怎麼做?

在解壓縮程式的末尾我們跳到00556c25(等於插入我們補丁程式碼的地方)
補丁程式碼被執行,讓它跳回解壓縮程式的末尾。
插入的程式碼象這樣:

PUSH 4A33BF //我們將不得不在解壓程式的末尾用NOP填充完這個指令,所以我們在這裡插入
PUSH EAX //儲存EAX暫存器
MOV AL, 0EB //把JMP的十六進位制程式碼(EB)放入AL
MOV [00433AB7], AL //改JNZ為JMP
MOV [004045B2], AL
MOV [00407BF9], AL
POP EAX //恢復EAX的值
JMP 005554CC //跳回解壓程式的末尾(我們將跳回‘ret’指令)

好了,這是第一次你開始用這種方法來crack,我能想象這有相當難度,跟我一步步的做:

用HIEW裝入ACDSee,exe

按F4,然後再按F3

按F5然後輸入“868BD”(到解壓程式碼末的JNZ,你在本文的開頭可出看到)

按F3(編輯)

按F2(插入彙編程式碼)

輸入“JMP 88025”(跳到我們插入程式碼的地方,注意要用真實的偏移地址)

輸入“NOP”

輸入“NOP”

按escape,按F9存檔

按F5輸入“88025”

按F3,然後按F2插入我上面的寫的程式碼(我們的補丁程式碼呈藍色)

再次注意:你要鍵入“JMP 868CC”而不是JMP 005554CC因為你必須用真實的偏移量!

按escape,按F9存檔。

為了讓事情更加清楚,這裡對以上步驟做個總結:
[end of unpacker code]

jmp inserted_code
back: ret
......(其它程式碼)......
inserted_code:
PUSH 4A33BF
PUSH EAX
MOV AL, 0EB
MOV [00433AB7], AL
MOV [004045B2], AL
MOV [00407BF9], AL
POP EAX
JMP back

很不錯,你成功了,如果你把每一件我告訴你的事做了,執行程式,它應該執行得很好:沒有過期提示,也沒有顯示提示對話方塊了!又一個目標被破解了!如果你發現了任何問題,不要猶豫寫信給我!


轉載請保持完整
大波羅
http://wdfdiablo.myetang.com
2001.10.3

相關文章