有時候我們在對目標程序注入後,並不像讓對方發現我們的dll,也就是為了避免被檢查出來,所以我們需要將dll資訊抹去,也就是從peb中的三根鍊錶中斷開儲存dll資訊的節點即可。
先看一下peb結構
kd> dt nt!_peb在peb的+0c處,有乙個叫ldr的字段,為什麼叫ldr,其實它是"loader"的縮寫,說到這裡,那也就知道了這個欄位是和dll載入有關係的。下來看一下結構體ptr32 _peb_ldr_data+0x000 inheritedaddressspace : uchar
+0x001 readimagefileexecoptions : uchar
+0x002 beingdebugged : uchar
+0x003 bitfield : uchar
+0x003 imageuseslargepages : pos 0, 1 bit
+0x003 isprotectedprocess : pos 1, 1 bit
+0x003 islegacyprocess : pos 2, 1 bit
+0x003 isimagedynamicallyrelocated : pos 3, 1 bit
+0x003 skippatchinguser32forwarders : pos 4, 1 bit
+0x003 sparebits : pos 5, 3 bits
+0x004 mutant : ptr32 void
+0x008 imagebaseaddress : ptr32 void
+0x00c ldr : ptr32 _peb_ldr_data
+0x010 processparameters : ptr32 _rtl_user_process_parameters
+0x014 subsystemdata : ptr32 void
+0x018 processheap : ptr32 void
0: kd> dt nt!_peb_ldr_data在其中最重要的就是標紅的三根鍊錶了,+0x000 length : uint4b
+0x004 initialized : uchar
+0x008 sshandle : ptr32 void
+0x00c inloadordermodulelist : _list_entry
+0x014 inmemoryordermodulelist : _list_entry
+0x01c ininitializationordermodulelist : _list_entry
+0x024 entryinprogress : ptr32 void
+0x028 shutdowninprogress : uchar
+0x02c shutdownthreadid : ptr32 void
inloadordermodulelist; 模組載入順序
inmemoryordermodulelist; 模組在記憶體中的順序
ininitializationordermodulelist; 模組初始化裝載順序
list_entry 結構是乙個雙向鍊錶
0: kd> dt nt!_list_entry這個雙鏈表指向程序裝載的模組,結構中的每個指標,指向了乙個+0x000 flink : ptr32 _list_entry
+0x004 blink : ptr32 _list_entry
ldr_data_table_entry
的結構:
0: kd> dt nt!_ldr_data_table_entry在+0x000 inloadorderlinks : _list_entry
+0x008 inmemoryorderlinks : _list_entry
+0x010 ininitializationorderlinks : _list_entry
+0x018 dllbase : ptr32 void
+0x01c entrypoint : ptr32 void
+0x020 sizeofimage : uint4b
+0x024 fulldllname : _unicode_string
+0x02c basedllname : _unicode_string
+0x034 flags : uint4b
+0x038 loadcount : uint2b
+0x03a tlsindex : uint2b
+0x03c hashlinks : _list_entry
+0x03c sectionpointer : ptr32 void
+0x040 checksum : uint4b
+0x044 timedatestamp : uint4b
+0x044 loadedimports : ptr32 void
+0x048 entrypointactivationcontext : ptr32 _activation_context
+0x04c patchinformation : ptr32 void
+0x050 forwarderlinks : _list_entry
+0x058 servicetaglinks : _list_entry
+0x060 staticlinks : _list_entry
+0x068 contextinformation : ptr32 void
+0x06c originalbase : uint4b
+0x070 loadtime : _large_integer
ldr_data_table_entry結構中有標紅的兩個字段比較重要,可以根據dllname來判斷是否為目標程序,如果是則把當前list_entry節點處斷開即可。
void hidemodule(char *szmodule)
hmodule hmod = getmodulehandlea(szmodule);
//得到ldr
ldr = *((dword **)((unsigned char *)peb + 0x0c));
//第一條鍊錶
flink = *((dword **)((unsigned char *)ldr + 0x0c));
p = flink;
do p = *((dword **)p);
} while (flink != p);
flink = *((dword **)((unsigned char *)ldr + 0x14));
p = flink;
do p = *((dword **)p);
} while (flink != p);
flink = *((dword **)((unsigned char *)ldr + 0x1c));
p = flink;
do p = *((dword **)p);
} while (flink != p);
}
如何隱藏DLL的匯出函式
估計有時你不想暴露所有的匯出函式,匯出乙個類有時候更是不安全的。以下這樣做是否可以?dll中定義乙個基類 class iinte ce 匯出類從這個基類派生 driver.h class cdriver public iinte ce driver.cpp void cdriver dfun1 vo...
如何隱藏DLL的匯出介面
如何你希望優化你 dll的最終生成大小,在每乙個匯出函式中使用noname屬性。增加了這個屬性表明你只希望保留 dll匯出表中順序,不希望讓別人看到你匯出的函式名。exports fnhideexportingfunctions 1 noname fnhideexportingfunctions1 ...
x32下的DLL隱藏
原理主要就是peb 中模組斷鏈.這裡整理下 原理可以看下另一篇我寫的帖子.dllmain.cpp 定義 dll 應用程式的入口點。include stdafx.h include include typedef struct unicode string unicode string typedef...