000
11.11.2008, 18:40 Uhr
~Grabgewalt
Gast
|
Hallo ich versuche gerade ein Programm zu schreiben, dass beliebige dlls in beliebige Prozesse injected. Das Problem ist, dass der betreffenden Prozess abstürzt nachdem die dll ihre Aufgabe erfüllt hat. Ich nehme an das es an VirtualFreeEx liegt, aus irgendeinem Grund schlägt die Funtion bei mir fehl. Bitte um Hilfe.
PS: In der dll wird nichts besonderes gemacht, auch mit einer "leeren" dll krieg ich das Problem mit dem Absturz.
C++: |
#include <windows.h> #include <cstdio> #include <tlhelp32.h> #include <iostream> #include <conio.h>
using namespace std;
typedef HINSTANCE (*fpLoadLibrary)(char*); typedef LPVOID (*fpGetProcAddress)(HINSTANCE, char*); typedef void (*fpFunktion)(void);
struct INJECTSTRUCT { fpLoadLibrary LoadLibrary; fpGetProcAddress GetProcAddress; char path[255]; char func[255]; };
DWORD WINAPI threadstart(LPVOID addr) { HINSTANCE hDll; fpFunktion funktion; INJECTSTRUCT * is = (INJECTSTRUCT*)addr; hDll = is->LoadLibrary(is->path); funktion = (fpFunktion)is->GetProcAddress(hDll, is->func); funktion(); return 0; } void threadend() { }
//...Debug_Privileg setzen
void listproc() { HANDLE hSnap, hTemp; PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32);
//EnableDebugPrivilege(); hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(Process32First(hSnap, &pe)) { do { hTemp = OpenProcess(PROCESS_ALL_ACCESS, 0, pe.th32ProcessID); if(hTemp) { printf("%4d\t%s\n", pe.th32ProcessID, pe.szExeFile); CloseHandle(hTemp); } } while(Process32Next(hSnap, &pe)); } }
int main() {
HANDLE hProc; LPVOID start, thread; DWORD funcsize, written; HINSTANCE hDll; INJECTSTRUCT is; DWORD id;
EnableDebugPrivilege(); listproc();
hDll = LoadLibrary("KERNEL32"); is.LoadLibrary = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA"); is.GetProcAddress = (fpGetProcAddress)GetProcAddress(hDll, "GetProcAddress"); strcpy(is.path, "DLL.dll"); strcpy(is.func, "Funktion");
funcsize = (DWORD)threadend-(DWORD)threadstart;
printf("Process ID: "); scanf("%d", &id);
hProc = OpenProcess(PROCESS_ALL_ACCESS, false, id); if(!hProc) MessageBox ( NULL, "Unable to open process", "DLL Injector", MB_OK);
printf("Prozess Handle: %x", hProc);
//start = VirtualAllocEx(hProc, 0, funcsize+sizeof(INJECTSTRUCT), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if(!(start = VirtualAllocEx(hProc, 0, funcsize+sizeof(INJECTSTRUCT), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE))) MessageBox ( NULL, "Failed to allocate memory", "DLL Injector", MB_OK);
printf("Memory: %x\n", start);
if(!(WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(INJECTSTRUCT), NULL))) MessageBox ( NULL, "WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(INJECTSTRUCT), NULL) failed", "DLL Injector", MB_OK);
thread = (LPVOID)((DWORD)start+sizeof(INJECTSTRUCT));
if(!(WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL))) MessageBox ( NULL, "WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL) failed", "DLL Injector", MB_OK);
if(!(CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)thread, start, 0, NULL))) MessageBox ( NULL, "Failed to Create remote thread", "DLL Injector", MB_OK);
if(!(VirtualFreeEx(hProc,NULL,funcsize+sizeof(INJECTSTRUCT),MEM_RESERVE|MEM_COMMIT))) MessageBox ( NULL, "Failed to release allocated memory", "DLL Injector", MB_OK);
CloseHandle(hProc); return 0; }
|
Wie gesagt, die DLL macht sogar was sie soll, aber danach stürzt der Prozess in den injected wurde ab.
Danke schonmal. |