通过回调函数阻止进程创建(验证结束,方案完全可行)
(此方案完全可行,只是我忘掉了一步)
?
雖然Vista之后版本有進程創建回調函數的Ex版,而且Ex版可以攔截進程創建,
?
但是由于在Ex版回調函數內用第三個參數的最后一個元素來阻止進程創建的話,可能會出現彈框,所以不安全,所以這個方案可行性不高。
(這里說的不安全,是說可以被用戶層看到這個彈框,可以被發現,處理麻煩,如果是用戶自己設置的攔截,那么根本不需要通知用戶,如果是我們自己做攔截,就不該讓用戶發現,
不管怎么說,這個彈框都是不應該出現的。)
?
所以,我想了這個方案,不知道是否可行,先紀錄下這個方案。
?
步驟:
?
1:注冊進程創建回調,以及鏡像加載回調,普通版本就可以了,不需要Ex版,這樣從XP開始的所有版本就都兼容了。
?
2:當一個進程被創建的時候,進程創建回調會被調用,而且create參數應該為 1,
這時,紀錄進程的全部信息,保存在安全的位置(設備擴展),由于進程可能很多,所以需要用鏈表
要保存的信息包括,進程ID,進程文件路徑,以及一個進程創建標志flage,可以設置為0
?
3:進程創建回調被調用之后,緊接著被調用的就是鏡像加載回調,而第一個被加載的鏡像,就是那個可執行文件,
也就是說,當鏡像加載回調被觸發的時候,根據進程ID,去設備擴展里面的鏈表中找到這個進程ID,判斷它的flage是否為0
如果為0的話,修改flage為1,標志已經被處理過了(安全起見也可以判斷鏡像名字)
鏡像加載回調的第三個參數可以得到鏡像基址,根據基址,然后分析一下PE,得到OEP的RVA,加上基址,得到VA,
這里是重點,把VA的第一個字節數據記錄下來,保存在鏈表中,然后修改VA的第一個字節為 C3 ,也就是 retn
這樣,可以保證,進程的主線程剛剛啟動,就返回了
為什么要保存VA的數據,這就是下面說的
(一般來說,其實可以用類似 0x00400000 這種默認的建議加載地址來做判斷可執行文件的鏡像基址的,
但是這樣做不安全,因為可執行文件也可以有重定向表,這樣基址就是可變的了,所以還是需要用第一次加載的方式,來尋找可執行文件的鏡像基址)
?
4:由于執行進程創建回調、鏡像加載回調的時候,鏡像只是被映射到了內存,并不是被寫入到內存中的,所以對內存的修改會直接影響到可執行文件
這時,就要對原始文件做一個修復,
修復的時機就是在進程退出的時候,也就是進程加載回調第二次被調用的時候,也就是create參數為0的時候,根據當前進程ID,去設備擴展里面尋找進程路徑
根據分析PE文件,得到OEP的RVA,然后找到它的位置,修改第一字節,第一字節是什么?前面已經記錄下來了。
?
?
?
到此為止,一套使用進程回調來攔截進程的工作就完成了。
?
這只是個構想,不知道能否實現,準備驗證一下。
轉載于:https://www.cnblogs.com/suanguade/p/4080621.html
總結
以上是生活随笔為你收集整理的通过回调函数阻止进程创建(验证结束,方案完全可行)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实战分层架构
- 下一篇: OSPF 邻接关系建立