要實(shí)現(xiàn)帶殼軟件直接打補(bǔ)丁,需要一些技巧和運(yùn)氣,雖然這看起來是很不容易實(shí)現(xiàn)的,其實(shí)并不象大家想的那么難,下面聽我慢慢道來。
要實(shí)現(xiàn)這種帶殼補(bǔ)丁的目的,當(dāng)然你需要作充分的前提條件:
過硬的軟件跟蹤與分析能力,因?yàn)槟銢]有軟件作者的源碼,一切都要靠自己動(dòng)手;
簡(jiǎn)單代碼編寫能力,當(dāng)然是匯編代碼,可以借調(diào)試軟件幫忙;
必備工具:PEiD、OllyDbg、W32DasM、文本編輯器(WinHex或UltraEdit或其它)、文件增肥工具(如:ZeroAdd)等;
任一編程平臺(tái),編寫補(bǔ)丁程序用(與使用漢化補(bǔ)丁類似);
最簡(jiǎn)單的加、減法運(yùn)算(Icefire:這也算一條?)。
作為練習(xí),下面以 LS定時(shí)器為例,看看如何帶殼編寫破解補(bǔ)丁。這個(gè)軟件提供如下功能:它可以根據(jù)你的設(shè)定在你需要的時(shí)候提醒你,防止你忘記重要的事情;它可以根據(jù)你的設(shè)定在你需要的時(shí)候運(yùn)行制定程序;各種提示都是可以是重復(fù)的,它可以每分鐘、每小時(shí)、每日、每天、每周、每月、每年的重復(fù)決不會(huì)怕麻煩;在某一時(shí)間,例如:2004年1月1日20點(diǎn)30分關(guān)機(jī);倒計(jì)時(shí)一定時(shí)間,例如:在2小時(shí)30分以后關(guān)機(jī);當(dāng)鍵盤和鼠標(biāo)沒有操作一定時(shí)間,例如:在你離開電腦30分鐘后關(guān)機(jī)。
該軟件未注冊(cè)時(shí)只能使用30天,30天過后只能注冊(cè)后才能使用。
初步準(zhǔn)備
首先使用PEiD探測(cè)得知,軟件使用了ASPack 2.12->Alexey Solodovnikov加的殼。這種殼脫殼也較為容易,特征標(biāo)志比較明顯。加了這種殼的軟件運(yùn)行時(shí),殼先自行釋放被加殼的軟件,然后將再運(yùn)行被加殼的軟件。我們只要找出釋放后、運(yùn)行前的位置,在這個(gè)位置跳到我們的補(bǔ)丁代碼處進(jìn)行補(bǔ)丁行動(dòng),補(bǔ)丁完成后返回,接著繼續(xù)軟件就完事了。
使用OllyDbg載入程序,不用運(yùn)行。向下滾動(dòng)代碼區(qū),直到找到如下代碼:
|
復(fù)制出來備用。在OllyDbg代碼區(qū)按住右邊的滾動(dòng)條向下拖動(dòng),直到底部的全0區(qū)域。在全0區(qū)域的前部,選一個(gè)偏移好記的位置。在代碼區(qū)雙擊,在彈出的編輯框中輸入任意一條匯編指令,如:RETN。
在OllyDbg中選擇這段代碼,點(diǎn)右鍵,在彈出的菜單中執(zhí)行“復(fù)制到可執(zhí)行文件——選擇部分(不同版本的OD這個(gè)菜單略有不同)”,在跳出的代碼框中點(diǎn)右鍵,并在彈出的菜單中執(zhí)行“保存文件”,另起一個(gè)名稱,保存?zhèn)溆茫楹?jiǎn)化計(jì)算,此過程必需)。
深入跟蹤
這里是個(gè)高強(qiáng)度的工作,你需要有足夠耐力和觀察分析判斷力。你沒有注冊(cè),又過了試用期。所以你必須找到所有的判斷注冊(cè)與否的關(guān)鍵跳轉(zhuǎn),并記錄下相關(guān)的代碼部分(該軟件使用的非可逆注冊(cè)算法,只能爆破)。通過尋找,會(huì)得到如下關(guān)鍵代碼處:
|
通過分析和試驗(yàn),發(fā)現(xiàn)需要將它們分別更改成為:
|
則軟件可以使用并且沒有任何限制。
制作模擬補(bǔ)丁
因?yàn)檫@里所說的補(bǔ)丁制作不是在軟件里直接完成,而是另用編程軟件制作,所以需要取得補(bǔ)丁的匯編級(jí)機(jī)器碼。又因?yàn)樯鲜鲂枰薷牡膮R編代碼的機(jī)器碼為:
|
其偏移地址分別為:
|
所以模擬補(bǔ)丁形如:
|
再在OllyDbg中下面的代碼區(qū)的全0區(qū)域的任意位置輸入上述匯編代碼,然后復(fù)制出對(duì)應(yīng)的匯編機(jī)器碼備用。在返回到偏移006083B0處,將JNZ SHORT LsDown.006083BA改為形如JMP 0060A310(你選定的位置),復(fù)制出機(jī)器碼備用。到此,模擬補(bǔ)丁代碼獲取工作完成。
編寫補(bǔ)丁程序
眾所周知,反匯編后的代碼位置的偏移與軟件經(jīng)過編譯后的物理偏移是不一樣的,要在殼外植入補(bǔ)丁需要取得對(duì)應(yīng)位置的物理偏移。我們這里需要兩處物理偏移,一處是對(duì)應(yīng)于JNZ SHORT LsDown.006083BA的,一處是補(bǔ)丁部分的起始位置,這就要借助于文本編輯器進(jìn)行。
用UltraEdit(或其它文本編輯器)打開前面保存的修改過的更名文件,使用查找功能查找hex:75 08 B8 01(對(duì)應(yīng)于JNZ SHORT LsDown.006083BA)。得到首地址為:000935B0h,記下備用,然后拉到文件的最后,查找添加的代碼位置(對(duì)應(yīng)RETN),得到首地址為:00095510h(視你選擇的位置不同而不同),記下備用,至此全部準(zhǔn)備工作完成。
做好上述準(zhǔn)備工作后,你就可以使用任一編程軟件來編寫你的補(bǔ)丁用程序了。
請(qǐng)注意我們所要做的工作:修改006083B0處的跳轉(zhuǎn);植入動(dòng)態(tài)補(bǔ)丁代碼和設(shè)置返回跳轉(zhuǎn),其余還應(yīng)該考慮版本檢測(cè)、原文件備份、提示幫助等問題。以下是我用 VB 編寫的主要部分代碼:
|
Icefire:細(xì)心的讀者可能注意到,這兩段代碼中所使用的首地址比我們記錄的首地址多1,這是因?yàn)閂B的最小指針單位是1而不是0,而文本編輯器等的最小指針單位是0,所以在不同編程平臺(tái)上編程時(shí)要多加注意。
編好補(bǔ)丁代碼后,將其編譯為可執(zhí)行程序,然后試試你的東西,看能否將帶殼的軟件打補(bǔ)丁而且正常工作!如果一切正常,那你就大功告成了。
后記
有時(shí),你可能想到要?jiǎng)e出心裁的在軟件中添加點(diǎn)屬于自己有個(gè)性的東西,比如警示框等等。那也不難,只要你知道彈出對(duì)話框需要什么條件、用到哪些代碼就可以做到的。例如:現(xiàn)在我想在軟件啟動(dòng)前彈出一個(gè)對(duì)話框。
我們?cè)撊绾巫瞿兀窟@個(gè)問題當(dāng)然要難一點(diǎn)。如果殼外有現(xiàn)成的對(duì)話框調(diào)用函數(shù),就可以簡(jiǎn)單地進(jìn)行調(diào)用。如果沒有則需要添加較多的代碼,這里就不講了,免得有騙稿費(fèi)之嫌。
總之,編寫補(bǔ)丁如同編寫一個(gè)軟件,同樣能實(shí)現(xiàn)自己的目的與愿望,展示自己的才華與智慧。個(gè)中樂趣只有親自品嘗之。