能力值:
( LV2,RANK:10 )
2 楼
个人的理解,到这一步 ,ecx内容作为第一个节点的内容,指向了第二个节点正好是kernel32
不知道有没有说清楚,仅供参考
能力值:
( LV2,RANK:10 )
3 楼
还要申明一点,本人并没有实践,不敢保证说对了,只是希望对楼主有所帮助。有时间到系统跑跑,跟踪一下最好了
能力值:
( LV2,RANK:10 )
4 楼
偶是菜鸟,言论有风险,相信需谨慎。
typedef struct _PEB_LDR_DATA // 7 elements, 0x28 bytes (sizeof)
{
/*0x000*/ ULONG32 Length;
/*0x004*/ UINT8 Initialized;
/*0x005*/ UINT8 _PADDING0_[0x3];
/*0x008*/ VOID* SsHandle;
/*0x00C*/ struct _LIST_ENTRY InLoadOrderModuleList; // 2 elements, 0x8 bytes (sizeof)
/*0x014*/ struct _LIST_ENTRY InMemoryOrderModuleList; // 2 elements, 0x8 bytes (sizeof)
/*0x01C*/ struct _LIST_ENTRY InInitializationOrderModuleList; // 2 elements, 0x8 bytes (sizeof)
/*0x024*/ VOID* EntryInProgress;
}PEB_LDR_DATA, *PPEB_LDR_DATA;
typedef struct _LIST_ENTRY // 2 elements, 0x8 bytes (sizeof)
{
/*0x000*/ struct _LIST_ENTRY* Flink;
/*0x004*/ struct _LIST_ENTRY* Blink;
}LIST_ENTRY, *PLIST_ENTRY;
xor edx, edx
mov ebx, fs:[edx + 0x30] ; ebx = address of PEB
mov ecx, [ebx + 0x0c] ; ecx = pointer to loader data
[COLOR="Red"] mov ecx, [ecx + 0x1c] ; ecx = first entry in initialisation order list[/COLOR]
mov ecx, [ecx] ; ecx = second entry in list (kernel32.dll)
在
mov ecx, [ecx + 0x1c] ; ecx = first entry in initialisation order list 之后,ecx指向的就是ntdll.dll的节点了,然后根据上面的数据结构,也就很自然找到kernel32的节点指针了。更简单的表述是“没有头结点的链表”。
可能有这个问题是被图3.4.1画的误导了,好吧~这句话当我没说
能力值:
( LV2,RANK:10 )
5 楼
有同感,但是还是需要验证一下,这样才能理解和记忆得深刻一些
能力值:
( LV2,RANK:10 )
6 楼
这一点疑问解决了