; find base addr of kernel32.dll
mov ebx, fs:[edx + 0x30] ; ebx = address of PEB
mov ecx, [ebx + 0x0c] ; ecx = pointer to loader data
mov ecx, [ecx + 0x1c] ; ecx = first entry in initialisation order list
mov ecx, [ecx] ; ecx = second entry in list
mov ebp, [ecx + 0x08] ; ebp = base address of kernel32.dll
怎么mov ecx,[ecx] 就可以得到链表的下个元素kernel32.dll
还有
find_functions:
pushad ; preserve registers
mov eax, [ebp + 0x3c] ; eax = start of PE header
mov ecx, [ebp + eax + 0x78] ; ecx = relative offset of export table
add ecx, ebp ; ecx = absolute addr of export table
mov ebx, [ecx + 0x20] ; ebx = relative offset of names table
add ebx, ebp ; ebx = absolute addr of names table
xor edi, edi ; edi will count through the functions
mov ecx,[ecx]
这个,我猜啊,应该是这样理解的:
mov ecx, [ecx + 0x1c] ; ecx = first entry in initialisation order list
这时ecx指向了initialisation order list 的第一个entry,这个entry的第一个内容就是下一个entry的指针,因此mov ecx,[ecx]就是从ecx中指向的那个地址的第一个dword,就能得到下一个entry的地址了