我目前無法理解PE Base Relocations如何建立。PE Base Relocations如何建立?
我的理解可以有多於一個的搬遷,我也理解爲什麼和如何做到這一點,但我只是不明白編程是:
以下哪項爲真(IMAGE_BASE_RELOCATION在WINNT.H )?
// Base relocation #1
DWORD VirtualAddress;
DWORD SizeOfBlock; // size of current relocation
WORD TypeOffset[1];
// Base relocation #2
DWORD VirtualAddress;
DWORD SizeOfBlock; // size of current relocation
WORD TypeOffset[1];
// Base relocation #3
DWORD VirtualAddress;
DWORD SizeOfBlock; // size of current relocation
WORD TypeOffset[1];
或者
DWORD VirtualAddress;
DWORD SizeOfBlock; // size of all relocations
WORD TypeOffset[1]; // relocation #1
WORD TypeOffset[1]; // relocation #2
WORD TypeOffset[1]; // relocation #3
或者都是不正確的?我如何以編程方式遍歷所有基址重定位?
目前我有這樣的代碼,似乎是不正確的地方:
DWORD baseRelocationSize = imageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
unsigned int baseRelocationCount = baseRelocationSize/sizeof(IMAGE_BASE_RELOCATION);
DWORD baseDelta = (DWORD_PTR)moduleBase - (DWORD_PTR)imageNtHeaders->OptionalHeader.ImageBase;
IMAGE_BASE_RELOCATION* baseRelocation = (IMAGE_BASE_RELOCATION*)((DWORD_PTR)moduleBase + (DWORD_PTR)imageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
for(unsigned int i = 0; i != baseRelocationCount; ++i)
{
unsigned int entryCount = (baseRelocation->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION))/sizeof(WORD);
for(unsigned int j = 0; j != entryCount; ++j)
{
WORD* entry = (WORD*)((DWORD_PTR)baseRelocation + (DWORD_PTR)sizeof(IMAGE_BASE_RELOCATION));
if((*entry >> 12) & IMAGE_REL_BASED_HIGHLOW)
{
DWORD* pdw = (PDWORD)((DWORD_PTR)moduleBase + (DWORD_PTR)baseRelocation->VirtualAddress + ((*entry) & 0xfff));
(*pdw) += baseDelta;
}
entry++;
}
baseRelocation += baseRelocation->SizeOfBlock;
}
這是一個棘手的問題吧? –
重新定位是荒謬的,似乎沒有人知道處理它們的正確方法。 – iDomo
@JohnSmith你知道了嗎? – Benny