一種動態(tài)鏈接庫文件加載的方法及系統(tǒng)的制作方法
【技術領域】
[0001]本發(fā)明涉及動態(tài)鏈接庫領域,尤其涉及一種動態(tài)鏈接庫文件加載的方法及系統(tǒng)。
【背景技術】
[0002]關于動態(tài)鏈接庫文件的隱藏方法很多,如抹鏈的方法,可以讓動態(tài)鏈接庫文件從模塊鏈表中消失,但是在XT等工具在驅動層中還是可以查找到動態(tài)鏈接庫文件的蹤跡,隱藏效果不好。所述XT為XueTr,是一款廣受好評的操作系統(tǒng)管理工具,有進程、線程、進程模塊、進程窗口、進程內存信息查看、熱鍵信息查看,殺進程、殺線程、卸載模塊等功能。
[0003](I)遠程線程注入方法主要有兩種,一種是直接復制母體中預注入的代碼到目標進程地址空間,然后啟動注入的代碼,這種遠程線程一旦成功實現,那么它只出現在目標進程的內存中,并沒有對應的磁盤文件,隱蔽性看起來不錯,缺點就是,必須要在注入代碼中對所有直接尋址的指令進行修正,然而采用匯編手動修改過于繁瑣;
[0004](2)另一種更為常用的方法是注入一個dll文件到目標進程,這種方法的實現可以是以一個消息Hook為由進行注入,或者仍然使用代碼,這種方法的優(yōu)點是dll文件自帶重定位表,也就是說你不必再為修正直接尋址指令而煩惱了,dll自己會重定位!。但它的缺點就是可以用進程管理工具看見被加載的dll文件名、文件路徑。這樣就不太完美了,,因為只要用戶看看模塊列表很容易發(fā)現可疑模塊,得到dll的全路徑,dll文件就這樣暴露了。
【發(fā)明內容】
[0005]本發(fā)明所要解決的技術問題是:提供一種無痕加載的動態(tài)鏈接庫文件加載的方法及系統(tǒng)。
[0006]為了解決上述技術問題,本發(fā)明采用的技術方案為:
[0007]一種動態(tài)鏈接庫文件加載的方法,包括以下步驟:
[0008]S100、讀取一動態(tài)鏈接庫文件,將所述動態(tài)鏈接庫文件加載至預設的第一內存;
[0009]S200、檢查所述動態(tài)鏈接庫文件是否符合PE格式;若所述動態(tài)鏈接庫文件符合PE格式,則執(zhí)行步驟S300 ;否則結束步驟,反饋所述動態(tài)鏈接庫文件出錯;
[0010]S300、按照PE格式提取所述動態(tài)鏈接庫文件中的PE頭,將所述PE頭加載至預設的第二內存。
[0011]本發(fā)明采用的另一技術方案為:
[0012]—種動態(tài)鏈接庫文件加載的系統(tǒng),包括讀取單元、第一加載單元、檢查單元、提取單元和第二加載單元;
[0013]所述讀取單元,用于讀取一動態(tài)鏈接庫文件;
[0014]所述第一加載單元,用于將所述動態(tài)鏈接庫文件加載至預設的第一內存;
[0015]所述檢查單元,用于檢查所述動態(tài)鏈接庫文件是否符合PE格式;
[0016]所述提取單元,用于按照PE格式提取所述動態(tài)鏈接庫文件中的PE頭;
[0017]所述第二加載單元,用于將所述PE頭加載至預設的第二內存。
[0018]本發(fā)明的有益效果在于:
[0019]1、通過本發(fā)明提供的加載方法,加載動態(tài)鏈接庫文件比較隱蔽;因為其不是通過篡改PEB(PEB為進程環(huán)境塊,是一個保存了進程的相關信息的結構體)中LDR鏈的信息,把需要隱藏的模塊從LDR鏈表中摘除,達到隱藏的目地,而是直接把動態(tài)鏈接庫文件加載到內存,沒有留下任何蹤跡,通過OD和XT工具都查不出蹤跡;
[0020]2、在32位和64位系統(tǒng)上通過此加載方法加載動態(tài)鏈接庫文件比較穩(wěn)定;
[0021]3、有時游戲需要在R3應用層(Intel的CPU將特權級別分為4個級別:RING0、RINGl、RING2 和 RING3 ;ffindows 只使用 RINGO 和 RING3,RINGO 只給操作系統(tǒng)用,RING3 可以給操作系統(tǒng)和應用層都能用)對動態(tài)鏈接庫文件進行隱藏,防止被人利用找到動態(tài)鏈接庫文件的句柄,對動態(tài)鏈接庫文件進行非法操作;此加載方法可以實現讓動態(tài)鏈接庫文件加載基地址時不讓外掛動態(tài)獲取到。
【附圖說明】
[0022]圖1為本發(fā)明【具體實施方式】的動態(tài)鏈接庫文件加載的方法的流程圖;
[0023]圖2為本發(fā)明【具體實施方式】的動態(tài)鏈接庫文件加載的結構示意圖;
[0024]圖3為本發(fā)明【具體實施方式】的PE文件結構圖;
[0025]圖4為本發(fā)明【具體實施方式】的磁盤和內存中的PE文件結構對比圖;
[0026]標號說明:
[0027]10、讀取單元;20、第一加載單元;30、檢查單元;40、提取單元;50、第二加載單元。
【具體實施方式】
[0028]為詳細說明本發(fā)明的技術內容、所實現目的及效果,以下結合實施方式并配合附圖予以說明。
[0029]本發(fā)明最關鍵的構思在于:通過將符合PE格式的動態(tài)鏈接庫文件加載至第一內存,再將所述動態(tài)鏈接庫的PE頭加載至第二內存,實現PE加載。
[0030]請參照圖1,為本發(fā)明【具體實施方式】的動態(tài)鏈接庫文件加載的方法的流程圖,具體如下:
[0031]一種動態(tài)鏈接庫文件加載的方法,包括以下步驟:
[0032]S100、讀取一動態(tài)鏈接庫文件,將所述動態(tài)鏈接庫文件加載至預設的第一內存;
[0033]S200、檢查所述動態(tài)鏈接庫文件是否符合PE格式;若所述動態(tài)鏈接庫文件符合PE格式,則執(zhí)行步驟S300 ;否則結束步驟,反饋所述動態(tài)鏈接庫文件出錯;
[0034]S300、按照PE格式提取所述動態(tài)鏈接庫文件中的PE頭,將所述PE頭加載至預設的第二內存。
[0035]從上述描述可知,本發(fā)明的有益效果在于:
[0036]1、通過本發(fā)明提供的加載方法,加載動態(tài)鏈接庫文件比較隱蔽;因為其不是通過篡改PEB(PEB為進程環(huán)境塊,是一個保存了進程的相關信息的結構體)中LDR鏈的信息,把需要隱藏的模塊從LDR鏈表中摘除,達到隱藏的目地,而是直接把動態(tài)鏈接庫文件加載到內存,沒有留下任何蹤跡,通過OD和XT工具都查不出蹤跡;
[0037]2、在32位和64位系統(tǒng)上通過此加載方法加載動態(tài)鏈接庫文件比較穩(wěn)定;
[0038]3、有時游戲需要在R3應用層(Intel的CPU將特權級別分為4個級別:RING0、RINGl、RING2 和 RING3 ;ffindows 只使用 RINGO 和 RING3,RINGO 只給操作系統(tǒng)用,RING3 可以給操作系統(tǒng)和應用層都能用)對動態(tài)鏈接庫文件進行隱藏,防止被人利用找到動態(tài)鏈接庫文件的句柄,對動態(tài)鏈接庫文件進行非法操作;此加載方法可以實現讓動態(tài)鏈接庫文件加載基地址時不讓外掛動態(tài)獲取到。
[0039]進一步的,還包括步驟S400、根據所述PE頭更新基址信息,將所述動態(tài)鏈接庫文件的節(jié)信息加載至預設的第二內存;調整重定位表,加載所需要的動態(tài)鏈接庫文件的基址信息和調整導入表;根據節(jié)頭標記內存頁,節(jié)被標記為可丟棄。
[0040]進一步的,所述步驟S300具體為:按照PE對齊的方式(PE裝載器將PE文件裝入內存,每個PE節(jié)區(qū)以1000為對齊,改變各個節(jié)區(qū)的偏移地址。通常,一個PE文件在磁盤上的映像跟內存中的基本一致,但并不是完全的拷貝。Windows加載器會決定哪些部分需要加載,哪些部分不需要加載,而且由于磁盤對齊與內存對齊的不一致,加載到內存的PE文件與磁盤上的PE文件各個部分的分布都會有差異。)將所述PE頭加載至預設的第二內存。按PE對齊的方式加載是一個正常的處理流程,需要這樣才能讓代碼加載正確并可執(zhí)行。
[0041]進一步的,該方法具體包括:
[0042]步驟1、讀一個目標DLL文件到內存;
[0043]步驟2、內存加載目標DLL文件,具體包括:
[0044]步驟21、檢測目標DLL文件是否是正常的PE格式;
[0045]步驟22、目標DLL文件為PE格式的文件,PE頭位于PE文件中的偏移的某個位置,為DLL的PE頭分配以MEM_COMMIT標志的內存塊;
[0046]步驟23、把PE頭拷貝到分配的內存塊;
[0047]步驟24、PE頭更新imagebase信息;
[0048]步驟25、從目標DLL文件拷貝節(jié)信息到新分配的內存;
[0049]步驟26、調整重定位表;