hab am we mal nen bisschen mit code-injection rumgespielt. Mein ziel war es festzustellen, welche module porgramm x lädt. hab dazu den prozess suspended created und folgende dll injectet:
Das ganze dann nochmal für LoadLibraryW. Der output war fast identisch.
Danach hab ich mir im Debugger mal angesehen, welche module wirklich geladen werden und festgestellt, dass mir mit der injection so einige entgangen sind. Das waren so ziemlich alles .NET - dll's, die ich da verpasst habe. Kann sein, dass noch nen paar aus sxs dabei waren. Wie werden diese Module geladen und wie kann ich das mit nem ähnlichen Programm überwachen?
Code:
#include <windows.h>
#include <stdio.h>
#define MODULE "kernel32.dll"
#define FUNCTION "LoadLibraryA"
char restore[5];
FILE* file;
void APIENTRY patch();
void APIENTRY unpatch();
HMODULE WINAPI hook(LPCSTR lpLibFileName)
{
unpatch();
fprintf(file,"%s\n",lpLibFileName);
HMODULE ret = LoadLibraryA(lpLibFileName);
patch();
return ret;
}
void APIENTRY patch()
{
unsigned hookedAddr = (unsigned) GetProcAddress(LoadLibrary(TEXT(MODULE)),FUNCTION);
unsigned hookAddr = (unsigned) &hook;
unsigned offset = hookAddr - hookedAddr - 5;
unsigned char jmp = 0xE9;
ReadProcessMemory(GetCurrentProcess(),(void*) hookedAddr,restore,5,NULL);
WriteProcessMemory(GetCurrentProcess(),(void*) hookedAddr,&jmp,1,NULL);
WriteProcessMemory(GetCurrentProcess(),(void*) (hookedAddr+1),&offset,4,NULL);
}
void APIENTRY unpatch()
{
unsigned hookedAddr = (unsigned) GetProcAddress(GetModuleHandle(TEXT(MODULE)),FUNCTION);
WriteProcessMemory(GetCurrentProcess(),(void*) hookedAddr,restore,5,NULL);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
file = fopen("modules.txt","w");
patch();
break;
case DLL_PROCESS_DETACH:
fclose(file);
break;
}
return TRUE;
}
Das ganze dann nochmal für LoadLibraryW. Der output war fast identisch.
Danach hab ich mir im Debugger mal angesehen, welche module wirklich geladen werden und festgestellt, dass mir mit der injection so einige entgangen sind. Das waren so ziemlich alles .NET - dll's, die ich da verpasst habe. Kann sein, dass noch nen paar aus sxs dabei waren. Wie werden diese Module geladen und wie kann ich das mit nem ähnlichen Programm überwachen?