Newsgroup: it.comp.programmare.win32
Titolo: IMAGE_REL_BASED_HIGHADJ

se qualcuno se ne intende di formato PE, potrebbe gentilmente spiegarmi
meglio come si deve operare quando si ha una base relocation di tipo
IMAGE_REL_BASED_HIGHADJ? non credo di averlo capito bene dal documento
pecoff.doc che mette a disposizione Microsoft... io ho fatto nel seguente
modo:
// dwDelta è il base address effettivo meno quello predefinito
// pv è un puntatore alla locazione dove deve essere applicato il fixup
*(PWORD)pv += HIWORD(dwDelta);
*((PWORD)pv + 1) = LOWORD(dwDelta);
è giusto secondo voi?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 IMAGE_REL_BASED_HIGHADJ?
Avevo lavorato anche io, tempo fa, ad un programma che trafficava con 
gli header PE, ma questo valore non me lo ricordo. Comunque c'è un 
ottimo documento sul formato PE, scaricabile da 
www.wotsit.com
, da cui 
avevo imparato parecchio. Sebbene certe cose non fossero chiare nemmeno 
lì...
Per curiosità: come mai traffichi con gli header PE? A che cosa stai 
lavorando, se non sono indiscreto? :-)

 lavorando, se non sono indiscreto? :-)
ehm... ^^'
senza entrare troppo nello specifico posso solo dirti che (per puro
interesse mio) sto creando una DLL "invisibile": all'inizio viene caricata
normalmente in qualche processo con LoadLibrary oppure tramite linking
statico (so che questa espressione non è corretta, ma molti la usano
erroneamente e poi non mi ricordo quella giusto ^_^'), dopodiché risponde
a DLL_PROCESS_ATTACH creando un oggetto File Mapping nel quale scrive il
contenuto del suo stesso file; a quel punto viene richiamato nella copia
invisibile un mio entry point speciale che binda e riloca il resto della
copia invisibile. unica accortezza: il codice di binding e rilocazione
deve essere position independent poiché deve funzionare *prima* della
rilocazione stessa, di conseguenza lo sto riscrivendo in un blocco __asm
(non posso avere la certezza che scrivendolo in C il compilatore mi generi
sempre PIC). infine dopo la rilocazione e il binding le pagine di ciascuna
sezione vengono protette secondo i flag indicati nell'header della sezione
stessa.
adesso per la rilocazione i tipi di fixup che non ho capito li ho ignorati
(tanto il compilatore mi ha generato tutti IMAGE_REL_BASED_HIGHLOW) e ora
stavo combattendo con un altro problema: quando voglio caricare la DLL in
modalità invisibile in un altro processo, avendo un suo handle aperto,
faccio nel seguente modo:
1) duplico nel processo target l'handle del File Mapping Object
2) chiamo MapViewOfFileEx chiedendogli lo stesso base address che la mia
DLL invisibile ha nel processo source; se questo non è disponibile chiamo
semplicemente MapViewOfFile
3) a questo punto devo chiamare il mio entry point speciale che binda (nel
caso in cui alcune funzioni importate nel processo target abbiano
indirizzo differente da quello source) e riloca (nel caso in cui il base
address richiesto non fosse disponibile)
e il problema si presenta proprio al punto 3: rilocare e bindare significa
riscrivere nelle pagine della DLL, che però potrebbero non avere permessi
di scrittura; esistono vari casi:
1) la pagina su cui devo scrivere ha accesso COW (copy on write) - questo
è il caso migliore perché posso scrivere senza problemi
2) la pagina su cui devo scrivere ha accesso in lettura e/o scrittura -
devo ricaricare la pagina dal file originale e poi posso modificarla a
piacere
3) non oso pensare che succede se la pagina è shared... O_o'
e il brutto è che nella mia DLL *ci sono* delle pagine shared... O_O'
ehm, perciò... tu come faresti al punto 3? ^^'


 ehm, perciò... tu come faresti al punto 3? ^^'
come non detto: il compilatore impedisce che ci siano delle rilocazioni in
una sezione shared (fiuuu... ^^)
ma c'è un ulteriore problema al punto 2: come faccio a ricaricare una
pagina dal disco senza che le modifiche abbiano effetto sul processo
source? io utilizzo *un solo* oggetto File Mapping... e se ne usassi più
d'uno sarebbe un macello perché nel chiedere un base address non è detto
che questo abbia liberi tutti i kilobyte che servono a me, quindi con
MapViewOfFileEx dovrei fare numerosi tentativi...
