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

 

 

 

一丶簡介翻譯

  根據上面所講PE知識.咱們已經能夠實現咱們的一點手段了.好比PE的入口點位置.改成咱們的入口位置.而且填寫咱們的代碼.這個就是空白區添加代碼.blog

咱們也能夠利用這個知識.實現PEDLL注入. 原理就是 修改入口. 跳轉到咱們空白區執行咱們的代碼.咱們空白區進行重定位.調用Loadlibary. 而且load的是咱們的DLL內存

實現功能就是 咱們只要給PE注入了代碼.那麼這個PE程序一旦啓動就會加載咱們的DLL博客

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

 

 

二丶空白區添加代碼的注意事項.擴展

  在空白區添加代碼.首先就要熟悉彙編知識.由於咱們添加的代碼都是機器碼.而機器碼是被翻譯成彙編指令.本質仍是機器碼.程序

  還須要注意的是重定位技術. 好比 E9 對應彙編是JMP. 那麼後面跟着的是一個偏移. 偏移的計算公式 (目的地址 - 源地址 - JMP指令長度(5)) == 偏移.im

這兩點熟悉了那麼下面就好辦了.技術

  空白區添加代碼的步驟:數據

    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內存訪問異常.緣由是咱們這個地方的內存屬性.並非可執行的.因此會出現內存訪問同樣.咱們須要修改內存屬性才能夠.

不過上面所說已經完成了一個空白區添加代碼了.具體能夠本身嘗試.去找空白區便可.

相關文章
相關標籤/搜索