Llamando GetModuleHandle
ya que tendrá la base de la DLL, ya que se asigna a su proceso (si es que lo hace). Entonces, lo que debe hacer es primero asegurarse de exportar la función en la DLL. Puede hacer lo que ha hecho o crear un archivo .def
como se muestra en here. A partir de entonces:
En Teoría
- inyectar la DLL para el proceso de destino y obtener la dirección de base que se cargó a
- Inyectar el DLL para el proceso actual. Use
GetProcAddress
para encontrar el desplazamiento entre la función exportada y la base de la DLL.
- Agregue este desplazamiento a la dirección base obtenida del paso 1.
CreateRemoteThread
en esta ubicación.
En la práctica
Al hacer su inyección de DLL, es posible que usted pueda obtener la base de que el archivo DLL se carga en el objetivo.
HMODULE hInjected;
hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)(GetProcAddress(hMod,
"LoadLibraryW")), lpAddress, 0, NULL);
// Locate address our payload was loaded
if(hThread != 0) {
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, (LPDWORD)&hInjected);
CloseHandle(hThread);
}
hInjected
será la base de la DLL inyectado. Entonces tengo otra función:
void* GetPayloadExportAddr(LPCWSTR lpPath, HMODULE hPayloadBase, LPCSTR lpFunctionName) {
// Load payload in our own virtual address space
HMODULE hLoaded = LoadLibrary(lpPath);
if(hLoaded == NULL) {
return NULL;
} else {
void* lpFunc = GetProcAddress(hLoaded, lpFunctionName);
DWORD dwOffset = (char*)lpFunc - (char*)hLoaded;
FreeLibrary(hLoaded);
return (DWORD)hPayloadBase + dwOffset;
}
}
Lo que esto hace es cargar primero la carga en nuestro propio espacio de direcciones virtuales. Luego, podemos usar GetProcAddress
para obtener la dirección de la función exportada. A partir de esto, podemos obtener el desplazamiento de la función desde la base de la DLL. Agregar este desplazamiento al hInjected
que obtuvimos antes nos dirá dónde debe realizarse la llamada CreateRemoteThread
. Por lo que podría hacer una llamada de este modo:
BOOL InitPayload(HANDLE hProcess, LPCWSTR lpPath, HMODULE hPayloadBase, HWND hwndDlg) {
void* lpInit = GetPayloadExportAddr(lpPath, hPayloadBase, "Init");
if(lpInit == NULL) {
return FALSE;
} else {
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
lpInit, hwndDlg, 0, NULL);
if(hThread == NULL) {
return FALSE;
} else {
CloseHandle(hThread);
}
}
return TRUE;
}
Este es todo el código que se arrancó de un old project I have. Puede tomar el código y hacer lo que quiera con él, pero sé que si tuviera que volver a escribir el código ahora, haría muchas cosas de manera diferente.
¿Qué devuelve GetModuleHandle? ¿Qué devuelve GetProcAddress? –
Ambos devuelven 0. GetModuleHandle intenta obtener un control de un módulo en el proceso de host donde no lo he cargado. –