DLL Injection Fehler
-
Hey,
nach längerem Erkundigen habe ich nun meinen DLL Injector.(code s.unten)
Nun wollte ich eine kleine DLL schreiben und sie in Notepad injecten, was jedoch nicht geklappt hat
Es sollte ein Fenster erscheinen, bei dem ein kleiner Text steht, aber nichts...
Auch wenn ichs mit Winject versuche, bekomm ich von Winject einen Error.
Also hier der Injector Code:#include <windows.h> #include <tlhelp32.h> #include <shlwapi.h> #include "cus.h" #define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ) using namespace std; DWORD ProcID; bool InjectSuccess; bool hasProcID; string sDLLStatus; string sProcessStatus; string sEndStatus = "Press [F2] to quit"; string sCusInjectStatus = "Press [F1] to inject DLL"; char* DLLName = NULL; char* ProcName = NULL; string sProcName; string sDLLName; bool getProcID(char* cPName,DWORD &idAdd); bool InjectDLL(DWORD pID); void UI(); int main() { eigen::central("----------DLL INJECTOR---------"); cout << endl; eigen::central("by Tomsen1410"); cout << endl; eigen::central("-------------------------------"); cout << endl; cout << endl; cout << "Type in process name: "; cin >> sProcName; ProcName = new char[sProcName.length()]; strcpy(ProcName, sProcName.c_str()); cout << endl; cout << "Type in the DLL name: "; cin >> sDLLName; DLLName = new char[sDLLName.length()]; strcpy(DLLName, sDLLName.c_str()); sDLLStatus = "-"; sProcessStatus = "-"; UI(); while(!InjectSuccess){ if(GetAsyncKeyState(VK_F1)) { hasProcID = getProcID(ProcName,ProcID); InjectSuccess = InjectDLL(ProcID); if(InjectSuccess){sEndStatus = "";sCusInjectStatus = "";} UI(); Sleep(100); } if(GetAsyncKeyState(VK_F2)) { return 0; } } Beep(1600,200); UI(); cout << endl << endl; cout << "---INJECTED---"<<endl; for(int i=5;i>0;i--){ cout << "Closing in " << i << endl; Sleep(1000); } return 0; } bool getProcID(char* cPName,DWORD &idAdd){ bool isHere; PROCESSENTRY32 pe32; HANDLE hSnapShot; hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if(hSnapShot == INVALID_HANDLE_VALUE){return false;} pe32.dwSize = sizeof(PROCESSENTRY32); isHere = Process32First(hSnapShot,&pe32); while(isHere){ if(strcmp(cPName,pe32.szExeFile) == 0){ idAdd = pe32.th32ProcessID; CloseHandle(hSnapShot); sProcessStatus = "--Fine--"; return true;} isHere = Process32Next(hSnapShot,&pe32); pe32.dwSize = sizeof(PROCESSENTRY32); } CloseHandle(hSnapShot); sProcessStatus = "Process not found!"; return false; } bool InjectDLL(DWORD pID){ ifstream fDLL(DLLName); if(!fDLL){ sDLLStatus = "File not found!"; return false;} HANDLE Proc; HANDLE hWirt; char buf[50]={0}; LPVOID RemoteString, LoadLibAddy; Proc = OpenProcess(CREATE_THREAD_ACCESS, FALSE, pID); if(!Proc) { return false; } LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); if(LoadLibAddy == NULL){ return false;} RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLLName), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); if(RemoteString == NULL){ return false;} if(WriteProcessMemory(Proc, (LPVOID)RemoteString, DLLName, strlen(DLLName), NULL) == 0){ return false;} hWirt = CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL); sDLLStatus = "--Fine--"; CloseHandle(Proc); return true; } // void UI(){ system("CLS"); eigen::central("----------DLL INJECTOR---------"); cout << endl; eigen::central("by Tomsen1410"); cout << endl; eigen::central("-------------------------------"); cout << endl; cout << endl; cout << endl; cout << sCusInjectStatus << endl; cout << sEndStatus << endl << endl; cout << "Process Status: " << sProcessStatus << endl; cout << "DLL Status : " << sDLLStatus << endl; }
center is ne funktion von mir, um edn text zu zentrieren...
Jetzt noch der Code der DLL:
dllmain.cpp:// dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. #include "stdafx.h" #include "dlltest.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> DLLIMPORT void Hello(); BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: Hello(); break; case DLL_PROCESS_DETACH: Hello(); break; case DLL_THREAD_ATTACH: Hello(); break; case DLL_THREAD_DETACH: Hello(); break; } return TRUE; } void Hello() { MessageBox(0, L"Hello from injected DLL!", L"Hi", MB_ICONINFORMATION); }
dlltest.h:
#ifndef _DLL_H_ #define _DLL_H_ #if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else # define DLLIMPORT __declspec (dllimport) #endif DLLIMPORT void Hello(void); #endif
Hilfe wäre nett!
-
Man ruft keine blockierende Dinge wie MessageBox in der DllMain auf. Hat da absolut nichts zu suchen, der Thread darf nicht blockieren. Du kannst höchstens deinen eigenen Thread starten, der die Box anzeigt.
Und wieso implementiert wirklich jeder seinen eigenen schlechten DLL-Injector? Passiert andauernd und die Implementierungen sind meistens noch schlechter als die ganzen schlechten Tutorials.
Auch wenn deiner noch recht brauchbar ist.Schau dir doch zb mal an Hadesmem an: http://code.google.com/p/hadesmem/
-
Lol...
der Injector war zu Übungszwecken gedacht, aber dennoch danke.
-
Funktioniert leider immernoch nicht
Hab die DLL jetzt so:// dllmain.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. #include "stdafx.h" #include "dlltest.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> DLLIMPORT void Hello(); HANDLE ThreadHandle; DWORD threadId = 0; DWORD WINAPI thread(void *par); BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: ThreadHandle = CreateThread(0, 0x1000, &thread, 0, 0, &threadId); break; case DLL_PROCESS_DETACH: ThreadHandle = CreateThread(0, 0x1000, &thread, 0, 0, &threadId); break; case DLL_THREAD_ATTACH: ThreadHandle = CreateThread(0, 0x1000, &thread, 0, 0, &threadId); break; case DLL_THREAD_DETACH: ThreadHandle = CreateThread(0, 0x1000, &thread, 0, 0, &threadId); break; } return TRUE; } DWORD WINAPI thread(void *par){ Hello();return 0;} void Hello() { MessageBox(0, L"Hello from injected DLL!", L"Hi", MB_ICONINFORMATION); }
hab übrigens mit Visual Studio gearbeitet und hab ein neues Win32 Projekt erstellt --> DLL-Datei...falls das richtig ist.
Insgesamt sind dort dann 6 Dateien:
-dlltest.h (selbst erstellt s.erster post)
-DLLTest.cpp (habe ich leer gelassen, bis auf #include "stdafx.h")
-dllmain.cpp (s.quelltext von oben)
-stdafx.cpp
-stdafx.h
-targetver.hAchja und ich hätte noch eine Frage zum Thema DLL Injector:
Was macht denn eigentlich einen guten DLLInjector aus?
Ich meine sie machen doch alle dasselbse oder nicht?
-
- Was genau funktioniert nicht? Welche Funktion schlägt fehl? Wie ist der GetLastError() Fehlercode?
- Du solltest auch die 0 von deinem DLLName in den Prozess schreiben
- Dein DLL Name ist relativ zum current Directory des Zielprozesses, findet er die DLL? Am besten den ganzen Pfad schreiben
-
Thereaver schrieb:
- Was genau funktioniert nicht? Welche Funktion schlägt fehl? Wie ist der GetLastError() Fehlercode?
- Du solltest auch die 0 von deinem DLLName in den Prozess schreiben
- Dein DLL Name ist relativ zum current Directory des Zielprozesses, findet er die DLL? Am besten den ganzen Pfad schreiben- Werde es versuchen, bin nur leider nicht am PC (in ~30min)
- Was meinst du denn damit? In meiner DLLTest.cpp (so heißt die DLL) ist nur eine Zeile, nämlich : #include "stdafx.h"...ich dachte da muss ich ncihts reinschreiben(für eine funktion wie hier)?
- Ja er findet die DLL...hab sie auch im selben Ordner wie den Injector.
-
Ich nehme an, er meint, dass in Zeilen 137 ff. strlen(DllName) jeweils ein Byte zu wenig ist. Der Sentinel am Ende des Strings (die Null) muss auch mit rüber.
-
also strlen(...)+1 ?
-
Ja.
Im übrigens brauchst du den String garnicht in ein Array kopieren, hol dir den Zeiger einfach mit c_str() und die Länge mit length() (Wieder 1 addieren).
-
Davon abgesehen hat da s0 mit C++ zu tun. WinAPI ist der Forenbereich deiner Wahl.
-
Hallo ich hatte mich auch mal kurz mit sowas beschäftigt ich hatte mir aber dann ein eingies Programm geschrieben wo ich rein Injectet habe. Da es bei mir auch mit Notepad und Windows Taschenrechner nicht ging. (Ich hatte auch nicht so lust zu schauen wie man es nun richtig macht.^^ Mir gings einfach nur darum so im groben das Prinzip verstanden zu haben).
Ich poste hier einfach mal den Code: (Vielleicht kannst du da ja was mit Anfangen)
Quelle: ElitePvpers (Gib mal bei google ein dann solltest du den Forum thread finden)
Injector:
#include "windows.h" #include <iostream> using namespace std; char const Path[]="C:\\Message Box.dll"; int main(int argc, char* argv) { bool virt; bool write_ret; HANDLE hWnd, hProcess, AllocAdresse, hRemoteThread; DWORD PID; // Injecten in notepad oder den windows taschenrechner ging nicht hWnd = FindWindow(0,"Irgendein Programm"); cout<<"FindWindow: " << hWnd<< endl; GetWindowThreadProcessId((HWND)hWnd, &PID); hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID); cout<<"OpenProcess: " << hProcess << endl; AllocAdresse = VirtualAllocEx(hProcess, 0, sizeof(Path), MEM_COMMIT, PAGE_EXECUTE_READWRITE); cout<<"VirtualAllocEx: " << AllocAdresse <<endl; write_ret = WriteProcessMemory(hProcess, (void*)AllocAdresse, (void*)Path, sizeof(Path), 0); cout<<"WriteProcessMemory: " << write_ret << endl; hRemoteThread=CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"), AllocAdresse, 0, 0); cout<<"CreateRemoteThread: " << hRemoteThread << endl; WaitForSingleObject(hRemoteThread, INFINITE); virt = VirtualFreeEx(hProcess, AllocAdresse, sizeof(Path), MEM_DECOMMIT); cout<<"VirtualFreeE: " << virt << endl; CloseHandle(hProcess); system("PAUSE"); }
DLL:
#include <windows.h> void InjNachricht()//der erstellte Thread { MessageBox(0, "Hallo", " Hallo", 0); } int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)//1. Beim öffnen der Dll wird diese funktion ausgeführt { if(reason==DLL_PROCESS_ATTACH)//2. Falls der Grund des Aufrufes der DllMain-Funktion das Anhängen an ein Prozesses ist.. { CreateThread(0, 0, (LPTHREAD_START_ROUTINE) InjNachricht, 0, 0, 0);//3.erstelle einen SubProzess, der die übergebene Funktion ausführt } return true; }
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Naja danke fürs verschieben hehe. UNd auch an alle Antworten.
Und ich hätte da vielleicht eine Idee, wieso es nicht funktioniert:
Könnte es daran liegen, dass Notepad und der Taschenrechner 64bit Anwendungen sind?Nur ein Vorschlag.
-
1. Du musste den vollständigen Pfad zu Deiner DLL angeben!
2. Du kannst von einem 32Bit Programm nicht eine 32Bit DLL in ein 64Bit Programm injecten! Und von einem 32Bit Programm kannst Du auch keine 64Bit DLL in ein 64Bit Programm injecten. Du musst dir ne extra eine 64Bit EXE und eine 64Bit DLL schreiben um dieses Privileg zu geniessen.
4. Solltest Du Dicch mal mit den Hintergrund-Dingen von DLL injection vertraut machen.
3. Stellt man nicht so langen Schrott Code ins Forum!
-
Lad dir mal Winject herunter damit kannst du testen ob sich deine DLL in andere Prozesse injecten lässt. Dann weiss du schonmal ob der Fehler an der DLL oder am Injector selbst liegt.
-
dllinj schrieb:
Lad dir mal Winject herunter damit kannst du testen ob sich deine DLL in andere Prozesse injecten lässt. Dann weiss du schonmal ob der Fehler an der DLL oder am Injector selbst liegt.
Hab ich doch schon lange...geht damit auch nicht. also irgendwas mit der dll
-
Raten bringt Dir auch nix...
-
Was ist daran so schwierig?
#include <windows.h> BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { MessageBoxA(0, "test", "", 0); return TRUE; }
Compile es und fertig und teste ob du es injecten kannst.
Ja eigentlich solltest du das nicht in der DllMain machen, aber zum testen wird es funktionieren. (Manche schreiben sogar immer ihren Code da rein, obwohl man es nicht sollte.)
-
Thereaver schrieb:
Was ist daran so schwierig?
#include <windows.h> BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { MessageBoxA(0, "test", "", 0); return TRUE; }
Compile es und fertig und teste ob du es injecten kannst.
Ja eigentlich solltest du das nicht in der DllMain machen, aber zum testen wird es funktionieren. (Manche schreiben sogar immer ihren Code da rein, obwohl man es nicht sollte.)das habe ich auch mal gemacht...und es funktioniert jetzt auf einmal o.0.
Jedoch öffnet sich das Fenster zweimal und es funktioniert auch nicht bei notepad.exe (nur bei notepad++) anscheinend wegen 64bit.
-
joa, das mit den bit wurde ja bereits erklärt.
Das Fenster öffnet sich öfter, da DllMain öfter aufgerufen wird.
Es gibt ja verschiedene Gründe z. B. DLL_THREAD_ATTACH und jedesmal wird es aufgerufen. Um dies zu unterbinden kann man DisableThreadLibraryCalls aufrufen.
Aber wie gesagt, du solltest eine Funktion exportieren und diese nochmal mit CreateRemoteThread aufrufen.