內嵌補丁練習二
0x00 前言
對於上篇所講的那個練習,PE檔案屬於執行時解壓縮檔案,而且檔案包含校驗和檢驗,如果直接修改程式碼可能得花點功夫了。對於這種情況我們可以使用內嵌補丁輕鬆解決。
由上圖我們知道要進行執行內嵌補丁,先得找到外殼程式跳往OEP的關鍵跳轉。上篇我們已經知道4018083處為跳往OEP的關鍵跳。
0x01 內嵌補丁編寫
- 首先我們要確定補丁位置。一般而言有三種方式。檔案空白區,擴充套件到最後位元組,新增新節區。我們先用PEviewer檢視.text節區情況。有下圖:
上圖我們知道text節區在檔案中的大小為
2.使用lordPE檢視imagebase和text區塊的起始地址。如下圖:
由上圖可知text對映到記憶體地址401280處為空白區域。跳轉至該處得到下圖:
3.下面編寫內嵌補丁。
上圖紅框標註的地方就是我們今天要替換掉的內容,我們先找到字串位置。這是個messageBox我們直接執行至OEP處檢視傳遞的引數。如下圖:
DialogBoxParamA函式的原型如下:
INT_PTR DialogBoxParamA(
HINSTANCE hInstance,
LPCSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);其中lpDialogFunc用來指出DialogBoxParamA的顯示地址,這個就是顯示的內容的關鍵引數。由於彙編的入參是和從右到左,我們可以從上圖知道傳遞的引數是
由上圖我們得到這幾個字串的地址分別為。40110A,401141,401123。我們等下就是要用自己的字串替換掉這幾個。
4.再次跳往401280處編寫補丁得到下圖:
字串修改完畢折後需要跳轉至OEP處。但是還需修改一處:401083,這個地址本來是跳轉至OEP的,但是我們現在要讓他跳往我們的補丁位置。如下圖:
5.以為大功告成了嗎?直接這樣儲存的話肯定無法執行。我們先儲存下來執行以下試試。
儲存之後果然無法執行!那麼問題出在哪裡呢?接下來才是本次補丁最為關鍵的地方。我們都是知道地址為401007後面的大小為7F程式碼和004010F5下面的大小為154的區域都是加密的,其中我們的關鍵跳轉401083就在這塊被加密過一次的大小為7F的區域內!!假如我們直接把程式碼修改成jmp 401080,其機器碼為E9 81 01,儲存後這句程式碼執行時再被xor 7解密就變成了ee ff 06,解密後在執行這句程式碼肯定無法執行!所以我們應該現在hexworkshop中把程式碼修改為ee ff 06,這樣執行時經過解密操作程式碼恢復原狀了,這樣才能正常執行。我們用hexworshop開啟儲存後的檔案,找到該處的機器碼,修改為ee ff 06,如下圖:
點選儲存,再點選原程式,正常執行!