Mõni päev pärast küsimuse esitamist mõistsin, et tõlgendasin oma algseid tulemusi valesti. Tundub, et faili .rdata jaotis kopeeritakse otse mällu, kuid seejärel kirjutab laadija IAT RVA abil kõigepealt 36 baiti. Vale küsimus lisatud 96 baiti kohta tuleneb sellest, et ma ei märganud, et failides korratakse minu testides kontrollitud baitide järjestust.
See, mida ma just ütlesin, ei pruugi ikkagi olla 100% täpne. Uurimist jätkatakse järgmistel päevadel.
Algne küsimus
Püüan kirjutada programmi Windowsi käivitatavate failide analüüsimiseks. Eeldasin, et käivitatava faili sektsioonid kopeeritakse otse mällu. Olen mitmes programmis märganud kummalist käitumist.
Üks näide on crackme12.exe
. Kui kontrollin mäluga laaditud siluri .rdata
sektsiooni, näen, et mingil põhjusel on mällu laaditud sektsiooni alguses lisatud 96 baiti, mida käivitatavas failis polnud. Olen veetnud kaks päeva Windowsi käivitatava dokumentatsiooni lugemiseks, kuid ma ei leia selgitust, miks see juhtub.
Lisateave
Proovin seda faili Linuxi laadida veini all. Silur, mida kasutan, kannab nime OllyDbg. Faili allalaadimise link: http://www.reversing.be/easyfile/file.php?show=20080602192337264
Püüan programmi kirjutada Common Lispi. See on link testfailile: https://github.com/bigos/discompiler/blob/master/test/lisp-unit.lisp
Olen proovinud laadige sama crackme Windowsi alla ja sain veel ühe üllatuse. Ekraanipilt saidil https://github.com/bigos/discompiler/blob/fc3d8432f10c8bd5dfd14a8b5e2b113331db15df/my-reference/images/differences%20between%20lin%20and%20win. png näitab Windowsi ja Wine'i kõrvuti.
Aadressilt x402060, punases ekraanipildis esile tõstetud, kuvatakse faili jaotisest kopeeritud andmed. Operatsioonisüsteemi laadimisel sisestati 96 baiti. Minu üllatuseks on Wine loader sisestanud erinevaid andmeid. Kui võrrelda Wine'i ja Windowsi erinevusi, näete, et kaks esimest rida erinevad. Kas keegi saab mind valgustada, mis toimub?
Järeldus
Selgub, et imporditabeli RVA ja IAT RVA paigutati aadressidele vahemikus x402000 kuni x402060. Seega näib, et laadija kopeerib jaotise pärast neid tabeleid mällu.
Lisasin oma väikesesse programmi natuke koodi ja sain järgmise väljundi:
RVAs: (((320 "Import Table RVA "8228) (324" Impordi tabeli suurus "60)" mälus vahemikus "" 402024 "" kuni "" 402060 ") ((328" Ressursitabeli RVA "16384) (332" Ressursitabeli suurus "1792)" mälus "" 404000 "" kuni "404700") ((408 "IAT RVA" 8192) (412 "IAT suurus" 36) "mälus" "402000" "" "402024"))