CreateRemoteThread == virus wtf?



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



  • Und ihr braucht mir nicht mehr sagen wie dämlich dieser Fehler war.

    Bist du sicher? Ich meine ich würde mich durchaus überreden lassen das zu übernehmen wenn du willst...


Anmelden zum Antworten