Wäre nett wenn mir jemand helfen könnte!
Code: Alles auswählen
//**********************************************************************************************************
//
// This function loads a PE file into memory With proper alignment.
// Enough memory must be allocated at ptrLoc.
//
//**********************************************************************************************************
struct FixupBlock
{
unsigned long pageRVA;
unsigned long blockSize;
};
void doRelocation(MZHeader *inMZ, PE_Header *inPE, PE_ExtHeader *inpeXH,
SectionHeader *inSecHdr, LPVOID ptrLoc, DWORD newBase)
{
If(inpeXH->relocationTableAddress && inpeXH->relocationTableSize)
{
// Was passiert hier?
FixupBlock *fixBlk = (FixupBlock *)((char *)ptrLoc + inpeXH->relocationTableAddress);
long delta = newBase - inpeXH->imageBase;
While(fixBlk->blockSize)
{
//printf("Addr = %X\n", fixBlk->pageRVA);
//printf("Size = %X\n", fixBlk->blockSize);
int numEntries = (fixBlk->blockSize - SizeOf(FixupBlock)) >> 1;
//printf("Num Entries = %d\n", numEntries);
unsigned short *offsetPtr = (unsigned short *)(fixBlk + 1);
For(int i = 0; i < numEntries; i++)
{
// Was passiert hier?
DWORD *codeLoc = (DWORD *)((char *)ptrLoc + fixBlk->pageRVA + (*offsetPtr & 0x0FFF));
int relocType = (*offsetPtr & 0xF000) >> 12;
//printf("Val = %X\n", *offsetPtr);
//printf("Type = %X\n", relocType);
If(relocType == 3)
*codeLoc = ((DWORD)*codeLoc) + delta;
Else
{
printf("Unknown relocation type = %d\n", relocType);
}
offsetPtr++;
}
// Was passiert hier?
fixBlk = (FixupBlock *)offsetPtr;
}
}
}
Code: Alles auswählen
;structuren --> nicht dabei.. ist nur ein Ausschnitt!
MZHeader.MZHeader
PE_Header.PE_Header
PE_ExtHeader.PE_ExtHeader
NewList SectionHeader.SectionHeader()
Procedure doRelocation(*inMZ.MZHeader , *inPE.PE_Header , *inpeXH.PE_ExtHeader ,SectionHeader.SectionHeader(), ptrLoc, newBase.d)
If *inpeXH\relocationTableAddress And *inpeXH\relocationTableSize
;?*fixBlk = AllocateMemory((FixupBlock *)((char *)ptrLoc + *inpeXH\relocationTableAddress);
delta = newBase - inpeXH\imageBase;
While fixBlk\blockSize
Debug "Addr = "+Str(fixBlk->pageRVA);
Debug "Size = "+Str(fixBlk->blockSize);
numEntries = (fixBlk\blockSize - SizeOf(FixupBlock)) >> 1;
Debug "Num Entries = "+Str(numEntries);
*offsetPtr = fixBlk + 1
For i = 0 To numEntries; i++)
codeLoc = ptrLoc + fixBlk\pageRVA + (offsetPtr & $0FFF);
;?relocType = (*offsetPtr & $F000) >> 12;
Debug "Val = "+Str(*offsetPtr);
Debug "Type = "+St(relocType);
If relocType = 3
*codeLoc = *codeLoc + delta;
Else
Debug "Unknown relocation type " +Str(relocType);
EndIf
offsetPtr + 1;
Next
;?fixBlk = (FixupBlock *)offsetPtr;
Wend
EndIf
EndProcedure
Gruß Marv