DLL Incetion scheitert am Start der Funktion duch CreateRemoteThread()
-
Hallo,
So wie unten geschrieben hat bis vor kurzen die DLL Injektion noch gut funktioniert.Jetzt scheiterts an CreateRemoteThread Aufruf.Sobald die Funktion aufgerufen wird ,stürzt die injektionierte Anwendung ab.
Habe keine Erklärung dafür, Privilegien sind im Debugmodus gesetzt.Gruß
27ZöllnerUserbool LadeFunktion() { if(EnableDebugPrivilege()==true) { printf("Privilege accept!\n"); }else { printf("Privilege not accepted!\n"); } hDll = LoadLibrary("KERNEL32"); is.LoadLibrary = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA"); is.GetProcAddress = (fpGetProcAddress)GetProcAddress(hDll, "GetProcAddress"); strcpy(is.path, "C:\\Program Files (x86)\\Steam\SteamApps\\ily456\\counter-strike\\cstrike\\SSWv7.3.dll"); //strcpy(is.func, "Funktion"); Für externen Funktionsaufruf funcsize = sizeof((DWORD)threadstart); printf("ID: "); scanf("%d", &id); hProc = OpenProcess(PROCESS_ALL_ACCESS, false, id); if(hProc !=0) { printf("Prozess Handle: %x & %p\n", hProc,hProc); }else{ printf("Prozess Handle Errorcode : %d\n", GetLastError()); return false; } start = VirtualAllocEx(hProc, 0, funcsize+sizeof(INJECTSTRUCT), MEM_COMMIT, PAGE_EXECUTE_READWRITE); if(start !=0) { printf("Memory fur Funktion und Vars frei machen ab StartAdresse:%p - Funktionsgroesse+Vars in Bytes sind: %d\n", start,funcsize+sizeof(INJECTSTRUCT)); }else{ printf("Memory Error : %d\n",GetLastError()); return false; } Sleep(500); // Variablen im Speicher schreien if(WriteProcessMemory(hProc, start, (LPVOID)&is, sizeof(INJECTSTRUCT), NULL)==0) { printf("WriteProcessMemory Error : %d\n",GetLastError()); }else{ printf("Adresse ab dem start geschrieben wird : %p und die Goesse : %d\n",start,sizeof(INJECTSTRUCT)); } //Berechnen an welcher Stelle wir den Code hinschreiben müssen thread = (LPVOID)((DWORD)start+sizeof(INJECTSTRUCT)); //Adresse speichern fürs entladen //Die Funktion im Speicher schreiben if(WriteProcessMemory(hProc, thread, (LPVOID)threadstart, funcsize, NULL)==0) { printf("WriteProcessMemory Error : %d\n",GetLastError()); }else{ printf("Adresse ab dem thread geschrieben wird : %p und die Goesse : %d\n",thread,funcsize); } //Thread starten if(CreateRemoteThread(hProc,0, 0, (LPTHREAD_START_ROUTINE)thread, start, 0, 0)==0) { printf("CreateRemoteThread Error : %d\n",GetLastError()); } CloseHandle(hProc); return true; }
-
27ZöllnerUser schrieb:
Sobald die Funktion aufgerufen wird ,stürzt die injektionierte Anwendung ab.
der Fehler liegt also in der Injektionierungsfunktion...
-
@DiesS
Sach an? Scheinst heute deinen coolen Tag zu haben ^^ Aber bevor du mich coolscheisserst ,wäre mir eine Grund (weshalb das so ist),lieber.
Gruß
27ZöllnerUser
-
27ZöllnerUser schrieb:
So wie unten geschrieben hat bis vor kurzen die DLL Injektion noch gut funktioniert.Jetzt scheiterts an CreateRemoteThread Aufruf.
Was hat sich den in der Zwischenzeit geändert?
-
@egb
Ich kann es dir nicht sagen,jedenfalls stürzen alle Programme denen ich Speicher einräume und die Funktion starte ab.
Orientiert habe ich mich an dem bekannten Wiki [/url]http://wiki.hackerboard.de/index.php/DLL-Injection[url]
Ich habe nichts verändert ,probier es selbst ob´s bei dir abstütz oder klappt.
Grüß
27ZöllnerUser
-
Ich hab kein CS da, um den Cheat zu testen.
-
Du schreibst, du hast nichts geändert. Also ist die Injizierte Funktion doch auch noch die selbe.
Du hast aber das
strcpy(is.func, "Funktion");
auskommentiert. Also steht in dem Array was zufälliges.
Deine injezierte Funktion sucht dann per GetProcAddress nach einer Funktion mit diesem Namen (der sonstwas sein kann) und findet ihn nicht, gibt NULL zurück. Die injezierte Funktion prüft den Returnwert aber nicht und springt dem entsprechend ins Leere.Wäre jetz so meine Vermutung.
EDIT: Grad noch ein Fehler gefunden:
funcsize = sizeof((DWORD)xxx)
wird immer sizeof(DWORD) = 4 ergeben. Dementsprechend dürfte nur ein Teil der Funktion, nähmlich die ersten 4 Byte kopiert werden und auch nur die ausgeführt.
Hast du das Tutorial überhaupt verstanden oder nur wild drauf loskopiert?
-
AHA ein Cheater !
Nun gut, ily456 dann werden wir gleich mal deinen Steam Account sperren!
mfg Valve
Hab gerade kb deinen ganzen Code durch zu gucken vergleich einfach mal hiermit:
#include <windows> #include <iostream> #include <TlHelp32.h> #include <fstream> using namespace std; void GetDebugPrivileges(); unsigned GetProcessIdByProcessName( string AppName ); char *DLL_NAME ="MessageBox.dll"; bool CheckTargetAppExistsInAppFolder( string AppName ); int main(int argc, char* argv) { string AppName = "calc.exe"; GetDebugPrivileges(); DWORD ID = GetProcessIdByProcessName( AppName ); HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, ID); if( ProcessHandle == 0 ) { cout<<"OpenProcess fehler: " << GetLastError(); system("PAUSE"); return 0; } void *addr = VirtualAllocEx(ProcessHandle, 0, strlen(DLL_NAME) , MEM_COMMIT, PAGE_EXECUTE_READWRITE); cout<<"VirtualAllocEx: " << hex<< addr <<endl; cout<<"Adresse die den DLL Namen enthaelt: " << (void*)DLL_NAME << endl; bool ret = WriteProcessMemory(ProcessHandle, (void*)addr, (void*)DLL_NAME, strlen(DLL_NAME), 0); if( ret == false ) { cout<<"WriteProcessMemory fehler: " << GetLastError(); system("PAUSE"); return 0; } cout<<"WriteProcessMemory: " << ret << endl; HANDLE ThreadHandle =CreateRemoteThread(ProcessHandle, 0, 0, (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"), addr, 0, 0); if( ThreadHandle==NULL ) { cout<<"CreateRemoteThread error, error code: " << GetLastError() << endl; system("PAUSE"); return 0; } DWORD state = WaitForSingleObject(ThreadHandle, INFINITE); cout<<"WaitForSingleObject state: " << state << endl; bool free = VirtualFreeEx(ProcessHandle, addr, strlen(DLL_NAME), MEM_DECOMMIT); if( free == false ) { cout<<"CreateRemoteThread error, error code: " << GetLastError() << endl; system("PAUSE"); return 0; } system("PAUSE"); } unsigned GetProcessIdByProcessName( string AppName ) { bool ProcessExists = false; HANDLE snap; PROCESSENTRY32 lppe; snap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if ( snap == INVALID_HANDLE_VALUE ) { cout<<"Konnte kein Snapshot machen Fehler code: " << GetLastError() << endl; return 0; } lppe.dwSize = sizeof(PROCESSENTRY32); Process32First( snap, &lppe ); do { if( ! strcmp(lppe.szExeFile, AppName.c_str() ) ) { cout<<lppe.szExeFile << " Prozess ID: " << lppe.th32ProcessID << endl; ProcessExists = true; break; } } while ( Process32Next ( snap , &lppe ) == 1 ) ; if ( ProcessExists == false ) { return 0; } return lppe.th32ProcessID; } void GetDebugPrivileges() { HANDLE TokenHandle; bool OpenTokenBool = OpenProcessToken( GetCurrentProcess() ,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY ,& TokenHandle ); if ( OpenTokenBool==false ){ cout<<"OpenProcessToken error, error code: "<< GetLastError()<<endl; return ; } TOKEN_PRIVILEGES TokPrev; LUID_AND_ATTRIBUTES LUIDAttrib; TokPrev.PrivilegeCount=1; TokPrev.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; bool LookUpBool = LookupPrivilegeValue(0, "SeDebugPrivilege", &TokPrev.Privileges[0].Luid ); if ( LookUpBool==false ){ cout<<"LookupPrivilegeValue error, error code: "<< GetLastError()<<endl; return ; } bool adjust = AdjustTokenPrivileges( TokenHandle,false, &TokPrev, sizeof(TOKEN_PRIVILEGES),0,0 ); if ( adjust==false ){ cout<<"AdjustTokenPrivileges, error code: "<< GetLastError()<<endl; return ; } }
-
Boah Du bist ja ein ganz krasser