Domanda

Sto tentando di modificare una libreria in editor esadecimale, modalità di inserimento. Il punto principale è quello di rinominare alcune voci in essa. Se faccio in modalità "Otherwrite", tutto funziona bene, ma ogni volta che provo ad aggiungere un paio di simboli alla fine della stringa in modalità "Insert", la biblioteca non riesce a caricare. Tutto ciò che mi manca qui?

È stato utile?

Soluzione

Sì, vi state perdendo un sacco. Una biblioteca segue la PE / formato COFF , che è abbastanza pesante sul puntatori in tutto il file. (Ad esempio, verso l'inizio del file è una tabella che indica le posizioni di ciascuna sezione del file).

Nel caso in cui si sta modificando le risorse, c'è la possibilità di farlo senza rompere le cose se si assicurarsi di correggere tutti i puntatori e dimensioni per tutto ciò che punta a dopo le modifiche, ma dubito che sarà facile. Nel caso in cui si sta modificando la sezione .text (vale a dire, il codice), allora dubito avrete avere fatto, dal momento che gli operandi di chiamate di funzione e salti sono posizioni relative alla loro posizione nel codice - si avrebbe bisogno di aggiornamento l'intero codice per tenere conto di modifiche.

Una tecnica per superare questo è un "grotta codice", in cui si sostituisce un pezzo del codice esistente con un'istruzione JMP esplicita a qualche posizione vuota (È possibile farlo in fase di esecuzione, dove si ha la possibilità di creare nuova memoria ) - in cui si definisce un po 'nuovo codice che può essere di lunghezza arbitraria -. allora si esplicitamente JMP di nuovo a dove hai chiamato da (+5 byte dire che per il codice operativo JMP + operandi)

Altri suggerimenti

sono i nomi li stai cambiando per la stessa lunghezza come i vecchi nomi? In caso contrario, gli offset di tutto è spostato. E fare una qualsiasi delle funzioni di chiamata l'un l'altro? Questo potrebbe essere un altro punto problema. Sarebbe più facile per ottenere il codice sorgente (dal sito web del progetto se non è in casa, o dal fornitore se è chiuso) e modificarli in quella, e quindi ricompilare esso. Sono curioso di sapere perché si sta modificando i nomi in ogni caso.

DLL sono un complesso formato binario (codice cioè compilato). I turni processo di compilazione di nome chiamate di funzione in riferimenti cablati a posizioni specifiche nel file ( "offset"). Pertanto se si inserisce caratteri nel mezzo del file, gli offset dopo quel punto non sarà più corrispondono in realtà è nella posizione fanno riferimento, il che significa che le chiamate di funzione nella libreria verrà eseguito il codice errato (se riescono a correre nulla a tutti).

In sostanza, la linea di fondo è quello che stai facendo è sempre andando a rompere roba. Se siete sfortunati, potrebbe anche rompere davvero male e causare gravi danni.

Certo - una conoscenza dettagliata del formato, e ciò che deve cambiare. Se vi state chiedendo il motivo per cui alcune delle tue modifiche causa di carico a fallire, si sta perdendo la conoscenza.

Biblioteche sono destinate ad essere scritto dal linker per l'utilizzo del linker. Essi seguono un formato ben definito che è destinato ad essere facile per il linker di scrivere e leggere. Non hanno bisogno di tolleranza per l'input umano come un compilatore fa.

Molto semplicemente, le biblioteche non sono destinati ad essere modificati da editor esadecimale. Potrebbe essere possibile modificare le voci da loro sovrascrivendo con i nomi della stessa lunghezza, o che possono rovinare un qualche indice. Se si modifica la lunghezza di qualsiasi cosa, è molto probabile rottura puntatori e metadati.

Non fornisce alcuna ragione per voler fare questo. Se è per divertimento, beh, è ??più difficile di quanto previsto. Se si dispone di un altro motivo, sei meglio prendere la fonte, o di ottenere qualcuno che ha la fonte di rinominare e ricostruire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top