PDA

View Full Version : [C e gcc] sezione shared in immagine ELF


71104
30-12-2005, 23:26
salve, è possibile col gcc creare gestire e modificare nomi e attributi delle sezioni di un'immagine ELF di un programma C? quello che mi interessava fare era creare (su Linux) uno shared object che abbia una sezione di dati condivisa; che direttive dovrei usare?

grazie.

71104
01-01-2006, 19:11
dal numero di risposte mi pare di capire che non si possa :muro:
e come faccio a fare la stessa cosa però usando il MinGW e volendo produrre un file PE? in altre parole, qual è l'equivalente MinGW di #pragma data_seg? grazie :mc:

okay
02-01-2006, 01:59
Secondo me (fino a che qualcuno non me lo dimostra) il comp msvc è il migliore.

Riguardo l'efficienza di gcc con il C è buona mentre non lo sono per il C++.

Questo è un buon esempio con il comp msvc
http://www.twork.it/work/Oki_DataSegs.zip

Function Forwarding:
#pragma comment (linker, "/export:Func1=Dll.OtherFunc");
(Ho cercato una cosa simile con gcc ma non l'ho trovata)

Preferisco esportare con .def

Ti faccio un esempio di file .DEF che fa la stessa cosa di quella pragma li:

;Esempio file def

LIBRARY "blabla"

EXPORTS

func_uno mx_sock.altra_func_1 @23
func_due mx_sock.altra_func_2 @45 PRIVATE

senza usare i pragma.

W win il migliore

Edit: cionci usa il ming chissà se ne sà qualcosa

ilsensine
02-01-2006, 10:09
quello che mi interessava fare era creare (su Linux) uno shared object che abbia una sezione di dati condivisa
...cioè?

71104
02-01-2006, 13:52
...cioè? lascia perdere, ho scoperto per certo che non si può :D
(il formato ELF non ha sezoni condivise tra processi)

cambio la domanda:
mi interessava sapere come fare col gcc (sia col MinGW sia col gcc di Linux) a creare un'immagine PE (un programma per Windows insomma) contenente una sezione shared, ovvero una sezione che sia mappata sulle stesse pagine fisiche in tutti i processi in cui il modulo viene caricato (sia esso un exe, una dll, un ocx, una qualsiasi altra cosa); naturalmente nel codice dovrò fare in modo di sincronizzare gli accessi al contenuto della sezione. :)

e poi più in generale mi interessava sapere come faccio (sempre col gcc) a gestirmi a piacere i nomi e gli attributi delle sezioni; cioè, detto in parole poverissime, qual è l'equivalente GNU di #pragma data_seg??? :cry: :cry: :cry:

71104
02-01-2006, 13:55
hum, sta a vedere che hanno messo #pragma data_seg pure nel MinGW... :mbe:
ora provo, non si sa mai dovesse funzionare... :mbe:

71104
02-01-2006, 14:07
---___---'''

va in crash il linker :fagiano:


help please come faccio??? :cry:

ilsensine
02-01-2006, 14:51
lascia perdere, ho scoperto per certo che non si può :D
(il formato ELF non ha sezoni condivise tra processi)

Forse perché sarebbe una piccola fonte di problemi di sicurezza? ;)

Puoi gestire un piccolo segmento condiviso (ipc o in mmap su un file) tramite una funzione constructor della tua libreria, così da avere almeno un pò di controllo su chi può scrivere sul segmento e chi no...io farei così, se deve essere "trasparente" all'applicazione...

71104
02-01-2006, 15:04
Forse perché sarebbe una piccola fonte di problemi di sicurezza? ;) mumble :mbe: non ci avevo mai pensato, però c'è anche da dire che una sezione shared è una forma di IPC, e quindi i programmi in genere non ci vanno a scrivere dati sensibili (tipo password), cioè ci scrivono dati partendo dall'assunto che chi legge è "unreliable"; per fare un paragone Linux: metti che due processi comunicano tramite named pipe (fifo); chi scrive chiaramente non scrive dati sensibili (oppure li scrive ma non in chiaro), perché chi legge potrebbe non essere il processo aspettato. :)

edit: aggiungi anche che un processo per poter leggere i dati della sezione condivisa deve aver necessariamente caricato il modulo che la contiene, sia esso un exe o una dll o qualsiasi altra cosa: considerando che i files sono protetti dal sistema di sicurezza di Windows NT direi che comunque una certa protezione c'è. ;)

per esempio, mettiamo che io ho due utenti sul mio sistema NT: Administrator e Utonto; Utonto viene usato per accedere ad Internet e per lavorare sui documenti (immagini, doc di Word, slides, ecc.) e per alcune cartelle ha accesso in sola lettura o esecuzione, ma non in scrittura (diciamo le cartelle C:\WINDOWS e C:\Program Files); Administrator invece ha accesso su tutto quanto e viene usato per la manutenzione del sistema (es. installazione / rimozione di programmi).

mettiamo che Utonto andando in Internet con IE (male male :nonsifa: :D) si becca un virus: diciamo che si tratta di un buffer overflow di IE, quindi il codice malizioso viene eseguito nel processo iexplore.exe; contemporaneamente sta girando un programma importante sotto l'account di Administrator, e si da il caso che ce ne sia più istanze e che comunichino con una sezione shared presente nell'eseguibile; il codice malizioso per poter leggere e/o modificare la sezione shared deve poter caricare il modulo che la contiene, che si trova in C:\Program Files oppure in C:\WINDOWS oppure ancora in C:\WINDOWS\SYSTEM32, e infatti lo carica senza problemi perché gli accessi in lettura ed esecuzione ce li ha anche Utonto, e infatti l'esempio non calza solo che dopo aver scritto tutto sto popo' di roba non mi va di cancellarlo. :D

edit2: bella pe' Linux. :rotfl:

ilsensine
02-01-2006, 15:13
Ehm no; file, pipe e oggetti IPC hanno controllo sui permessi. Non puoi ad es. leggere da un pipe se il processo non è in grado di aprirlo con i privilegi in lettura.

Usando un constructor+mmap puoi facilmente ottenere il pezzo condiviso che ti serve; vuoi che ti posto un esempio?

71104
02-01-2006, 15:14
al contrario, siccome le named pipes suppongo siano sempre sono soggette al sistema di sicurezza (essendo dei files), immagino che sia possibile proteggerle in maniera tale da impedire anche la lettura a processi estranei, e quindi le fifo non danno problemi di sicurezza. :D ma LOL...

edit: ecco, hai postato prima che io postassi questo post :D
no thx, l'esempio non mi serve: il fatto delle sezioni shared mi serviva per Windows, non per Linux; mi serve di generare delle immagini PE col gcc avendo controllo su nomi e attributi delle sezioni (è per un lavoro open source che sto facendo con DanieleC88).

e in particolare oltre a definire sezioni shared (ma ci sto un po' ripensando :D) mi serviva di poter definire quali sezioni debbano essere paginabili e quali no.