0,0 → 1,68 |
filename equ '%EXENAME%' |
|
virtual at 0 |
file filename:3Ch,4 |
load pehea dword from 0 |
file filename:pehea,0F8h+28h*3 |
load NumberOfSections word from 4+6 |
load SizeOfOptionalHeader word from 4+14h |
if NumberOfSections<>3 |
error Expected three sections, .text, .bss and .reloc |
end if |
if SizeOfOptionalHeader<>0E0h |
error Nonstandard PE header |
end if |
load RelocsRVA dword from 4+0A0h |
load RelocsSize dword from 4+0A4h |
load ImageBase dword from 4+34h |
load TextRVA dword from 4+0F8h+0Ch |
load TextSize dword from 4+0F8h+8 |
load TextOffs dword from 4+0F8h+14h |
load BSSSize dword from 4+0F8h+28h+10h |
load RelocRVA dword from 4+0F8h+28h*2+0Ch |
load RelocOffs dword from 4+0F8h+28h*2+14h |
if BSSSize |
error Second section expected to be .bss |
end if |
if RelocRVA<>RelocsRVA |
error Third section expected to be .reloc |
end if |
;file 'test.exe':pehea+0F8h,28h |
;load physofs dword from 4+14h |
;load mem dword from 4+8 |
;file 'test.exe':physofs+16,4 |
;load sz dword from $-4 |
end virtual |
|
file filename:TextOffs,TextSize |
|
while RelocsSize>8 |
virtual at 0 |
file filename:RelocOffs,8 |
load CurRelocPage dword from 0 |
load CurRelocChunkSize dword from 4 |
end virtual |
RelocsSize=RelocsSize-CurRelocChunkSize |
CurRelocChunkSize = CurRelocChunkSize-8 |
RelocOffs=RelocOffs+8 |
while CurRelocChunkSize |
virtual at 0 |
file filename:RelocOffs,2 |
RelocOffs=RelocOffs+2 |
CurRelocChunkSize=CurRelocChunkSize-2 |
load s word from 0 |
end virtual |
CurRelocType = s shr 12 |
RelocItem = CurRelocPage + (s and 0xFFF) |
if CurRelocType=0 |
else if CurRelocType=3 |
load z dword from RelocItem-TextRVA |
store dword z-(TextRVA+ImageBase) at RelocItem-TextRVA |
else |
error Unexpected relocation type |
end if |
end while |
end while |
|
store dword TextSize at 10h |
store dword RelocRVA-TextRVA at 14h |