1. 程式人生 > >PE知識復習之PE文件空白區添加代碼

PE知識復習之PE文件空白區添加代碼

公式 技術 展開 執行 nbsp 地址 判斷 重要 兩個

          PE知識復習之PE文件空白區添加代碼

一丶簡介

  根據上面所講PE知識.我們已經可以實現我們的一點手段了.比如PE的入口點位置.改為我們的入口位置.並且填寫我們的代碼.這個就是空白區添加代碼.

我們也可以利用這個知識.實現PEDLL註入. 原理就是 修改入口. 跳轉到我們空白區執行我們的代碼.我們空白區進行重定位.調用Loadlibary. 並且load的是我們的DLL

實現功能就是 我們只要給PE註入了代碼.那麽這個PE程序一旦啟動就會加載我們的DLL

關於PEDLL註入,後面會有博客分類中會講解.此時首先講解怎麽在我們的空白區添加我們的代碼.

二丶空白區添加代碼的註意事項.

  在空白區添加代碼.首先就要熟悉匯編知識.因為我們添加的代碼都是機器碼.而機器碼是被翻譯成匯編指令.本質還是機器碼.

  還需要註意的是重定位技術. 比如 E9 對應匯編是JMP. 那麽後面跟著的是一個偏移. 偏移的計算公式 (目的地址 - 源地址 - JMP指令長度(5)) == 偏移.

這兩點熟悉了那麽下面就好辦了.

  空白區添加代碼的步驟:

1.尋找OEP所對應的文件偏移位置.

2在文件中修改OEP的指向.

3.指向我們的空白區

4.空白區添加我們的代碼.

三丶實戰空白區添加代碼

  1.尋找OEP所在的文件偏移位置

    首先隨便找一個文件,查看擴展頭中OEP RVA 以及 ImageBase, 並且換算出屬於哪個節.並且轉換為文件偏移.

例如下圖:

技術分享圖片

得出OEP RVA == 0x01104b 得出 ImageBase為 0x00400000 那麽內存中OEP開始位置就是 RVA +Imagebase == 0x1104b + 0x00400000 == 0x0041104b

  查看RVA屬於哪個節.

技術分享圖片

首先線觀看兩個節,第一個節 Textbss 在內存中的位置是0x1000開始,因為要判斷RVA >= 節.虛擬地址 && RVA <= 節.虛擬地址 + 節.節數據對齊後的大小 才可以.但是第一個節並沒有節對齊後的大小.所以不能斷定.

所以看第二個節,第二個節 text節. 內存中展開的虛擬地址是 0x011000 並且 節對齊後的大小是 0x00004E00 . 判斷RVA就是屬於這個節.所以算出差值偏移.,並且求出FOA位置

  RVA - 節.RVA == 差值偏移 0x1104b - 0x11000 == 0x4b 差值偏移為0x4b

差值偏移 + 文件偏移 == FOA 0x4b + 0x400 == 0x44b

那麽0x44b位置就是OEP的入口代碼執行處.

技術分享圖片

內存中查看代碼是否跟我們文件偏移代碼出一樣

技術分享圖片

可以看到OEP在內存中的地址位 0x0041104b.並且對應的代碼為 E9 400F0000 E9後面是一個偏移. 是目的地址 - OEP地址 - JMP指令長度(5) 得出的一個偏移.

  2.修改OEP指向

上面我們得到了OEP的位置.並且得出對應機器碼了. 那麽我們完全可以修改OEP的指向.指向我們的空白區位置.

比如指向PE文件中0x2開始的位置. 也就是 MZ成員後面的字節. DOS就兩個重要成員.其余的位置我們可以隨便使用.

因為E9後面是偏移. 所以我們要跳轉到PE中0x2的位置. 但因為PE在內存中展開的時候.是以Imagebase成員為基址進行展開的.所以我們要跳轉的位置是 0x00400002的位置.

計算一下偏移公式.

  目的地址 - 源地址 - 5 = 0x00400002 - 0x0041104b ==0xFFFEEFB2 得出偏移了.那麽我們在文件中OEP位置就可以進行修改了.

技術分享圖片 修改後. 註意是小端模式修改.

內存中查看修改後

技術分享圖片

可以看到OEP跳轉的位置為0x00400002位置.此時我們在0x400002位置.添加我們的代碼即可.

  3.空白區填寫我們的代碼

以前我們OEP跳轉的位置為 0x411f90 也就是這個位置是我們代碼開始執行位置. 此時我們OEP跳轉到了 0x00400002位置. 所以我們在0x400002位置添加我們的代碼

我們可以在空白區位置添加一個代碼,例如 C3 (ret)

技術分享圖片

內存中查看.是否跳轉的位置代碼執行是c3

技術分享圖片

已經更改為C3了. 那麽此時我們也可以自己進行重定位.繼續讓代碼跳轉到我們以前沒修改OEP指向的時候的位置.

以前的位置為 0x411f90 現在位置 0x400002

進行重定位

目的地址 -源地址 - JMP指令長度(5) ==0x11F89

所以我們在C3的位置改成E9 後面的偏移按照小端模式填寫到文件中即可.

技術分享圖片

運行我們的程序.看看代碼是否成功修改

技術分享圖片

確實代碼成功修改也能跳轉到我們原OEP代碼執行位置.

但是當x32dbg執行的時候.會出現C05內存訪問異常.原因是我們這個地方的內存屬性.並不是可執行的.所以會出現內存訪問一樣.我們需要修改內存屬性才可以.

不過上面所說已經完成了一個空白區添加代碼了.具體可以自己嘗試.去找空白區即可.

  

PE知識復習之PE文件空白區添加代碼