能力值:
( LV2,RANK:10 )
|
-
-
2 楼
没人知道????
|
能力值:
( LV7,RANK:100 )
|
-
-
3 楼
VirtualAddress是虚拟内存地址,而我们的文件并没有装入内存,所以需要的是文件偏移地址。必须把VirtualAddress转换为文件偏移才可以。下面是虚拟内存地址转换文件偏移的函数,其中pFileMap是文件指针,RVA是虚拟内存地址。
int RVAToOffset(char *pFileMap, DWORD RVA)
{
char *buff=pFileMap;
int rva=RVA;
IMAGE_DOS_HEADER *idh2;
IMAGE_NT_HEADERS *inh2;
IMAGE_SECTION_HEADER *ish2;
idh2=(IMAGE_DOS_HEADER*)buff;
inh2=(IMAGE_NT_HEADERS*)(buff+idh2->e_lfanew);
int i=inh2->FileHeader.NumberOfSections;
for(int j=0;j<i;j++)
{
ish2=(IMAGE_SECTION_HEADER*)(buff+idh2->e_lfanew+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)*j);
if(rva>=(ish2->VirtualAddress))
{
int off=ish2->VirtualAddress+ish2->SizeOfRawData;
if(rva<off)
{
off=rva-ish2->VirtualAddress+ish2->PointerToRawData;
return off;
}
}
}
return rva;
}
有了这个函数以后就可以这样:
IMAGE_NT_HEADERS *inh;
IMAGE_EXPORT_DIRECTORY *ied;
DWORD offset=RVAToOffset(buff,inh->OptionalHeader.DataDirectory[0].VirtualAddress);
ied=(IMAGE_EXPORT_DIRECTORY *)(buff+offset);
|
|
|