CreateRemoteThread failed unter Vista


  • Mod

    Evtl. versucht Du in enen elevated process zu injezieren und das geht nicht (und das ist gut so ;)):
    http://msdn.microsoft.com/en-us/library/bb625962.aspx

    Was sagt GetLastError



  • das hier ist der restliche Code:

    #ifdef UNICODE
    #define LoadLibraryGeneric  "LoadLibraryW"
    #else
    #define LoadLibraryGeneric  "LoadLibraryA"
    #endif
    
    typedef HINSTANCE (__stdcall *fpLoadLibrary)   (TCHAR*);
    typedef LPVOID    (__stdcall *fpGetProcAddress)(HMODULE, LPCSTR);  
    typedef void (*fpFunktion)(void);
    
    struct INJECTSTRUCT
    {
    	fpLoadLibrary LoadLibrary;
    	fpGetProcAddress GetProcAddress;
         TCHAR 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()
    {
    }
    
    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;
    }
    

    Martin Richter: da ich kein Vista habe kenne ich mich mit der Architektur nicht sonderlich aus. Jedenfalls wird
    der Process von mir kurz davor mit CreateProcess(CREATE_SUSPEND) erstellt, daher nehme ich dann auch die Prozess ID für die Injection. Nach der Injection rufe ich ResumeThread auf.



  • nun, wenn GetProcAddress die Funktion xyz (parameterlos) nicht findet, rufst du eine Funktion mit der Adresse 0 auf.



  • die Funktion findet sie aber sicher, weil ich die DLL auch schreibe und er es unter XP auch findet.



  • Martin Richter schrieb:

    Evtl. versucht Du in enen elevated process zu injezieren und das geht nicht

    Aber wenn der Injektions-Prozess elevated ist, dann funktioniert es schon, nicht?



  • ... hast du dich mal eines Debuggers bemüht? - also auch den Zielprozess debugt?
    Wie auch immer, hier mal eine Funktion die Eine Dll injiziert:

    // ProcessId = Id des Zielprozesses
    // lpDllName = Name(evnt. + Pfad) der Dll die injeziert werden soll
    int InjectDll(DWORD ProcessId,char* lpDllName)
    {
        HANDLE  hProcess;
        DWORD   nBytes;
        void*   lpMem;
        FARPROC lpLoadLibraryA;
    
        if(!(hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,0,ProcessId)))
            return(0);
    
        if(nBytes=strlen(lpDllName));
        {
            nBytes++;
            if(lpMem=VirtualAllocEx(hProcess,0,nBytes,MEM_COMMIT,PAGE_READWRITE))
            {
                if(WriteProcessMemory(hProcess,lpMem,lpDllName,nBytes,0))   
                {
                    if(lpLoadLibraryA=GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"))
                    {
                        if(CreateRemoteThread(hProcess,0,0,lpLoadLibraryA,lpMem,0,0))
                        {
                            // Sleep(100) + VirtualFree
                            CloseHandle(hProcess);
                            return(1);
                        }
                    }               
                }
            }
        }
        CloseHandle(hProcess);
        return(0);
    }
    

  • Mod

    Frage19 schrieb:

    Martin Richter schrieb:

    Evtl. versucht Du in enen elevated process zu injezieren und das geht nicht

    Aber wenn der Injektions-Prozess elevated ist, dann funktioniert es schon, nicht?

    Genau! Und das ist super prima so, denn dadurch sind Programme die als Admin ausgeführt werden gegen diese miesen kleinen Hacker Attacken geschützt 😃 SCNR



  • warum hacker attacken? ich muss ein Programm schreiben, welches die FPS von anderen Programmen ausliest. Und ich muss dazu eine Dll injezieren (nicht von technischer Seite, sondern von meinem Arbeitgeber XD). Außerdem muss der obere Code als Grundlage dienen.



  • der Beitrag war natürlich von mir, bin etwas durcheinander XD


  • Mod

    Wo speichert bitte ein "normales Programm" "FPS" (Frames per Second)?
    Was willst Du da auslesen?



  • ich brauche die Injection für mehrere Sachen, aber bei d3d Anwendungen kann man die FPS auslesen. Es muss der Code aber sein, weil ich MessageBox und DialogBox aufrufe, und MessageBox sollte man ja nicht in einer DllMain aufrufen. Darum kann ich keinen "standard" Dll injection code benutzen.



  • Ich glaube, wenn du aus der DllMain aus eine __declspec(naked) Funktion aufrufst, kannst du dort machen, was du willst.

    Irgendwas war da...



  • ... du kannst natürlich auch eine Thread während der Abarbeitung von DLL_PROCESS_ATTACH in deiner Dll starten. Wie du dir das mir den d3d vorstellst ist mir allerdings ein Rätzel...


  • Mod

    Sephy schrieb:

    ich brauche die Injection für mehrere Sachen, aber bei d3d Anwendungen kann man die FPS auslesen. Es muss der Code aber sein, weil ich MessageBox und DialogBox aufrufe, und MessageBox sollte man ja nicht in einer DllMain aufrufen. Darum kann ich keinen "standard" Dll injection code benutzen.

    Dann könntest Du auch einen normalen Hook verwenden.
    Und was soll bei einer DirectX Anwendung biotte eine MessageBox, die niemals sichtbar wird?

    Absoluter Unfug. Zudem würde ich Code injezieren und die Infos zurück an mein Programm geben und nicht das FRemde Programm durch Dialoge und MessageBoxen aus dem Tritt bringen.

    Mal ganz am Rande: Wo bitte bekommst die die FPS Rate her bei eine d3d Anwendung? Es ist mir neu, das DirectX diese direkt zur Verfügung stellt.



  • ich denke mal ein EndScene hook, (mein Arbeitgeber erklärt mir das noch!)
    aber darum geht es hier nicht. Es ist nahezu unmöglich, dass ich den Fehler finde, wenn ich nicht mal Windows Vista besitze. Eventuell würde sich jemand mit Vista bereit erklären den Code durch den Compiler laufen zu lassen und schaun wo es crashed. Eventuell gegen ein kleines Entgelt.



  • Sephy schrieb:

    Eventuell würde sich jemand mit Vista bereit erklären den Code durch den Compiler laufen zu lassen und schaun wo es crashed.

    Setz ja voraus das du die Zielanwendung verrätst.



  • ist doch unrelevant, es sollte überall klappen (außer eben da, wo Vista es verbietet.)



  • Ich versteh nicht was du willst ... ein stink normale dll-injection (ob nun CreateRemoteThread oder SetWindowsHookEx) tut es doch. Du solltest nur beachten, dass es Anwendungen, wie z.B. Spiel, gibt, die Sich gegen injection's wehren ... Vista hin oder her.



  • Sephy schrieb:

    ich denke mal ein EndScene hook, (mein Arbeitgeber erklärt mir das noch!)
    aber darum geht es hier nicht. Es ist nahezu unmöglich, dass ich den Fehler finde, wenn ich nicht mal Windows Vista besitze. Eventuell würde sich jemand mit Vista bereit erklären den Code durch den Compiler laufen zu lassen und schaun wo es crashed. Eventuell gegen ein kleines Entgelt.

    Lade Dir den Windows 7 RC herunter und installiere ihn in einer VM (VMWare, Virtual PC, ....). Alternativ geht auch der Windows Server 2008, der besitzt den gleichen Kernel wie Vista. Dann kannst Du Dir das in Ruhe anschauen.

    Download Windows 7 RC: http://www.microsoft.com/germany/windows/windows-7/download.aspx
    Download Server 2008: http://www.microsoft.com/windowsserver2008/en/us/trial-software.aspx



  • danke man, wusste gar nicht dass Windows Server 2008 den Vista kernel hat. Lade mir die x86 standard version.


Anmelden zum Antworten