Восстанавливаем fixup (relocs)
Рипнуто из ASPack.
hModule — адрес модуля,
pBase — ImageBase из заголовка,
RVA — со таблицы релоков.
Code:
procedure PE_File.ProcessFixUps (hModule, pBase, RVA: Cardinal); stdcall;
begin
asm
pushad
mov edx, [hModule]
mov eax, [pBase]
sub edx, eax
jz @@EndOfFixUpProcessing
mov eax, edx
sub ebx, ebx
shr eax, 010h
mov esi, [RVA]
add esi, [hModule]
@@ProcessBlock:
cmp dword ptr [esi], 0
jz @@EndOfFixUpProcessing
mov ecx, [esi + 04]
sub ecx, 8
shr ecx, 1
mov edi, [esi]
add edi, [hModule]
add esi, 8
@@DoOneFix:
mov bx, [esi]
shr ebx, 0Ch
cmp ebx, 01 // IMAGE_REL_BASED_HIGH
jz @@HighFix
cmp ebx, 02 // IMAGE_REL_BASED_LOW
jz @@LowFix
cmp ebx, 03 // IMAGE_REL_BASED_HIGHLOW
jz @@HighLowFix
jmp @@EndOfOneFix // IMAGE_REL_BASED_ABSOLUTE
@@HighFix:
mov bx, [esi]
and ebx, 0FFFh
add [edi + ebx], ax
jmp @@EndOfOneFix
@@LowFix:
mov bx, [esi]
and ebx, 0FFFh
add [edi + ebx], dx
jmp @@EndOfOneFix
@@HighLowFix:
mov bx, [esi]
and ebx, 0FFFh
add [edi + ebx], edx
@@EndOfOneFix:
add esi, 02
loop @@DoOneFix
jmp @@ProcessBlock
@@EndOfFixUpProcessing:
popad
end;
end;
Автор: Dr.Golova