Windows PE 第十三章 PE补丁技术
PE補丁技術
? ? 這章很多東西之前都見過,也單獨總結過,比如動態補丁里說的遠程代碼注入,還有hijack什么的。之前整理過的這里就不細說了,大體說下思路。這里總結一些之前沒總結過的東西。
? ? 資料中把補丁分為兩類,靜態補丁和動態補丁。然后有總結了下補丁的基本要素:進程通訊能力、良好的讀寫其他進程地址能力、正確識別要補丁目標進程、在其他進程地址空間執行代碼的能力。
進程通信:
管道通信(有名管道和匿名管道)、郵件槽、剪切板、共享內存、消息機制、socket等等具體細節概念請自行百度。
?
(1)動態補丁
讀寫進程內存:
OpenProcess()、ReadProcessMemory()、WriteProcessMemory()
也就是常用的代碼注入那一套:
OpenProcess()打開目標進程,獲取進程操作句柄。
VirtualAllocEx()在目標進程分配內存。
WriteProcessMemory()函數將遠程代碼寫入。
CreateProcessMemory()在目標進程中創建遠程縣城并執行。
[遠程線程注入記得所有引用都要拷貝進去,注意重定位問題,盡量不要使用全局變量,最好是直接在里面實現LoadLibrary和GetProcAddress或者直接把dll?load到目標進程里。]
其實還有很多,比如EIP注入,消息注入什么的。之前我系統的總結過,可以到我主頁上看下。
(2)整體替換PE文件:
?????比如通常的軟件升級,或者Hijack或者是輸入法注入再或者LSP注入等,都是屬于這一類。
軟件升級:
這個不解釋了,通常的軟件升級邏輯。下載升級包對應替換文件。這里有個地方可以注意,可以只替換需要替換的東西,減少流量損失,這種也用于安裝上。先裝上基本模塊,然后后續的陸續更新,或者惰性更新。這樣用戶體驗會相對好很多。
Hijack或者輸入法注入等:
這個很好理解,A想調用B.dll,我們分析下B.dll的導出函數,然后自己實現一個假的B.dll,直接替換本來的dll,如果是想要繼續注入后在調用原來的功能,可以在假的B.dll里調用原來的dll來計算值。類似與hook?和inlinehook。很簡單,不多說。
對了想起個事,做這類事情的時候注意一個問題,就是Windows默認的尋找dll的路徑順序,這個有的時候比較有用。
還有就是注意宿主進程加載dll的時候是靜態還是動態。靜態的話在運行過程中有可能無法替換相應dll。文件會被占用的。雖然有辦法強行基礎文件占用,之前我在驅動里弄過這個再或者直接調用微軟的相關程序強行結束掉句柄,但是并不能達到我們的效果。動態加載的可以隨時替換劫持dll.
?
(3)部分修改PE文件:
????直接修改PE相關機器碼,或者把自己的機器碼找個地方拷貝進去,通過需改入口地址執行我們的代碼,然后再跳轉回去原來的機器碼,這個姿勢之后的章節會細說。再或者干脆就直接把自己代碼拷貝覆蓋到入口地址處,同時也還可以這樣,在入口處直接jmp到我們的代碼,干完活在jmp回來。
程序入口
IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint
OK接下來?來一波測試,編寫一個程序。代碼如下:
運行則顯示:
看下入口地址:
?
注意上面的并不是main函數入口地址,是這個:
Main函數也是被別人調起來的。通過IDA看下就知道了。OK下載我想的是直接把入口地址換成main2,注意,之前也不是main,是main之前的一些函數。看下main2的地址:
相對RVA是0x1000,OK直接改FOA0x120的地方就行:
改完之后:
????OK上面的這些就是測試著玩玩,也就是說可以通過改變PE入口函數來修改相關邏輯。之后這個思路會用到。
后面還有一個內嵌機器碼到記事本的程序,明天會用單獨整理。
總結
以上是生活随笔為你收集整理的Windows PE 第十三章 PE补丁技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows PE 第十二章 PE变形
- 下一篇: Windows PE变形练手1-用PE自