首页
社区
课程
招聘
[旧帖] [求助]PE学习,遇到了一个基础的问题,憋的是相当难受啊 0.00雪花
发表于: 2012-4-20 17:34 1286

[旧帖] [求助]PE学习,遇到了一个基础的问题,憋的是相当难受啊 0.00雪花

2012-4-20 17:34
1286
已知:
assume edi:PTR IMAGE_NT_HEADERS ;EDI= *IMAGE_NT_HEADERS
		
mov esi,[edi.FileHeader] ;ESI= *IMAGE_NT_HEADERS->FileHeader
mov edx,[edi.OptionalHeader] ;EDX= *IMAGE_NT_HEADERS->OptionalHeader
mov ecx,[edi.OptionalHeader.DataDirectory] ;ECX = *IMAGE_NT_HEADERS->OptionalHeader->DataDirectory[i]


怎么访问DataDirectory[i]里的数据成员呢?

初级问题.百思不得其解.

请不要给我代码.我知道这个是初级问题,求引路,或者哪部分的基础知识?

谢谢,送你鲜花~

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 64
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
楼主在用汇编啊,我只知道C语言里是
XXX.Directory[i].VirtualAddress

XXX.Directory[i].Size
2012-4-26 10:34
0
雪    币: 64
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不好意思,少写了,是DataDirectory

它是PE OptionalHeader中的最后一个成员
在vc的sdk中include的Winnt.h中,用记事本打开,搜索DataDirectory,就能看到DataDirectory的结构声明和成员定义

你如使用汇编的话,试试在include目录中找找winnt.inc,然后用同样方法找找就行了
2012-4-26 10:40
0
雪    币: 547
活跃值: (529)
能力值: ( 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中其他的内容和这个大同小异,就不再累述
2012-4-26 17:44
0
游客
登录 | 注册 方可回帖
返回
//