Mithilfe von .dll andere .dll in Prozess injecten



  • Hallo liebe C++ Freunde!

    Ich habe folgendes Problem:

    Ich würde gerne eine DLL1.dll in den mspaint.exe Prozess injecten und sobald die DLL1.dll injected ist, soll sie die DLL2.dll in den notepad.exe Prozess injecten.

    Mein Code sieht bis jetzt so aus.

    Loader

    #include <windows.h>
    #include <tlhelp32.h>
    #include <direct.h>
    #include <wininet.h>
    #include <fstream>
    #include <string>
    #include <tchar.h>
    
    void EnableDebugPrivileges()
    {
    	HANDLE hToken;
    	LUID sedebugnameValue;
    	TOKEN_PRIVILEGES tkp;
    	if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))return;
    	if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
    	{
    		CloseHandle(hToken);
    		return;
    	}
    	tkp.PrivilegeCount = 1;
    	tkp.Privileges[0].Luid = sedebugnameValue;
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    	if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))CloseHandle(hToken);
    }
    
    void WINAPI Inject(void)
    {
    	char DLL[MAX_PATH];
    	GetCurrentDirectory(sizeof(DLL),DLL);
    	strcat(DLL,"\\DLL1.dll");
    
    	HANDLE hSnapshot, hProcess, hModule;
    	PROCESSENTRY32 pe32;
    
    	while(true)
    	{
    		hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    		pe32.dwSize = sizeof(PROCESSENTRY32);
    		Process32First(hSnapshot, &pe32);
    
    		while(Process32Next(hSnapshot, &pe32))
    		{
    			if(!lstrcmp(pe32.szExeFile, "mspaint.exe"))
    			{
    				hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pe32.th32ProcessID);
    				hModule = VirtualAllocEx(hProcess, 0, 8096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    				WriteProcessMemory(hProcess, hModule, DLL, 8096, NULL );
    				CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32"),"LoadLibraryA"), hModule, 0, NULL);
    				CloseHandle(hProcess);
    				CloseHandle(hModule);
    				return;
    			}
    			Sleep(5);
       		}
    		CloseHandle(hSnapshot);
    		Sleep(5);
    	}
    }
    
    int main()
    {
    EnableDebugPrivileges();
    Inject( );
    return 0;
    }
    

    DLL1

    #include <windows.h>
    #include <tlhelp32.h>
    
    void EnableDebugPrivileges()
    {
    	HANDLE hToken;
    	LUID sedebugnameValue;
    	TOKEN_PRIVILEGES tkp;
    	if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))return;
    	if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
    	{
    		CloseHandle(hToken);
    		return;
    	}
    	tkp.PrivilegeCount = 1;
    	tkp.Privileges[0].Luid = sedebugnameValue;
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    	if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof tkp, NULL, NULL))CloseHandle(hToken);
    }
    
    DWORD WINAPI Inject(LPVOID lpParam)
    {
    	char DLL[MAX_PATH];
    	GetCurrentDirectory(sizeof(DLL),DLL);
    	strcat(DLL,"\\DLL2.dll");
    
    	HANDLE hSnapshot, hProcess, hModule;
    	PROCESSENTRY32 pe32;
    
    	while(true)
    	{
    		hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    		pe32.dwSize = sizeof(PROCESSENTRY32);
    		Process32First(hSnapshot, &pe32);
    
    		while(Process32Next(hSnapshot, &pe32))
    		{
    			if(!lstrcmp(pe32.szExeFile, "notepad.exe"))
    			{
    				hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pe32.th32ProcessID);
    				hModule = VirtualAllocEx(hProcess, 0, 8096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    				WriteProcessMemory(hProcess, hModule, DLL, 8096, NULL );
    				CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32"),"LoadLibraryA"), hModule, 0, NULL);
    				CloseHandle(hProcess);
    				CloseHandle(hModule);
    			}
    			Sleep(5);
       		}
    		CloseHandle(hSnapshot);
    		Sleep(5);
    	}
    return 0;
    }
    
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved)
    {
    	if (fdwReason == DLL_PROCESS_ATTACH)
    	{
    	EnableDebugPrivileges();
    	CreateThread(NULL, 0, Inject, NULL, 0, NULL);
    	MessageBox(NULL, "DLL wurde injected!", "DLL1", MB_OK);
    	}
    	return TRUE;
    }
    

    DLL2

    #include <windows.h>
    
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved)
    {
    	if (fdwReason == DLL_PROCESS_ATTACH)
    	{
    		MessageBox(NULL, "DLL wurde injected!", "DLL2", MB_OK);
    	}
    	return TRUE;
    }
    

    Also die Loader.exe injected die DLL1.dll und die soll die DLL2.dll injecten.
    Die Loader.exe injected die DLL1.dll auch ohne Probleme in den "mspaint" Prozess, aber von da aus injected die DLL1.dll nicht die DLL2.dll.

    Hoffe mir kann einer helfen!
    (Und hoffe, das man das soweit versteht, was ich vorhabe)

    Mit freundlichen Grüßen,
    strange



  • Eventuell kann es beim 2. injecten Probleme mit dem Pfad zur DLL geben. Wenn du
    GetCurrentDirectory in der injezierten DLL aufrufst, wird das Verzeichniss von paint zurückgegeben.



  • Melan schrieb:

    Eventuell kann es beim 2. injecten Probleme mit dem Pfad zur DLL geben. Wenn du
    GetCurrentDirectory in der injezierten DLL aufrufst, wird das Verzeichniss von paint zurückgegeben.

    Achso echt, das kann passieren? Werde es mal einfach über "C:\\DLL2.dll" versuchen, danke schonmal für die Antwort!



  • Okay, scheint wohl nicht daran zu liegen. Injected trotzdem die DLL2.dll nicht. 😕



  • frage wenn du die eine .dll schon in MSPAINT hast könntest du die andere dll auch normal einfach mit LoadLibrary laden
    oder möchtest du sie umbedingt injecten ?



  • mspaint und notepad sind zwei verschiedene programme 😉

    möglich sollte das schon sein, allerdings halte ich es für riskant, innerhalb
    von der DllMain, die ja von windows aus geschützt ist, irgentwelche prozess-
    übergreifenden aktionen zu starten.

    warum injectest du nicht einfach beide dlls vom loader aus? das paint irgentwelche
    zugriffsrechte hat wäre mir neu 😃



  • Ganz einfach, ich möchte das solange Paint auf ist, eine DLL in Notepad injected, wenn der aufgeht. Also wenn ich den Notepad dann wieder schliessen würde und ihn dann wieder öffnen würde, würde sich die DLL wieder automatisch injecten (weil mspaint ja immernoch auf ist).

    Der Sinn war also quasi eine "Auto Injection" in den Notepad, solange mspaint offen ist. Und darum möchte ich auch nicht beides vom Loader aus injecten...



  • Überprüfe einfach mal die Rückgabewerte und ruf GetLastError() auf


  • Mod

    Man sollte CreateThread nicht innerhalb von DllMain ausführen!
    Man darf grundsätzlich nicht alle beliebigen Windows Funktionen in der DllMain ausführen, da diese nicht reentrant ist.

    Suche mal im Netz "DllMain CreateThread"!



  • hab herausgefunden dass man auch keine kernel oder user Funktionen aufrufen sollte. was soll der mist? wie soll man das dann in injecteten dlls machen? Ö_Ö


  • Mod

    reetant schrieb:

    hab herausgefunden dass man auch keine kernel oder user Funktionen aufrufen sollte. was soll der mist? wie soll man das dann in injecteten dlls machen? Ö_Ö

    Du sollst das nur nicht in DllMain tun!
    Du kanst also jederzeit eine Dll laden, in dieser Dl eine Funktion aufrufen die Deinen Injektions-Code durchführt.

    Außerdem 1.: Ich wage zu bezweifeln das "Injection" wirklich notwendig ist... 😉
    Außerdem 2.: Verstoße ich mal wieder gegen meine Regeln an Threads teilzunehmen bei denen es um DLL-Injection geht. 😃



  • Martin Richter schrieb:

    Man sollte CreateThread nicht innerhalb von DllMain ausführen!
    Man darf grundsätzlich nicht alle beliebigen Windows Funktionen in der DllMain ausführen, da diese nicht reentrant ist.

    Suche mal im Netz "DllMain CreateThread"!

    Wo zum Teufel soll es denn sonst ausführen/laden lassen?
    Anders geht es ja wohl nicht? Oder irre ich mich? O.o
    Oder soll ich vllt. sowas in der Art machen

    void function()
    {
    CreateThread(NULL, 0, Inject, NULL, 0, NULL);
    }
    

    und dann in DLLMain

    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved)
    {
        if (fdwReason == DLL_PROCESS_ATTACH)
        {
        EnableDebugPrivileges();
        function();
        MessageBox(NULL, "DLL wurde injected!", "DLL1", MB_OK);
        }
        return TRUE;
    }
    

    Oder wie genau?


  • Mod

    strange schrieb:

    Wo zum Teufel soll es denn sonst ausführen/laden lassen?

    Mäßige Dich im Ton und lerne erstmal was über DLLs.

    strange schrieb:

    Anders geht es ja wohl nicht? Oder irre ich mich? O.o

    Ja Du irrst Dich!

    strange schrieb:

    Oder soll ich vllt. sowas in der Art machen
    ...

    Nein!
    Es ist immer noch im Kontext von DllMain.

    Tipp: Ist Dir bewusst das man
    1. eine DLL Laden
    2. Mit GetProcAddr einen Einsprungpunkt bestimmen kann. (nach dem laden)
    3. Diese Funktion dann ausführen kann
    ?

    Dann liegt Dein Code in der DLL wird aber eben nicht im Kontext von DllMain ausgeführt.

    BTW: Auch der Aufruf vom MessageBox in DllMain gehört sich nicht.



  • Martin Richter schrieb:

    Mäßige Dich im Ton und lerne erstmal was über DLLs.

    Das war eher ein ratloses Fragen, wollte dich jetzt nicht damit anmachen ^^
    Und ich versuche ja gerade was über DLL's zu lernen 😉

    Werde mal nachschauen wegen GetProcAddr, danke für deine Antwort!



  • mein gott versteht ihr es nicht oder so?
    Was Martin meint ist sowas hier: http://wiki.hackerboard.de/index.php/DLL-Injection
    hier wird dllmain nicht verwendet, sondern eine Funktion in der dll die als
    extern "C" void __declspec(dllexport) deklariert ist.
    Mir ist es selber ein rätsel warum überall wenn man nach "dll injection" sucht jeder alles in DllMain macht!


  • Mod

    martinversteher schrieb:

    mein gott versteht ihr es nicht oder so?

    Endlich versteht mich jemand. 👍

    Ich verstehe auch weiterhin in keiner Weise warum alle Anfängersich immer auf die schwierigsten Themen stürzen müssen.
    Ansonsten ist dieser Thread für mich beendet...



  • martinversteher schrieb:

    mein gott versteht ihr es nicht oder so?
    Was Martin meint ist sowas hier: http://wiki.hackerboard.de/index.php/DLL-Injection
    hier wird dllmain nicht verwendet, sondern eine Funktion in der dll die als
    extern "C" void __declspec(dllexport) deklariert ist.
    Mir ist es selber ein rätsel warum überall wenn man nach "dll injection" sucht jeder alles in DllMain macht!

    Danke, werds mir mal anschauen!




Anmelden zum Antworten