windows - extension - ¿Cómo cambio el nombre de una DLL pero sigo permitiendo que el EXE la encuentre?
extension dll (5)
Tenemos una DLL que se produce internamente y para la cual tenemos la libre estática asociada de stubs.
También tenemos un EXE que usa esta DLL usando el método simple de enlazar estáticamente al archivo LIB de la DLL (es decir, no usar LoadLibrary manualmente).
Cuando implementamos el EXE, nos gustaría que el nombre del archivo DLL se cambie por motivos de ofuscación (a petición del cliente).
¿Cómo podemos hacer esto para que nuestro EXE aún encuentre la DLL automágicamente?
He intentado cambiar el nombre de los archivos DLL y LIB (después de haber sido construidos con su nombre normal), y luego cambiar la configuración del proyecto EXE para vincularlo con el LIB renombrado. Esto falla en el tiempo de ejecución, ya que supongo que el nombre de la DLL se copia en el archivo LIB, y el enlazador no lo adivina simplemente reemplazando ".lib" con ".dll".
En general, no queremos aplicar esta ofuscación a todos los usos de la DLL, por lo que nos gustaría mantener los archivos actuales de salida del proyecto DLL tal como son.
Espero que haya un método mediante el cual podamos editar el archivo LIB de la DLL y reemplazar el nombre codificado del archivo DLL por otra cosa. En tal caso, esto podría hacerse completamente dentro del proyecto EXE (quizás como un paso previo a la construcción).
Actualización : descubro que la carga diferida no funciona, ya que mi DLL contiene clases exportadas de C ++. Vea este artículo .
¿Hay alguna alternativa?
Aquí hay un buen enfoque alternativo: retrasar la carga .
Al compilar su aplicación, vincule todo como lo haría con el nombre de la DLL original (pero establezca el dll original para que se cargue con retraso).
A continuación, implementa el archivo DLL renombrado según la solicitud de sus clientes.
Su EXE intentará localizar el DLL utilizando el nombre original y no la versión renombrada, por lo que fallará; sin embargo, con la carga de retraso puede interceptar este error y cargar la versión renombrada usted mismo y luego hacer que el cargador nativo de Windows resuelva todo como si nada hubiera cambiado.
Lea el artículo Linker Support para Delay-Loaded DLL y vea el ejemplo de Delay Hook .
Su gancho de retraso puede ser algo como a continuación:
FARPROC WINAPI delayHook( unsigned dliNotify, PDelayLoadInfo pdli )
{
switch( dliNotify )
{
case dliNotePreLoadLibrary:
if( strcmp( pdli->szDll, "origional.dll" ) == 0 )
return (FARPROC)LoadLibrary( "renamed.dll" );
break;
default:
return NULL;
}
return NULL;
}
tendrá que usar Assembly.Load y tener el nombre del ensamblaje ofuscado guardado en el app.config.
ya sea eso o use el mismo enfoque que utilizan los complementos. tener una clase en su conjunto implementar una interfaz que busque desde su aplicación en cada ensamblaje en un directorio determinado. si se encuentra, escóndalo. por supuesto, no deberá ofuscar el nombre de la Interfaz.
Usando la herramienta LIB (incluida con Visual Studio) puede generar un archivo lib desde un archivo def. Asumiendo que su fuente dll no incluye un archivo def, primero debe crear uno. Puedes usar dumpbin para ayudarte. Por ejemplo: dumpbin /exports ws2_32.dll
En el resultado, verá los nombres de las funciones exportadas. Ahora crea un archivo def como este:
LIBRARY WS2_32
EXPORTS
accept @1
bind @2
closesocket @3
connect @4
El @number es el ordinal en la salida del dumpbin
Utilice LIB /MACHINE:x86 /def:ws2_32.def
para generar el archivo lib.
Ahora puede modificar fácilmente el archivo def y generar un nuevo archivo libfile cada vez que renombre su dll.
usted puede verificar el libfile usando dumpbin: dumpbin /exports ws2_32.lib
. Debería obtener el mismo resultado que el archivo lib original.
¿Está borracho tu cliente? De todos los requisitos locos en todo el mundo ...
De vuelta en mis días de gloria como un programador de C ++ de medianoche loco y sifilítico, solía agregar mis archivos DLL a mi archivo .exe como recursos. Luego, al inicio, los descomprimía y los escribía en el directorio del exe. Su programa puede decidir sobre el nombre del archivo DLL en este punto. Vaya realmente por la cosa de la ofuscación: comience con un número al azar, concatene un poco de poesía de Edward Lear y xórrela con su nombre favorito de doble cañón alemán; debería hacer para principiantes de todos modos. A continuación, cargue la DLL usando LoadLibrary ().
enum ukOverwrite {dontOverwriteAnything = 0, overwriteWhateverPresent = 1};
void unpackResource (ukOverwrite param1, int resourceID, const char* basePath,
const char* endFilename)
{
char* lpName = 0;
lpName += resourceID;
HRSRC MrResource = FindResource (0, lpName, "file");
if (MrResource)
{
HGLOBAL loadedResource = LoadResource (0, MrResource);
if (loadedResource)
{
void* lockedResource = LockResource (loadedResource);
if (lockedResource)
{
DWORD size = SizeofResource (0, MrResource);
if (size)
{
unsigned long creationDisposition = CREATE_NEW;
if (param1 == overwriteWhateverPresent)
creationDisposition = CREATE_ALWAYS;
char filepath [MAX_PATH];
strcpy (filepath, basePath);
strcat (filepath, endFilename);
HANDLE rabbit = CreateFile (filepath, GENERIC_WRITE, 0, 0,
creationDisposition, 0, 0);
if (rabbit != INVALID_HANDLE_VALUE)
{
DWORD numBytesWritten = 0;
int wf = WriteFile (rabbit, lockedResource, size, &numBytesWritten,
0);
CloseHandle (rabbit);
}
}
}
FreeResource (loadedResource);
}
}
}
- Use LoadLibrary (Leer nuevo nombre del registro) es una opción.
- Puede cambiar el nombre de su proyecto de estudio visual para que tenga un nombre generalizado (que su cliente no tiene objeciones).
- La DLL en sí necesita ser renombrada. ¿Pero la lib todavía lleva el viejo nombre? ¿Hizo una cruz para verificar usando el archivo DUMPBIN / ALL * .lib>? grep para el antiguo nombre DLL. ¿Todavía está ahí? Verifique el archivo * .def en el proyecto. ¿Le cambió el nombre a la BIBLIOTECA "OLDNAME"?
De lo contrario, no hay ninguna razón para que el LIB lleve el antiguo nombre DLL.