Pregunta

Estoy desarrollando una biblioteca que utiliza uno o más ejecutables auxiliares en el curso de mis actividades comerciales.Mi implementación actual requiere que el usuario tenga el ejecutable auxiliar instalado en el sistema en una ubicación conocida.Para que la biblioteca funcione correctamente, la aplicación auxiliar debe estar en la ubicación correcta y tener la versión correcta.

Me gustaría eliminar el requisito de que el sistema esté configurado de la manera anterior.

¿Hay alguna manera de agrupar el ejecutable auxiliar en la biblioteca de modo que pueda descomprimirse en tiempo de ejecución, instalarse en un directorio temporal y usarse durante una ejecución?Al final de la ejecución, se podría eliminar el ejecutable temporal.

He considerado generar automáticamente un archivo que contenga una matriz de caracteres sin firmar que contenga el texto del ejecutable.Esto se haría en tiempo de compilación como parte del proceso de compilación.En tiempo de ejecución, esta cadena se escribiría en un archivo creando así el ejecutable.

¿Sería posible realizar tal tarea sin escribir el ejecutable en un disco (quizás algún tipo de disco RAM)?Me imagino que ciertos escáneres de virus y otros programas de seguridad se opondrán a tal operación.¿Hay otras preocupaciones que deban preocuparme?

La biblioteca se está desarrollando en C/C++ para uso multiplataforma en Windows y Linux.

¿Fue útil?

Solución

Puedes usar xxd para convertir un archivo binario en un archivo de encabezado 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;

xxd es bastante estándar en sistemas *nix y está disponible en Windows con Cygwin o MinGW, o Vim también lo incluye en el instalador estándar.Esta es una forma extremadamente multiplataforma de incluir datos binarios en el código compilado.

Otro enfoque es utilizar objcopy para agregar datos al final de un ejecutable - IIRC usted poder obtener objcopy y utilícelo para PE en Windows.

Un enfoque que me gusta un poco más es simplemente agregar datos sin procesar directamente al final de su archivo ejecutable.En el ejecutable, busca hasta el final del archivo y lee un número que indica el tamaño de los datos binarios adjuntos.Luego buscas hacia atrás esa cantidad de bytes, y fread esos datos y cópielos al sistema de archivos, donde podría tratarlos como un archivo ejecutable.Esto es por cierto la forma en que se crean muchos, si no todos, los ejecutables autoextraíbles.

Si agrega los datos binarios, funciona tanto con archivos Windows PE como con archivos *nix ELF; ninguno de ellos lee más allá del "límite" del ejecutable.

Por supuesto, si necesita agregar varios archivos, puede agregar un archivo tar/zip a su exe, o necesitará una estructura de datos un poco más avanzada para leer lo que se ha agregado.

Probablemente también querrás UPX sus ejecutables antes de agregarlos.

Quizás también te interese el biblioteca LZO, que, según se informa, es una de las bibliotecas de compresión que se descomprime más rápido.Tienen una biblioteca MiniLZO que puedes usar para un descompresor muy liviano.Sin embargo, las bibliotecas LZO tienen licencia GPL, por lo que podría significa que no puede incluirlo en su código fuente a menos que su código también esté certificado por GPL.Por otro lado, existen licencias comerciales disponibles.

Otros consejos

  

" Una persona inteligente resuelve un problema. UNA   la persona sabia lo evita. " & # 8212; Albert Einstein

En el espíritu de esta cita, le recomiendo que simplemente incluya este ejecutable junto con la aplicación final.

Solo mis 2 centavos.

Un enfoque ligeramente diferente al uso de una matriz char * sin signo es colocar todo el binario ejecutable como recurso de la dll. En tiempo de ejecución, puede guardar los datos binarios como un archivo temporal local y ejecutar la aplicación. Sin embargo, no estoy seguro de si hay una manera de ejecutar un ejecutable en la memoria.

  

Para que la biblioteca funcione correctamente   la aplicación auxiliar debe estar en la correcta   ubicación

En Windows, ¿sería el directorio Archivos de programa o el directorio System32?

Esto podría ser un problema. Cuando se instala una aplicación, particularmente en un entorno corporativo, generalmente ocurre en un contexto con derechos administrativos. En Vista y versiones posteriores con UAC habilitado (predeterminado), esto es necesario para escribir en ciertos directorios. Y la mayoría de los sabores de Unix han tenido restricciones razonables como esa durante el tiempo que cualquiera pueda recordar.

Entonces, si intenta hacerlo en el momento en que la aplicación host llama a su biblioteca, es posible que no esté en un contexto con suficientes derechos para instalar los archivos, por lo que su biblioteca impondrá restricciones a la aplicación host.

(Otra cosa que se descartará son los cambios en el Registro o las actualizaciones del archivo de configuración en los distintos Unices, si la aplicación host no tiene la capacidad de elevar el proceso a un nivel administrativo).

Habiendo dicho todo eso, dices que estás considerando desempacar los ayudantes en un directorio temporal, así que tal vez todo esto sea discutible.

Qt tiene un excelente método para lograr esto: QResource

" El sistema de recursos Qt es un mecanismo independiente de la plataforma para almacenar archivos binarios en el ejecutable de la aplicación. "

No dice si actualmente está usando Qt, pero sí dice " C ++ para uso multiplataforma en Windows y Linux " ;, así que incluso si no lo está utilizando, usted puede considerar comenzar.

Hay una manera en Windows de ejecutar un ejecutable desde la memoria sin escribirlo en el disco. El problema es que, debido a los sistemas de seguridad modernos (DEP), esto probablemente no funcionará en todos los sistemas y casi cualquier escáner antimalware lo detectará y advertirá al usuario.

Mi consejo es simplemente empaquetar el ejecutable en su distribución, sin duda es la forma más confiable de lograrlo.

Bueno, mi primer pensamiento sería: ¿qué hace este ejecutable auxiliar que no se puede hacer dentro del código de su biblioteca, tal vez usando un hilo secundario si es necesario? Esto podría ser algo a considerar.

Pero en cuanto a la pregunta real ... Si su " biblioteca " en realidad está empaquetado como un dll (o incluso un exe), entonces al menos Windows tiene un soporte relativamente simple para incrustar archivos dentro de su biblioteca.

El mecanismo de recursos que permite que elementos como la información de la versión y los íconos se integren en los ejecutables también puede permitir fragmentos arbitrarios de datos. Como no sé qué entorno de desarrollo está utilizando, no puedo decir exactamente cómo hacerlo. Pero hablando en términos generales, necesitaría crear un recurso personalizado con un tipo de & Quot; FILE & Quot; o algo sensato como ese y apúntalo al exe que deseas insertar.

Luego, cuando quieras extraerlo, escribirías algo como

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);

(completando su propia ruta deseada, nombre de archivo y cualquier verificación de error apropiada, por supuesto)

Después de eso, el exe auxiliar existe como un archivo exe normal y, por lo tanto, puede ejecutarlo como lo haría normalmente.

Para eliminar el archivo después de su uso, debe investigar las marcas de CreateFile, particularmente FILE_FLAG_DELETE_ON_CLOSE. También puede considerar el uso de MoveFileEx al combinar el indicador MOVEFILE_DELAY_UNTIL_REBOOT con NULL pasado para el nuevo nombre de archivo. Y, por supuesto, siempre puede eliminarlo en su propio código si puede saber cuándo ha finalizado el ejecutable.

No sé lo suficiente sobre los ejecutables de Linux, así que no sé si hay una característica similar disponible allí.

Si Linux no proporciona ningún mecanismo conveniente y / o si esta idea no satisface sus necesidades en Windows, entonces supongo que su idea de generar una matriz de caracteres sin firmar a partir del contenido del helper exe sería la siguiente mejor opción forma de incrustar el exe en tu biblioteca.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top