Inject集合 DLL隱藏

2021-10-06 02:53:01 字數 3805 閱讀 8195

有時候我們在對目標程序注入後,並不像讓對方發現我們的dll,也就是為了避免被檢查出來,所以我們需要將dll資訊抹去,也就是從peb中的三根鍊錶中斷開儲存dll資訊的節點即可。

先看一下peb結構

kd> dt nt!_peb

+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

在peb的+0c處,有乙個叫ldr的字段,為什麼叫ldr,其實它是"loader"的縮寫,說到這裡,那也就知道了這個欄位是和dll載入有關係的。下來看一下結構體ptr32 _peb_ldr_data

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...