Hey,
ich wollte mal die ganzen alten Malware Techniken durchgehen und bin dabei auf Codecaving gestoßen.
Ich allocate Memory in einem anderen Prozess und injiziere dann meine Funktion mit Parametern.
Diese Parameter enthalten die Adressen der API Calls, die aufgerufen werden sollen.
Die liegen ja eigentlich (bei user32, kernel) immer bei allen Programmen beim selben Offset (pro Systemboot), also lade ich diese Adressen in meiner Anwendung und nicht erst in der injizierten Funktion.
// Adresse finden HMODULE kernel32Module = GetModuleHandleA("Kernel32.dll"); params.addrSleep = (DWORD)GetProcAddress(kernel32Module, "Sleep"); FreeLibrary(kernel32Module); // Speicher für Funktion allocaten // (20000b nur zum testen) LPVOID pRemoteThread = VirtualAllocEx(hProcess, NULL, 20000, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(hProcess, pRemoteThread, (LPVOID)RemoteThread, 20000, 0); // Speicher für Parameter allocaten Parameters* pParams = (Parameters*)VirtualAllocEx(hProcess, NULL, sizeof(Parameters), MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess, pParams, ¶ms, sizeof(Parameters), NULL); // Remote Thread starten HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, pParams, 0, 0); // Parameter typedef VOID(WINAPI * fnSleep)(DWORD ms); class Parameters { public: DWORD addrSleep; }; // Injizerte Func DWORD __stdcall RemoteThread(Parameters* params) { fnSleep _Sleep = (fnSleep)params->addrSleep; while (true) { _Sleep(5000); } return EXIT_SUCCESS; }
Der Prozess, in den ich versuche den Code zu injizieren, "schläft" für die angegebene Zeit (5000 ms) und stürzt dann ab.
Wenn ich hingegen Funktionen aus User32 lade, klappt alles prima... Korrupte ich irgendwie den Stack?
Bearbeitet von DeepWater, 18 April 2018 - 08:55 Uhr.