Domanda

Sto sviluppando una libreria che utilizza uno o più eseguibili helper nel corso degli affari. La mia attuale implementazione richiede che l'utente abbia l'eseguibile helper installato sul sistema in una posizione nota. Affinché la libreria funzioni correttamente, l'app di supporto deve trovarsi nella posizione corretta ed essere la versione corretta.

Vorrei rimuovere il requisito per la configurazione del sistema nel modo sopra.

Esiste un modo per raggruppare l'eseguibile helper nella libreria in modo che possa essere decompresso in fase di esecuzione, installato in una directory temporanea e utilizzato per la durata di una corsa? Alla fine della corsa, l'eseguibile temporaneo potrebbe essere rimosso.

Ho considerato la generazione automatica di un file contenente un array di caratteri non firmato che contiene il testo dell'eseguibile. Questo sarebbe fatto in fase di compilazione come parte del processo di compilazione. In fase di esecuzione questa stringa verrebbe scritta in un file creando così l'eseguibile.

Sarebbe possibile fare un simile compito senza scrivere l'eseguibile su un disco (forse una sorta di disco RAM)? Potrei immaginare alcuni scanner antivirus e altri software di sicurezza che si oppongono a tale operazione. Ci sono altre preoccupazioni di cui dovrei preoccuparmi?

La libreria è stata sviluppata in C / C ++ per l'uso multipiattaforma su Windows e Linux.

È stato utile?

Soluzione

Puoi usare xxd per convertire un file binario in un file di intestazione C.

$ echo -en "\001\002\005" > x.binary

$ xxd -i x.binary 
unsigned char x_binary[] = {
  0x01, 0x02, 0x05
};
unsigned int x_binary_len = 3;

objcopy è piuttosto standard sui sistemi * nix ed è disponibile su Windows con Cygwin o MinGW, oppure Vim lo include anche nel programma di installazione standard. Questo è un modo estremamente multipiattaforma per includere dati binari nel codice compilato.

Un altro approccio è quello di utilizzare <= > per aggiungere dati alla fine di un eseguibile - IIRC puoi ottenere fread e usarli per PE su Windows.

Un approccio che mi piace un po 'meglio di quello è quello di aggiungere dati grezzi direttamente alla fine del file eseguibile. Nell'eseguibile, cerchi la fine del file e leggi un numero, che indica la dimensione dei dati binari allegati. Quindi si cercano all'indietro tanti byte e <=> quei dati e li si copia nel filesystem, dove è possibile trattarli come un file eseguibile. Questo è per inciso il modo in cui molti, se non no vengono creati tutti gli eseguibili autoestraenti .

Se aggiungi i dati binari, funziona sia con i file Windows PE che con i file * nix ELF - nessuno dei due legge oltre il " limite " dell'eseguibile.

Naturalmente, se devi aggiungere più file, puoi aggiungere un file tar / zip al tuo exe, o avrai bisogno di una struttura di dati leggermente più avanzata per leggere ciò che è stato aggiunto.

Probabilmente vorrai anche UPX i tuoi eseguibili prima di aggiungerli.

Potresti anche essere interessato alla libreria LZO , che secondo quanto riferito è una delle librerie di compressione a decompressione più veloce. Hanno una libreria MiniLZO che puoi usare per un decompressore molto leggero. Tuttavia, le librerie LZO hanno la licenza GPL, quindi potrebbe che non puoi includerlo nel tuo codice sorgente a meno che anche il tuo codice non sia GPL. D'altra parte, ci sono licenze commerciali disponibili.

Altri suggerimenti

  

" Una persona intelligente risolve un problema. UN   la persona saggia lo evita. " & # 8212; Albert Einstein

Nello spirito di questa citazione, ti consiglio di raggruppare semplicemente questo eseguibile insieme all'applicazione finale.

Solo i miei 2 centesimi.

Un approccio leggermente diverso dall'uso di un array char * senza segno è di mettere l'intero binario eseguibile come risorsa della dll. In fase di esecuzione, è possibile salvare i dati binari come file temporaneo locale ed eseguire l'app. Tuttavia, non sono sicuro che esista un modo per eseguire un eseguibile in memoria.

  

Per il corretto funzionamento della libreria   l'app di supporto deve essere corretta   posizione

Su Windows, si tratterebbe della directory Programmi o della directory System32?

Questo potrebbe essere un problema. Quando viene installata un'applicazione, in particolare in un ambiente aziendale, di solito accade in un contesto con diritti amministrativi. Su Vista e versioni successive con UAC abilitato (impostazione predefinita), questo è necessario per scrivere in determinate directory. E la maggior parte dei gusti Unix ha avuto restrizioni sensate come quella da quando chiunque può ricordare.

Quindi se provi a farlo nel momento in cui l'applicazione host chiama nella tua libreria, ciò potrebbe non essere in un contesto con diritti sufficienti per installare i file, e quindi la tua libreria metterebbe dei vincoli sull'applicazione host.

(Un'altra cosa che sarà esclusa sono le modifiche al Registro di sistema o la configurazione degli aggiornamenti dei file sui vari Unices, se l'applicazione host non ha la capacità di elevare il processo a un livello amministrativo.)

Detto questo, dici che stai pensando di decomprimere gli helper in una directory temporanea, quindi forse questo è tutto discutibile.

Qt ha un metodo eccellente per raggiungere questo obiettivo: QResource

" Il sistema di risorse Qt è un meccanismo indipendente dalla piattaforma per la memorizzazione di file binari nell'eseguibile dell'applicazione. "

Non dici se stai usando Qt, ma dici " C ++ per uso multipiattaforma su Windows e Linux " ;, quindi anche se non lo stai usando, tu potrebbe voler prendere in considerazione l'avvio.

In Windows esiste un modo per eseguire un eseguibile dalla memoria senza scriverlo sul disco. Il problema è che a causa dei moderni sistemi di sicurezza (DEP) questo probabilmente non funzionerà su tutti i sistemi e quasi tutti gli scanner anti-malware lo rileveranno e avviseranno l'utente.

Il mio consiglio è semplicemente di impacchettare l'eseguibile nella tua distribuzione, è sicuramente il modo più affidabile per raggiungere questo obiettivo.

Bene, il mio primo pensiero sarebbe: cosa fa questo eseguibile helper che non può essere fatto all'interno del codice della tua libreria, magari usando un thread secondario se necessario. Questo potrebbe essere qualcosa da considerare.

Ma per quanto riguarda la vera domanda ... Se la tua " libreria " è in realtà raggruppato come una dll (o anche un exe) quindi almeno Windows ha un supporto relativamente semplice per incorporare i file all'interno della libreria.

Il meccanismo di risorse che consente di incorporare elementi come informazioni sulla versione e icone all'interno di file eseguibili può consentire anche blocchi arbitrari di dati. Dal momento che non so quale ambiente di sviluppo stai usando, non posso dire esattamente come farlo. Ma approssimativamente, avresti bisogno di creare una risorsa personalizzata con un tipo di & Quot; FILE & Quot; o qualcosa di sensato del genere e puntalo sull'exe che vuoi incorporare.

Quindi, quando vuoi estrarlo, scrivi qualcosa come

HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_MY_EMBEDDED_FILE), "FILE");
HGLOBAL hResourceData = LoadResource(NULL, hResource);
LPVOID pData = LockResource(hResourceData);
HANDLE hFile = CreateFile("DestinationPath\\Helper.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten = 0;
WriteFile(hFile, pData, SizeofResource(NULL, hResource), &dwBytesWritten, NULL);
CloseHandle(hFile);

(compilando il percorso desiderato, il nome file e l'eventuale controllo degli errori appropriato)

Dopodiché, l'helper exe esiste come un normale file exe e quindi puoi eseguirlo come faresti normalmente.

Per rimuovere il file dopo l'uso, è necessario esaminare i flag per CreateFile, in particolare FILE_FLAG_DELETE_ON_CLOSE. Puoi anche utilizzare MoveFileEx quando combini il MOVEFILE_DELAY_UNTIL_REBOOT flag con NULL passato per il nuovo nome del file. E, naturalmente, puoi sempre eliminarlo nel tuo codice se puoi sapere quando è terminato l'eseguibile.

Non so abbastanza sugli eseguibili di Linux, quindi non so se lì sia disponibile una funzione simile.

Se Linux non fornisce alcun meccanismo conveniente e / o se questa idea non soddisfa le tue esigenze in Windows, suppongo che la tua idea di generare un array di caratteri non firmato dal contenuto dell'helper exe sarebbe la migliore modo per incorporare l'exe nella tua libreria.

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