2015-07-20 75 views
1

我需要通過PEB kernel32.dll中的地址,事情就變得複雜,當我試圖通過一個雙向鏈表,讓我_PEB_LDR_DATA結構的方式來訪問_LDR_DATA_TABLE_ENTRY結構,這些名單是這些:鏈接結構LDR PEB

+0x00c InLoadOrderModuleList : _LIST_ENTRY 
+0x014 InMemoryOrderModuleList : _LIST_ENTRY 
+0x01c InInitializationOrderModuleList : _LIST_ENTRY 

比方說InMemoryOrderModuleListy選擇列表LDR_DATA_TABLE_ENTRY需要訪問結構,已經通過弗林克顯示其結構如下進行:

0:000> dt ntdll!_LIST_ENTRY 
    +0x000 Flink   : Ptr32 _LIST_ENTRY 
    +0x004 Blink   : Ptr32 _LIST_ENTRY 

總之,不知道選擇列表會InMemoryOrd erModuleList並直接指向第一個輸入LDR_DATA_TABLE_ENTRY,因爲此列表是「LIST_ENTRY類型」Flink成員,偏移量爲0並指向該表。

這是我嘗試瞭解,獲得KERNEL32的地址代碼:

xor ebx, ebx   //clear ebx 
mov ebx, fs:[ 0x30 ] //get a pointer to the PEB 
mov ebx, [ ebx + 0x0C ] //get PEB->Ldr 
mov ebx, [ ebx + 0x14 ] //get PEB->Ldr.InMemoryOrderModuleList.Flink(1st entry) **here**  
mov ebx, [ ebx ]  //get the next entry(2nd entry) 
mov ebx, [ ebx ]  //get the next entry(3rd entry) 
mov ebx, [ ebx + 0x10 ] //get the 3rd entries base address(kernel32.dll) 

所指示的行放「這裏」是什麼讓我困惑的移動0x14的只有我倒是選擇類型的InMemoryOrderModuleList列表,但正如您在第一局中的註釋中所看到的那樣,通過放置Flink執行的操作。

我在等待您的確認,提前致謝!

回答

1

假設PEB在1000h。

的PEB的第一構件在此處列出,連同它們的地址在存儲器

typedef struct _PEB { 
    /* 1000h + 000h = 1000h */ BYTE Reserved1[2]; 
    /* 1000h + 002h = 1002h */ BYTE BeingDebugged; 
    /* 1000h + 003h = 1003h */ BYTE Reserved2[1]; 
    /* 1000h + 004h = 1004h */ PVOID Reserved3[2]; 
    /* 1000h + 00ch = 100ch */ PPEB_LDR_DATA Ldr; 
    ... 
} PEB, *PPEB; 

Ldr構件是指針,假設它指向2000H, 即該PEB_LDR_DATA位於在2000h。

來自MSDN

現在,PEB_LDR_DATA具有這種結構(許多成員的官方文檔中省略)

typedef struct _PEB_LDR_DATA { 
    /* 2000h + 000h = 2000h */ BYTE  Reserved1[8]; 
    /* 2000h + 008h = 2008h */ PVOID  Reserved2[3]; 
    /* 2000h + 014h = 2014h */ LIST_ENTRY InMemoryOrderModuleList; 
} PEB_LDR_DATA, *PPEB_LDR_DATA; 

正如你可以看到成員InMemoryOrderModuleList不是指針是結構,因此,所有的LIST_ENTRY的成員被嵌入到PEB_LDR_DATA結構中。
這意味着在InMemoryOrderModuleList的地址中有LIST_ENTRY的第一個成員,該成員是Flink,它位於2014h。

Here the expanded structure 

typedef struct _PEB_LDR_DATA { 
    /* 2000h + 000h = 2000h */ BYTE  Reserved1[8]; 
    /* 2000h + 008h = 2008h */ PVOID  Reserved2[3]; 
    /* 2000h + 014h = 2014h */ LIST_ENTRY InMemoryOrderModuleList; 
     /* 2000h + 014h = 2014h */ LIST_ENTRY* InMemoryOrderModuleList.Flink 
     /* 2000h + 018h = 2018h */ LIST_ENTRY* InMemoryOrderModuleList.Blink 
} PEB_LDR_DATA, *PPEB_LDR_DATA; 

注意,現在FlinkBlink成員指針

現在假設InMemoryOrderModuleList.Flink指向3000h。
在3000h有LIST_ENTRY結構,這是第一個條目。

假設這個結構Flink成員指向4000h,這是第二個條目。
假設這最後的結構Flink成員指向5000h,這是第三項。

現在除了PEB_LDR_DATA的列表頭之外,每個LIST_ENTRY實際上都是LDR_DATA_TABLE_ENTRY,這是可能的,因爲後者與前者具有兼容的存儲器佈局。
所以你到達了感興趣的條目,你可以訪問LDR_DATA_TABLE_ENTRY結構的成員。

由於第三項是在5000小時和LDR_DATA_TABLE_ENTRY具有這種佈局

typedef struct _LDR_DATA_TABLE_ENTRY { 
    /* 5000h + 000h = 5000h */ PVOID Reserved1[2]; 
    /* 5000h + 008h = 5008h */ LIST_ENTRY InMemoryOrderLinks; 
    /* 5000h + 010h = 5010h */ PVOID Reserved2[2]; 
    /* 5000h + 018h = 5018h */ PVOID DllBase; 
    ... 
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; 

的情況

Linked list layout

查看你的彙編代碼的醜陋MS畫圖圖片

xor ebx, ebx   //An useless instruction 
mov ebx, fs:[ 0x30 ] //get a pointer to the PEB 
;EBX is now 1000h 

mov ebx, [ ebx + 0x0C ] //get PEB->Ldr 
;This read from 100ch and EBX gets 2000h 

mov ebx, [ ebx + 0x14 ] //get PEB->Ldr.InMemoryOrderModuleList.Flink(1st entry) 
;This read from 2014h and EBX gets 3000h 

mov ebx, [ ebx ]  //get the next entry(2nd entry) 
;This read from 3000h and EBX gets 4000h 

mov ebx, [ ebx ]  //get the next entry(3rd entry) 
;This read from 4000h and EBX gets 5000h 

mov ebx, [ ebx + 0x10 ] //get the 3rd entries base address(kernel32.dll) 
;This read from 5010h, it seems that this DOES NOT read the correct member! 
;Should be at offset 18h 
0

這是因爲InMemory OrderModuleList列表是LIST_ENTRY類型,其第一個成員是Flink,其位移是0x00

0:000> dt ntdll!_LIST_ENTRY 
    **+0x000** Flink   : Ptr32 _LIST_ENTRY 
    +0x004 Blink   : Ptr32 _LIST_ENTRY 

nMemoryOrderModuleList是一個雙向鏈表,其第一個成員是弗林克和其排量爲0x00 ......這意味着,如果我在列表中選擇InMemoryOrderModuleList將直接在InMemoryOrderModuleList成員_LDR_DATA_TABLE_ENTRY表指出?而不是_LDR_DATA_TABLE_ENTRY表的開頭?

我很抱歉如果我不好懂英文,對不起