[轉載]運行中的DLL自升級

  最近手頭有個需求:dll須要注入到某個進程常駐,該dll具有自我升級能力,當發現新的可用版本時,當即Free本身,加載新的。下面是一個實現方案:

    開啓一個監聽線程,從網絡上拉新的可用版本,下載放到一個臨時目錄,若是發現須要升級,則當即FreeLibrary自身,而後執行更新過程。
    因爲FreeLibrary以後當前模塊的內存區域已經無效,因此更新的過程使用一個單獨的線程,並將要更新過程的代碼經過shellcode的形式寫到分配的內存中執行。更新過程當中將會使用一些系統API函數,這裏不能直接經過函數名來調用,由於這樣會訪問導入表,而DLL此時已經Free掉了。因此事先經過準備一個參數傳遞給該線程,該參數有更新線程要用到的一些數據和地址:


    下面看看更新監聽線程如何工做以及如何準備這些參數:


    建立好更新線程後,本身得及時退出並Free本身(這樣更新線程才能把本身刪掉):


    下面看看更新線程如何工做:


    同Free本身模塊同樣,最後VirtualFree參數和當前代碼所佔內存頁面後,不能再回來,經過構建棧參數的形式,結束當前線程。這個函數編譯後的二進制指令保存到全局數組中:


下面是測試的效果(XP、Win7 32 &64均測試經過):


最後有幾個地方要說明的是:
一、  加載新的dll前要把臨時目錄下的文件刪除掉,防止出現遞歸循環更新過程。
二、  執行更新過程前須要判斷dll的版本信息,一樣是爲防止出現遞歸循環過程。


[公告]安全服務和外包項目請將項目需求發到看雪企服平臺:https://qifu.kanxue.comshell

上傳的附件:
相關文章
相關標籤/搜索