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