|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
[C] Elf loader cercasi
Mi chiedo da una buona mezz'ora se è possibile caricare un elf in memoria...
cioè vorrei caricarmi l'eseguibile in memoria un pò come si fà su windows con l'accoppiata LoadLibrary() e GetProcAddress() ed avere il mio indirizzo di partenza. So che per caricare le librerie condivise si utilizza dlopen(), questa naturalmente mi da picche se tento di passargli un eseguibile come argomento.... oppure stò sbagliando qualcosa? Sapete consigliarmi? Grazie. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Grazie per la risp.
Si, poi ieri sera ho pensato anche a mmap(). La mia perplessità è che non ho trovato da nessuna parte una indicazione che dice "...a si, si fa con mmap()". Programmi come readelf altrimenti come fanno? Più tardi vado a vedermi il sorgente magari... con mmap se non mi sbaglio ottengo l'indirizzo di partenza che mi serve ok? Ad esempio su NT so che per leggere nel PE devo fare: Codice:
...
hFile = CreateFile("prova.exe", GENERIC_READ, FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Cannot Open the File\n");
return -1;
}
hMapObj = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, 0);
if (!hMapObj)
{
...
}
if (!(hBaseAddress = MapViewOfFile(hMapObj, FILE_MAP_READ, 0, 0, 0)))
{
...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
Sì, su Windows è corretto, nel senso che con CreateFileMapping/MapViewOfFile puoi già mappare in memoria l'eseguibile rilocato
(Se comunque vuoi andare ad analizzare il PE header del file non c'è bisogno di mapparlo in memoria, puoi fare una conversione RVA/raw per muoverti all'interno del file senza doverlo mappare) Su Linux sinceramente non lo so, non sono esperto di questo sistema operativo
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: Ultima modifica di eraser : 15-06-2010 alle 14:27. |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Quote:
Codice:
...
hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE)
{
...
}
FileSize = GetFileSize(hFile, NULL);
BaseAddress = (BYTE *) malloc(FileSize);
if (!ReadFile(hFile, BaseAddress, FileSize, &BR, NULL))
{
....
}
...
ma io credo che per forza si usa mmap()... questa mi restituirà l'indirizzo di partenza come GetProcAddress()... Faccio alcune prove... Intanto grazie. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
è libelf la libreria che fa al caso tuo
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
Quote:
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Quote:
correggimi se sbaglio, ma su windows so che molte cose vengono piazzate dal loader nell'immagine di processo... (senza contare le librerie). dite che è uguale leggendo direttamente? |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2001
Città: Bastia Umbra (PG)
Messaggi: 6395
|
Se fai un'analisi del solo file eseguibile, in Windows sostanzialmente se lo analizzi da come è su disco o come è caricato in memoria cambia poco, l'unica grande rogna è che se è caricato già in memoria e rilocato puoi muoverti all'interno di esso in maniera più agevole perché gli indirizzi espressi nel PE header sono già relativi (RVA). Invece se lo leggi da disco devi convertire gli indirizzi RVA in indirizzi fisici sul file per poterti muovere in maniera adeguata tra le varie sezioni dell'header PE
__________________
:: Il miglior argomento contro la democrazia è una conversazione di cinque minuti con l'elettore medio :: Ultima modifica di eraser : 15-06-2010 alle 17:15. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
L'utility readelf usa fread().
Deduco che usare mmap() non sia necessario per il mio obiettivo... lo scoprirò vivendo. Grazie per i vostri consigli. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:16.




















