一丶簡介翻譯
根據上面所講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內存訪問異常.緣由是咱們這個地方的內存屬性.並非可執行的.因此會出現內存訪問同樣.咱們須要修改內存屬性才能夠.
不過上面所說已經完成了一個空白區添加代碼了.具體能夠本身嘗試.去找空白區便可.