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