能力值:
( LV2,RANK:10 )
|
-
-
2 楼
在103页有。
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
我也解释不清楚,但是用OD跟踪了以后发现的确是没错的。
|
能力值:
( LV13,RANK:250 )
|
-
-
4 楼
第1个问题:
TEB+0x30处是PEB指针,而fs:[0]是指向当前TEB数据的,所以直接用 fs:[0x30] 得到PEB。
第2个问题:
一开始我也觉得奇怪,InInitializationOrderModuleList 是个 LIST_ENTRY 类型,LIST_ENTRY的定义如下:
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
那么[ecx]是前向指针,[ecx+4]是后向指针,也就是说[ecx+4]才应该是指向下一个成员的(即第2个成员:Kernel32.dll),但是用OD调试发现,此时ecx保存的已经是ntdll.dll信息了([ecx+8]的值即是ntdll.dll的基址),在网上查的资料好像对这一点也都讲的不清楚,所以我估计有可能是因为插入顺序的原因,即后面初始化的总是插入在链表前面,所以kernel32.dll的信息反倒应该用前向指针去访问。
|
能力值:
( LV13,RANK:250 )
|
-
-
5 楼
唉,看来我前面找资料不够仔细,发现网上已经有详细讲述PEB的资料了.本论坛也有:http://bbs.pediy.com/showthread.php?t=52398
总之关键的一点,LDR_MODULE结构中三个链表的顺序是前向遍历.
附件中是我自己写的列出这三个链表所有模块的小例子,VC6编译,有需要的可以下载.
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
关于第二个问题,还是不怎么明白。
得到的指向InInitializationOrderModuleList的指针,当前应该是指向ntdll.dll的,往前遍历一个才是kernel32.dll,往后遍历一个是head。
|
能力值:
( LV13,RANK:250 )
|
-
-
7 楼
mov ecx, [ecx + 0x1c] ;执行完这句后,ecx已经指向ntdll
mov ecx, [ecx] ;这句相当于ecx=ecx->flink,执行完后,ecx正好指向kernel32。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
呵呵,多谢楼上的,这下明白了。
|
能力值:
( LV7,RANK:100 )
|
-
-
9 楼
呵呵,是链表不是结构体指针……
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
不懂不懂。、、、、
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
想請問一下
fs:[0]是指向当前TEB数据
為什麼知道是 fs 而不是其他的如 es, .. etc ?
|
|
|