Witam.
Studiuję już cały dzień budowe pliku exe(PE) dla systemu Windows.
Sporo <ort>RZeczy</ort> nie mogę się doszukać więc sam kombinuje jak to jest zrobione.
Mianowicie utknąłem na sekcji .idata
Elegancko znajduje sobie kawałek kodu w pliku w którym zadeklarowane są biblioteki itp.
Przykładowo:
Name: .idata
VirtualSize: 000000C0
VirtualAddress: 00003000
SizeOfRawData: 00000200
PointerToRawData: 00000600
PointerToRelocations: 00000000
PointerToLinenumbers: 00000000
NumberOfRelocations: 00000000
NumberOfLinenumbers: 00000000
Characteristics: C0000040
OrginalFirstThunk: 00003056
TimeDateStamp: 00000000
ForwarderChain: 00000000
Name: 0000303C
String Name: KERNEL32.DLL
FirstThunk: 00003066 <-
OrginalFirstThunk: 000030A2
TimeDateStamp: 00000000
ForwarderChain: 00000000
Name: 0000304A
String Name: USER32.DLL
FirstThunk: 000030AA
FirstThunk przeliczam na adres w pliku(sam to wykombinowałem :-D )
Czyli 0x600 + 0x3066 - 0x3000 = 0x666(lol). Patrze pod ten adres i widze:
0x3076, 0x308A, 0x3094, 0x0000 Są to adresy wirtualne do nazw procedur biblioteki KERNEL32.DLL
0x0676, 0x068A, 0x0694, KONIEC - przeliczone na adres w pliku.
Pod tymi adresami kryje się takie coś:
[0][0]GetModuleHandleA[0][0][0][0]Lolek2[0][0][0][0]ExitProcess[0][B2][30]
I tu coś mi nie pasuje.
Adres 0x0676 wskazuje na [0][0]GetModuleHandleA[0] - kończy się nullem bo to łańcuch, a zaczyna się dwoma nullami(dlaczego?).
(Adres 0x068A wskazuje na [0][0]Lolek2[0].....)
Ta zasada zmienia się bo jak widać między nazwami są 4 nulle czyli o 1 więcej. Wyglądało by to tak że nazwa funkcji nie kończy się jednym nullem tylko dwoma, lecz to też nie pasuje bo po ExitProcess jest jeden null(dalej zaczynają się inne dane).
Dlaczego tak to jest?
I jeszcze jedno pytanko:
Po co jest OrginalFirstThunk jak jest FirstThunk?
Są to adresy do adresów nazwy funkcji z czym te adresy nazw funkcji wskazują na te same nazwy, lecz adresy nazw funkcji występują w innych miejscach pliku :-)