能力值:
( LV3,RANK:20 )
|
-
-
2 楼
楼主在用汇编啊,我只知道C语言里是
XXX.Directory[i].VirtualAddress
和
XXX.Directory[i].Size
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
不好意思,少写了,是DataDirectory
它是PE OptionalHeader中的最后一个成员
在vc的sdk中include的Winnt.h中,用记事本打开,搜索DataDirectory,就能看到DataDirectory的结构声明和成员定义
你如使用汇编的话,试试在include目录中找找winnt.inc,然后用同样方法找找就行了
|
能力值:
( LV7,RANK:100 )
|
-
-
4 楼
DataDirector[i]大小是0x80
是一个数组
数组中每一个元素是一个结构体
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
VirtualAddress。是所指向的数据结构的相对虚拟地址。
Size。这个数据结构的大小。
(DataDirector[i])
VirtualAddress所指向的东西,根据i的不同而不同,如导入导出什么的
当VirtualAddress指向导入表的时候
他指向的是IMAGE_IMPORT_DESCRIPTOR结构所构成的数组
每一个IMAGE_IMPORT_DESCRIPTOR代表着一个dll以及要从dll导入的函数
IMAGE_IMPORT_DESCRIPTOR结构如下
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
_ANONYMOUS_UNION union {
DWORD Characteristics;
DWORD OriginalFirstThunk;
} DUMMYUNIONNAME;
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
Characteristics,没用
OriginalFirstThunk,指向IMAGE_THUNK_DATA结构数组,后面介绍
TimeDateStamp,记不清是啥了,貌似没啥用
ForwarderChain,没用
Name,指向dll的名字
FirstThunk,同样也是指向IMAGE_THUNK_DATA结构所构成的数组,在程序没加载的时候和OriginalFirstThunk所指向的东西,内容一样,
IMAGE_THUNK_DATA结构数组很是关键,这个结构代表着要导入的函数的状态,
typedef struct _IMAGE_THUNK_DATA32 {
union {
DWORD ForwarderString;//没用
DWORD Function;
DWORD Ordinal;
DWORD AddressOfData;
} u1;
} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
注意次结构是union
AddressOfData,是指向IMAGE_THUNK_DATA32的指针,IMAGE_THUNK_DATA32下面介绍
Ordinal,函数的序号和倒入表有关
Function,是程序初始化完成后,要导入函数的‘真实’地址
在加载前前面提到的OriginalFirstThunk和FirstThunk都指向的是一个东西,FirstThunk相当于OriginalFirstThunk的备份
在程序加载与初始化后,FirstThunk 中所指向的IMAGE_THUNK_DATA32,会被系统置成要导入函数的‘真实’地址(IMAGE_THUNK_DATA32.u1.Function)
至于DataDirector中其他的内容和这个大同小异,就不再累述
|
|
|