1. 程式人生 > >內嵌補丁練習二

內嵌補丁練習二

0x00 前言

 對於上篇所講的那個練習,PE檔案屬於執行時解壓縮檔案,而且檔案包含校驗和檢驗,如果直接修改程式碼可能得花點功夫了。對於這種情況我們可以使用內嵌補丁輕鬆解決。

 

 

由上圖我們知道要進行執行內嵌補丁,先得找到外殼程式跳往OEP的關鍵跳轉。上篇我們已經知道4018083處為跳往OEP的關鍵跳。

0x01  內嵌補丁編寫

  1. 首先我們要確定補丁位置。一般而言有三種方式。檔案空白區,擴充套件到最後位元組,新增新節區。我們先用PEviewer檢視.text節區情況。有下圖:

 

 

上圖我們知道text節區在檔案中的大小為

400h,而對映到記憶體的實際大小才為280h280h-400h的地方都是空白。我們就將補丁嵌入此區域。

 2.使用lordPE檢視imagebasetext區塊的起始地址。如下圖:

 

 

由上圖可知text對映到記憶體地址401280處為空白區域。跳轉至該處得到下圖:

 3.下面編寫內嵌補丁。

 

 

上圖紅框標註的地方就是我們今天要替換掉的內容,我們先找到字串位置。這是個messageBox我們直接執行至OEP處檢視傳遞的引數。如下圖:

 DialogBoxParamA函式的原型如下:

INT_PTR DialogBoxParamA(

  HINSTANCE hInstance,

  LPCSTR    lpTemplateName,

  HWND      hWndParent,

  DLGPROC   lpDialogFunc,

  LPARAM    dwInitParam

);其中lpDialogFunc用來指出DialogBoxParamA的顯示地址,這個就是顯示的內容的關鍵引數。由於彙編的入參是和從右到左,我們可以從上圖知道傳遞的引數是

4010F5。我們跳轉至該區域得到稍微往下翻就能的到下圖:

由上圖我們得到這幾個字串的地址分別為。40110A401141401123。我們等下就是要用自己的字串替換掉這幾個。

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,如下圖:

 

點選儲存,再點選原程式,正常執行!