能力值:
( LV3,RANK:20 )
|
-
-
2 楼
64位和32位概念上一致,除使用GS段外,其它基本上是偏移不同,
64位时取PEB指针:
mov rax,gs:[0x30]
mov rax,gs:[rax+0x60]
mov PEB,rax
64位PEB定义
+0x0, unsigned char, InheritedAddressSpace
+0x1, unsigned char, ReadImageFileExecOptions
+0x2, unsigned char, BeingDebugged
+0x3, unsigned char, BitField
+0x8, void *, Mutant
+0x10, void *, ImageBaseAddress
+0x18, struct _PEB_LDR_DATA(0x79) *, Ldr
...
64位_PEB_LDR_DATA定义
+0x0, unsigned long, Length
+0x4, unsigned char, Initialized
+0x8, void *, SsHandle
+0x10, struct _LIST_ENTRY(0x8), InLoadOrderModuleList
+0x20, struct _LIST_ENTRY(0x8), InMemoryOrderModuleList
+0x30, struct _LIST_ENTRY(0x8), InInitializationOrderModuleList
+0x40, void *, EntryInProgress
64位_LDR_DATA_TABLE_ENTRY定义
+0x0, struct _LIST_ENTRY(0x8), InLoadOrderLinks
+0x10, struct _LIST_ENTRY(0x8), InMemoryOrderLinks
+0x20, struct _LIST_ENTRY(0x8), InInitializationOrderLinks
+0x30, void *, DllBase
+0x38, void *, EntryPoint
+0x40, unsigned long, SizeOfImage
+0x48, struct _UNICODE_STRING(0x4b), FullDllName
+0x58, struct _UNICODE_STRING(0x4b), BaseDllName
+0x68, unsigned long, Flags
+0x6C, unsigned short, LoadCount
+0x6E, unsigned short, TlsIndex
+0x70, struct _LIST_ENTRY(0x8), HashLinks
+0x70, void *, SectionPointer
+0x78, unsigned long, CheckSum
+0x80, unsigned long, TimeDateStamp
+0x80, void *, LoadedImports
+0x88, struct _ACTIVATION_CONTEXT(0x159) *, EntryPointActivationContext
+0x90, void *, PatchInformation
通过以上信息,你应可以得到模块列表了,过程和32位是一样的。
“在32位系统下得到的所有dll模块,是不是和64位系统下一样阿”,怎么会一样呢?至于说"这些模块都是什么时候链到peb下的",加载数据中没有记录时间,但通过InLoadOrderLinks可以得到加载顺序。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
[QUOTE=半道出家;714481]64位和32位概念上一致,除使用GS段外,其它基本上是偏移不同,
64位时取PEB指针:
mov rax,gs:[0x30]
mov rax,gs:[rax+0x60]
mov PEB,rax
64位PEB定义
+0x0, unsigned char, InheritedA...[/QUOTE]
那在64位系统下运行32位程序,用32位的peb结构编程有问题啦
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
路过学习~~ 顺便问下2楼,在64位的_PEB_LDR_DATA结构中,通过InLoadOrderModuleList.Flink成员遍历循环链表时,首先遍历的是ntdll.dll吗?然后是kernel32.dll?不对 ,应该是kernel64.dll... 我想知道遍历dll的 顺序跟32位系统的是一样的吗?
|