CreateRemoteThread == virus wtf?
-
hallo
mit Hilfe eines Tutorials, habe ich mir nen DLL injector für meine eigenen Anwendungen geschrieben. Problem ist, dass er nur mit ASCII funzt aber das nur nebenbei. Hauptproblem: Wenn ich mit Debug kompiliere wird er von Avira als virus "Malware" erkannt (genauer: wenn ich CreateRemoteThread auskommentiere, dann nicht mehr). Was soll das denn? Ich schreibe doch keinen Virus.
In Release mode wird es zwar nicht erkannt, aber ich möchte ja keinen Virus schreiben und ich will nicht, dass der Scanner denkt ich mach einen Virus.
Hier mal mein Code:#ifdef UNICODE #define LoadLibraryTCHAR "LoadLibraryW" #else #define LoadLibraryTCHAR "LoadLibraryA" #endif typedef HINSTANCE (*fpLoadLibrary)(TCHAR*); typedef LPVOID (*fpGetProcAddress)(HINSTANCE, TCHAR*); typedef void (*fpFunktion)(void); struct INJECTSTRUCT { fpLoadLibrary LoadLibrary; fpGetProcAddress GetProcAddress; TCHAR path[255]; TCHAR 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() { } bool EnableDebugPrivilege() { TOKEN_PRIVILEGES priv; HANDLE hThis, hToken; LUID luid; hThis = GetCurrentProcess(); OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken); LookupPrivilegeValue(0, TEXT("seDebugPrivilege"), &luid); priv.PrivilegeCount = 1; priv.Privileges[0].Luid = luid; priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0); CloseHandle(hToken); CloseHandle(hThis); return true; } HANDLE InjectDll(unsigned ProcessId, TCHAR *DllFile, TCHAR* FunctionName) { if(ExistFile(DllFile) == false) { MessageBox(0, TEXT("Can't find the DLL file!"), szAppName, MB_ICONERROR); return 0; } INJECTSTRUCT is; _tcscpy_s(is.path, DllFile); _tcscpy_s(is.func, FunctionName); DWORD funcsize = (DWORD)threadend - (DWORD)threadstart; EnableDebugPrivilege(); HINSTANCE hDll = LoadLibrary(TEXT("KERNEL32")); if(hDll == NULL) { MessageBox(0, TEXT("LoadLibrary failed!"), szAppName, MB_ICONERROR); return 0; } is.LoadLibrary = (fpLoadLibrary)GetProcAddress(hDll, LoadLibraryTCHAR); is.GetProcAddress = (fpGetProcAddress)GetProcAddress(hDll, "GetProcAddress"); if(is.LoadLibrary == NULL || is.GetProcAddress == NULL) { MessageBox(0, TEXT("GetProcAddress failed!"), szAppName, MB_ICONERROR); return 0; } HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId); if(hProc == NULL) { MessageBox(0, TEXT("OpenProcess failed!"), szAppName, MB_ICONERROR); return 0; } LPVOID start = VirtualAllocEx(hProc, 0, funcsize+sizeof(INJECTSTRUCT), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if(start == NULL) { MessageBox(0, TEXT("VirtualAllocEx failed!"), szAppName, MB_ICONERROR); return 0; } if(WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(INJECTSTRUCT), NULL) == 0) { MessageBox(0, TEXT("WriteProcessMemory failed!"), szAppName, MB_ICONERROR); return 0; } LPVOID thread = (LPVOID)((DWORD)start+sizeof(INJECTSTRUCT)); if(WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL) == 0) { MessageBox(0, TEXT("WriteProcessMemory failed!"), szAppName, MB_ICONERROR); return 0; } HANDLE threadID = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)thread, start, 0, 0); if(threadID == NULL) { MessageBox(0, TEXT("CreateRemoteThread failed!"), szAppName, MB_ICONERROR); return 0; } if(CloseHandle(hProc) == 0) { MessageBox(0, TEXT("CloseHandle failed!"), szAppName, MB_ICONERROR); return 0; } return threadID; }Würde mich wahnsinnig freuen, wenn jemand weiß, warum das als Virus erkannt wird oder was ich ändern muss.

-
DLL injection ist per Definition ein Virus: Ein Programm welches sich in anderen Programme einschleust, ohne dass der Wirt etwas davon weis.
-
ok, aber wieso dann nur im debug mode? Und wie kann ich das ändern? Einfach den code bisschen umstellen?
-
Your name answers the questions.
-
ok ist egal, aber warum crashed das programm in das ich injecte?
Und warum geht unicode nicht? Mir ist klar, dass das warscheinlich keiner weiß, aber vielleicht weiß es zufällig jemand.
-
hab den crash bug gefixt. Aber UNICODE wäre schon geil.
-
Deine Deklaration von fpGetProcAddress ist falsch.
Kleiner Tipp:
http://msdn.microsoft.com/en-us/library/ms683212
-
die ist anscheinend nicht falsch. Es geht ja in ASCII. Das Problem ist nur UNICODE

-
HINSTANCE mit HMODULE auszutauschen ändert da leider auch nichts.
-
avirasucks schrieb:
die ist anscheinend nicht falsch. Es geht ja in ASCII. Das Problem ist nur UNICODE

Na, wenn Du das sagst, dann wird das schon stimmen...
-
natürlich bin ich nicht so arrogant und widerspreche einem MVP

ich habs ja getestet.
-
Dann wirst Du ja festgestellt haben, das die Unicode-Version nicht geht, oder?
Also gut, ich geb Dir noch ein Tipp: Der 2. Parameter ist falsch deklariert...
-
hi Jochen,
nein Unicode klappt noch nicht.
wieso ist TCHAR falsch?typedef LPVOID (*fpGetProcAddress)(HMODULE , TCHAR*); msdn: FARPROC WINAPI GetProcAddress( __in HMODULE hModule, __in LPCSTR lpProcName // pointer zu char array und da unicode TCHAR. );
-
Weil Du die Doku nicht lesen kannst!?
Warum steht in der MSDN LPCSTR und bei Dir TCHAR*?
-
"kalt", "kalt"
etwas "wärmer" wirds, wenn Du dort suchst, wo der zweite Parameter als fixen Text-String an die besagte Funktion übergeben wird (kommt nur einmal in Deinem Code vor)
na, dann müßtest Du drauf kommen wo der Unicode-Fehler steckt!
Martin
-
Na, dass ist erst der Folgefehler

Das hätte ja dann der Compiler bemängelt...Und auch die falsche definition des "func" Feldes in der Struktur...
-
jetzt geht es nicht mal mehr mit ASCII

obwohl ich LPCSTR verwendet habe.typedef HINSTANCE (__stdcall *fpLoadLibrary) (TCHAR*); typedef LPVOID (__stdcall *fpGetProcAddress)(HINSTANCE, LPCSTR); typedef void (*fpFunktion)(void); struct INJECTSTRUCT { fpLoadLibrary LoadLibrary; fpGetProcAddress GetProcAddress; TCHAR path[255]; LPCSTR func; }; 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() { } bool EnableDebugPrivilege() { TOKEN_PRIVILEGES priv; HANDLE hThis, hToken; LUID luid; hThis = GetCurrentProcess(); OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken); LookupPrivilegeValue(0, TEXT("seDebugPrivilege"), &luid); priv.PrivilegeCount = 1; priv.Privileges[0].Luid = luid; priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0); CloseHandle(hToken); CloseHandle(hThis); return true; } HANDLE InjectDll(unsigned ProcessId, TCHAR *DllFile, LPCSTR FunctionName) { if(ExistFile(DllFile) == false) { MessageBox(0, TEXT("Can't find the DLL file!"), szAppName, MB_ICONERROR); return 0; } INJECTSTRUCT is; _tcscpy_s(is.path, DllFile); is.func = FunctionName; DWORD funcsize = (DWORD)threadend - (DWORD)threadstart; EnableDebugPrivilege(); HINSTANCE hDll = LoadLibrary(TEXT("KERNEL32")); if(hDll == NULL) { MessageBox(0, TEXT("LoadLibrary failed!"), szAppName, MB_ICONERROR); return 0; } is.LoadLibrary = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA"); is.GetProcAddress = (fpGetProcAddress)GetProcAddress(hDll, "GetProcAddress"); if(is.LoadLibrary == NULL || is.GetProcAddress == NULL) { MessageBox(0, TEXT("GetProcAddress failed!"), szAppName, MB_ICONERROR); return 0; } HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId); if(hProc == NULL) { MessageBox(0, TEXT("OpenProcess failed!"), szAppName, MB_ICONERROR); return 0; } LPVOID start = VirtualAllocEx(hProc, 0, funcsize+sizeof(INJECTSTRUCT), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if(start == NULL) { MessageBox(0, TEXT("VirtualAllocEx failed!"), szAppName, MB_ICONERROR); return 0; } if(WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(INJECTSTRUCT), NULL) == 0) { MessageBox(0, TEXT("WriteProcessMemory failed!"), szAppName, MB_ICONERROR); return 0; } LPVOID thread = (LPVOID)((DWORD)start+sizeof(INJECTSTRUCT)); if(WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL) == 0) { MessageBox(0, TEXT("WriteProcessMemory failed!"), szAppName, MB_ICONERROR); return 0; } HANDLE threadID = CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)thread, start, 0, 0); if(threadID == NULL) { MessageBox(0, TEXT("CreateRemoteThread failed!"), szAppName, MB_ICONERROR); return 0; } if(CloseHandle(hProc) == 0) { MessageBox(0, TEXT("CloseHandle failed!"), szAppName, MB_ICONERROR); return 0; } return threadID; }
-
Du solltest zuerst mal die Grundlagen lernen...
Du deklarierst jetzt in Deiner Struktur einen Pointer und kein Feld, wo man Zeichen ablegen kann...
Ersetze LPCSTR in der *Struktur* (und nur da) durch char[255]
-
jetzt geht es mit ASCII wieder aber nicht mit UNICODE.
struct INJECTSTRUCT { fpLoadLibrary LoadLibrary; fpGetProcAddress GetProcAddress; TCHAR path[255]; char func[255]; }; HANDLE InjectDll(unsigned ProcessId, TCHAR *DllFile, LPCSTR FunctionName) { if(ExistFile(DllFile) == false) { MessageBox(0, TEXT("Can't find the DLL file!"), szAppName, MB_ICONERROR); return 0; } INJECTSTRUCT is; _tcscpy_s(is.path, DllFile); strcpy_s(is.func, FunctionName); DWORD funcsize = (DWORD)threadend - (DWORD)threadstart; [...]
-
Was denn?
Du nimmst Visual Studio her, stellst in den general project properties all configurations auf multibyte character set und verwendest dann kein L oder _T oder sonstigen unnötigen Mist sondern schreibst einfach den Text.
-
HerstAmoi schrieb:
Was denn?
Du nimmst Visual Studio her, stellst in den general project properties all configurations auf multibyte character set und verwendest dann kein L oder _T oder sonstigen unnötigen Mist sondern schreibst einfach den Text.Und dann geht's mit UNICODE?