CreateRemoteThread == virus wtf?



  • 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?



  • UNICODE ist mist kapiert das endlich -.- man kann außerdem keine dll injection mit unicode 😡



  • omg hätte noch statt LoadLibraryA W verwenden müssen, damit klappt es jetzt.
    Und ihr braucht mir nicht mehr sagen wie dämlich dieser Fehler war.
    Ich sollte erstmal besser die Grundlagen lernen. Aber wenigstens klappt es jetzt



  • Die UNICODE-Fanboys haben versäumt das PE-Format zu aktualisieren.



  • Hätte er nur den Fehler behoben, den ich ganz am Anfang gepostet hab, hätte es gleich getan.... 😮



  • jo war meine schuld, natürlich vielen dank für deine Hilfe.



  • Kein Problem 😉


Anmelden zum Antworten