首页
社区
课程
招聘
关于peb下面链接的dll文件
发表于: 2009-11-19 02:28 4199

关于peb下面链接的dll文件

2009-11-19 02:28
4199
我看到有些代码里面用下面代码来取出已链接的dll的句柄,
__asm
    {
        mov     eax,fs:[0x30]
        mov     PEB,eax
    }
然后从peb依次得到_PEB_LDR_DATA,_LDR_MODULE,在_LDR_MODULE中就是
链表形式的模块地址。我想问的是,我写了一个32位程序,使用这个方法可以在32位系统得到dll列表,那么64位下行吗
另外,在32位系统下得到的所有dll模块,是不是和64位系统下一样阿。还有这些模块都是什么时候链到peb下的

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 724
活跃值: (81)
能力值: ( 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可以得到加载顺序。
2009-11-19 20:50
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
虽然看不懂啊,但是我会努力学习的
2009-11-19 20:58
0
雪    币: 3
活跃值: (11)
能力值: ( 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结构编程有问题啦
2009-11-19 21:26
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
路过学习~~ 顺便问下2楼,在64位的_PEB_LDR_DATA结构中,通过InLoadOrderModuleList.Flink成员遍历循环链表时,首先遍历的是ntdll.dll吗?然后是kernel32.dll?不对,应该是kernel64.dll... 我想知道遍历dll的顺序跟32位系统的是一样的吗?
2009-11-19 21:33
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
在64位系统运行32位程序,系统给你提供是模拟的win32环境(WOW),32位程序的PEB也是32位的。
2009-11-19 22:03
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
不太清楚,有系统的话自己看一下是最直接的方法了。
2009-11-19 22:05
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看来64位系统的普及,对win32程序员来说无疑是一场大劫难...
2009-11-19 22:17
0
游客
登录 | 注册 方可回帖
返回
//