Domanda

Ho un eseguibile da riga di comando che altera alcuni bit in un file che voglio usare dal mio programma. È possibile creare il mio eseguibile che utilizza questo strumento e distribuire un solo eseguibile?

[modifica] Chiarimento:

Lo strumento da riga di comando accetta un offset e alcuni bit e modifica i bit di questo offset in un determinato file. Quindi voglio creare un patcher per un'applicazione che cambia bit specifici in un valore specifico, quindi cosa posso fare scrivo qualcosa come un file batch per farlo, ma voglio creare un eseguibile che lo fa, cioè incorporare lo strumento in un programma wrapper che lo chiama con valori specifici.

Posso scrivere il wrapper di codice in (windows) c \ c ++, asm ma no .net per favore.

È stato utile?

Soluzione

Sarebbe più semplice implementare il proprio programma piuttosto che scrivere il wrapper; sembra banale: basta aprire il file, cercare nella posizione giusta, scrivere i bit, chiudere il file, il gioco è fatto.

Altri suggerimenti

Il modo più semplice è quello di incorporare questo exe nel tuo e scriverlo su disco per eseguirlo.

Puoi aggiungere l'eseguibile come risorsa di flusso binario nel tuo eseguibile e quando ne hai bisogno puoi estrarlo in una cartella temporanea e creare un nuovo processo con il file temporaneo.

Il codice esatto che devi fare dipende dal fatto che tu stia scrivendo codice .Net o C ++.

Risposta breve: No.

Risposta meno breve: a meno che non sia un programma di installazione o un archivio eseguibile autoestraente.

Risposta più lunga e speculativa: se il file system supporta flussi di dati alternativi, è possibile aggiungere un flusso contenente l'utilità al programma, quindi il programma potrebbe accedere al proprio flusso di dati alternativo, estraendo l'utilità quando necessario. Ahaha.

Potresti aggiungere un eseguibile alla fine dell'altro e scrivere del codice per decomprimerlo in una cartella temporanea.

Ho fatto una cosa simile prima ma con un file di configurazione e alcune bitmap aggiunte a un file EXE in Windows. Il modo in cui l'ho fatto è stato in primo luogo aggiungere le mie cose alla fine di EXE e quindi scrivere un po 'di struttura dopo quella che contiene l'offset del file dei dati che nel tuo caso sarebbe l'offset del 2o ex.

Quando esegui la tua app, cerca la fine del file meno la dimensione della struttura, estrai l'offset del file e copia il 2o exe in una cartella temporanea, quindi avvialo.

OK, ecco qualche dettaglio in più come requestd. Questo è uno pseudo-codice per creare il file EXE combinato. Questa è una piccola utility che esegui dopo aver compilato il tuo EXE principale:

Open destination file
Open main exe as a binary file
Copy main exe to destination file
offset = size of main exe
Open 2nd exe as a binary file
Copy 2nd exe to the output file
Write the offset to the output file

Ora per la procedura di estrazione. Questo vale nel tuo EXE principale:

Find the location of our own EXE file (GetModuleFileName() under Windows)
Open the file in binary mode
Seek to the end minus sizeof(offset) (typically 4 bytes)
Read the offset value
Seek to the offset position
Open a temporary file in binary mode
Read bytes from the main EXE and write to the temporary file
Launch the temporary file

Penso che il modo più semplice per farlo per i tuoi scopi sia probabilmente usare un pacchetto eseguibile autoestraente. Ad esempio, utilizzare uno strumento come Paquet Builder che impacchetterà l'exe (e qualsiasi altro file desiderati) e possono essere configurati per chiamare l'exe o un file batch o qualsiasi altra cosa tu voglia quando l'utente decomprime l'eseguibile autoestraente.

Se l'exe è stato costruito per essere trasferibile (flag linker essenziale / fisso: no), puoi effettivamente fare un LoadLibrary su di esso, ottenere l'indirizzo di base, impostare una catena di chiamate e chiamare (saltare) al suo interno. Non varrebbe la pena, e pochissimi exe sono costruiti in questo modo, quindi dovresti avere il codice per ricostruirlo, a quel punto non saresti in questo esercizio.

Quindi ... No.

Sono più incuriosito dallo sviluppatore a cui non dispiace scrivere in C / C ++ / asm, ma "non .net" - ma apparentemente è ostacolato da fopen / fseek / fwrite - dato che riguarda tutto il programma che descrivi sembra che stia andando.

Penso che ciò sia possibile anche utilizzando Funzione FileInstall di AutoIt . Per questo dovrai impostare AutoIt, creare uno script con la funzione FileInstall per includere who exe e quindi usare f.i. la funzione RunWait per eseguirli. Compila per un exe e dovresti aver finito.

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