2009-11-13 18 views

risposta

15

incredibilmente improbabile dal momento che, in genere, non si ottiene l'intero contenuto della biblioteca iniettato nel vostro eseguibile.

Si ottiene solo sufficiente a soddisfare tutti i simboli non definiti. Questa potrebbe essere solo una piccola parte della libreria. Una libreria generalmente consiste in un insieme di file oggetto di cui solo quelli richiesti sono collegati al tuo eseguibile.

Ad esempio, se l'unica cosa che hai chiamato nella libreria di runtime C era exit(), è molto improbabile che la famiglia di funzioni printf() sia nell'eseguibile.

Se si è collegati direttamente ai file oggetto, si può avere una possibilità, dal momento che sarebbero inclusi se usati o meno (a meno che il linker non sia intelligente).

Ma anche quello sarebbe un compito titanico in quanto non ci possono essere informazioni nell'eseguibile su quali sezioni di codice provengono da specifici file oggetto. È potenzialmente fattibile ma, se c'è un altro modo, lo guarderei per primo.

Vorrei chiarire il processo tipico:

  1. Quattro file oggetto, a.o, b.o, c.o e d.o contengono rispettivamente a(), b(), c() e d() le funzioni. Sono tutte aggiunti all'archivio abcd.a.
  2. sono tutti standalone (senza dipendenze) tranne per il fatto che le chiamate b()c().
  3. Si dispone di un programma principale che chiama a() e b() e lo si compila quindi collegarlo alla libreria abcd.a.
  4. Il linker trascina a.o e b.o dalla biblioteca e nel vostro eseguibile, soddisfacendo la necessità di a() e b(), ma l'introduzione di un bisogno di c(), perché b() ne ha bisogno.
  5. Il linker quindi trascina c.o fuori dalla libreria e nel file eseguibile, soddisfacendo la necessità di c(). Ora tutti i simboli non definiti sono soddisfatti, l'eseguibile è fatto e spolverato, è possibile eseguirlo quando è pronto.

In nessuna fase del processo è stato d.o trascinato nel file eseguibile in modo da avere zero speranze di ottenerlo.

Aggiornamento: Re il "se c'è un altro modo, sarei guardando quel primo" commento che ho fatto in precedenza, si è appena dichiarato in un commento ad una delle altre risposte che avete la fonte codice che ha creato le librerie che vuoi estrarre. Devo chiedere: perché non puoi ricostruire le librerie con quella fonte?Mi sembra una soluzione molto più semplice rispetto al tentativo di ricreare le librerie da una palude di codice eseguibile.

+0

Lo scenario consiste in avere diversi file oggetto personalizzato, collegarli in un unico file libreria personalizzata, e il link statico che le biblioteche file all'interno dell'eseguibile. Se tutte le librerie sono personalizzate, non sono "completamente integrate" nell'eseguibile? In realtà non voglio ottenere il codice sorgente, voglio solo ottenere i file della libreria. – HyLian

+0

Se ogni file oggetto nella libreria è necessario per soddisfare tutti i simboli non definiti allora sì, saranno tutti lì. Ma non è necessariamente il caso. – paxdiablo

+0

Facciamo un passo indietro. Perché non hai i file .sl/.a? – paxdiablo

-1

Sembra che tu stia chiedendo un decompilatore. Tali strumenti sono difficili da usare (probabilmente impossibile per C++ leggermente sofisticato) e se esiste un altro modo per risolvere il problema, tra cui prendere un paio di mesi per riscrivere le librerie, consiglierei questa linea di condotta.

Come indicato da pax, anche se si è utilizzato un decompilatore, si otterrebbero solo le funzioni di libreria richiamate dall'eseguibile.

+0

Ma non voglio decompilare completamente l'eseguibile, non ho bisogno del codice sorgente, quello di cui ho bisogno sono i file della libreria che sono stati collegati in quell'eseguibile e collegano un altro eseguibile con quelle librerie. – HyLian

+0

Hai i file di intestazione per la libreria? –

+0

Sì, ho davvero tutto il codice sorgente che genera quelle librerie. – HyLian

1

Immagina di avere 10 libri in una lingua che non capisci, senza copertine, frontespizi, numeri di pagina e capitoli. Alcuni libri possono essere incompleti. Tutte le pagine sono mischiate insieme quindi è impossibile scoprire dove sono l'inizio e la fine di ogni libro (ogni pagina è una chiamata di funzione) Ora prova a trovare la pagina 123 del libro 5 (diciamo che è menzionata sopra la funzione Exit()).

Beh, è ​​possibile ...

+0

E hai il manoscritto originale per il libro 5. Decisamente più facile solo ristampare il libro 5 dal manoscritto. –

Problemi correlati