[C/C++] Nur eine Funktion injektieren und keine komplette *.dll??

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von NobodyPerfect, 30. August 2009 .

Schlagworte:
  1. 30. August 2009
    Nur eine Funktion injektieren und keine komplette *.dll??

    Moin - ich wollte mal nachfragen, ob es möglich ist einzelne Funktionen in ein Process einzuschleusen statt eine komplette dll...

    Zur zeit injektiere ich die komplette *.dll wie folgt:

    PHP:
    extern  "C"  _declspec ( dllexport int _stdcall inject ( char Window char DllPath ){
        
    int Inject ; LPVOID DLLVirtLoc ; FARPROC LibAddress ; HANDLE CreateThread ;
        
    unsigned long ThreadID ;
        
    GetWindowThreadProcessId (( HWND ) FindWindow ( NULL Window ), & ThreadID );
        
    HANDLE hProcess  OpenProcess ( PROCESS_ALL_ACCESS , false , ThreadID );
        
    DLLVirtLoc  VirtualAllocEx (( HANDLE ) hProcess 0 strlen ( DllPath ), ( DWORD ) 0x1000 , ( DWORD ) 0x4 );
        if(
    DLLVirtLoc  ==  0 ) return  0 ;
        
    Inject  WriteProcessMemory (( HANDLE ) hProcess DLLVirtLoc DllPath strlen ( DllPath ),  NULL );
        if(
    Inject  ==  0 ) return  0 ;
        
    LibAddress  GetProcAddress (( HMODULE ) GetModuleHandle ( "kernel32.dll" ), ( LPCSTR ) "LoadLibraryA" );
        if(
    LibAddress  ==  0 ) return  0 ;    
        
    CreateThread  CreateRemoteThread ( hProcess NULL 0 ,( LPTHREAD_START_ROUTINE ) LibAddress , ( LPVOID ) DLLVirtLoc 0 , & ThreadID );
        if(
    CreateThread  ==  0 ) return  0 ;
        return 
    1 ;
    }
    Funktioniert auch super, jedoch wollte ich nun wissen wie ich nur einen teilcode injektiere... wäre sehr sehr dankbar

    MfG


    EDIT: Ist das nicht möglich, oder weiss es nur niemand?^^...vielen Dank
     
  2. 31. August 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Du schreibst die Funktion in den virtuellen Speicher des Prozesses und rufst sie dann per CreateRemoteThread auf.
    Kommt auf ziemlich das selbe raus, nur dass du den Prozess zu 99% crashen wirst

    Bleib lieber bei der DLL-Methode, der Windoof-Loader nimmt dir da nämlich verdammt viel Arbeit ab und sorgt dafür, dass die Funktionsaufrufe in deinem Code auch dahin zeigen, wo sie sollen^^
     
  3. 31. August 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Ich würde schon sehr gern bei dieser Methode bleiben, jedoch gibt es dort ein Problem... hier mal ein Bsp. Code:

    PHP:
    #include "StdAfx.h"
    #include<iostream> 
    volatile int flags  0 ;

    extern  "C"  _declspec ( dllexport int _stdcall Addieren ( int a int b ){
        return (int)(
    a + b );
    }

    DWORD WINAPI ASM ( LPVOID param )
    {    
        
    DWORD Speicher = 0x0 ;
        do{
                switch(
    flags )
                {
                    case 
    1 :
                        
    __asm {
                            
    push 6
                            push 1
                            mov ecx
    23 
                            push 2
                            mov edx
    0
                            call 
    [ Speicher ]
                        }
                        
    flags = 0 ;
                        break;
                    case 
    2 :
                        
    __asm {        
                            
    mov ecx 12
                            call 
    [ Speicher ]
                        }
                        
    flags = 0 ;
                        break;
                    case 
    3 :
                        
    __asm {        
                            
    mov ecx 1
                            call 
    [ Speicher ]
                        }
                        
    flags = 0 ;
                        break;
                }
                
    Sleep ( 50 );
        }
        while(
    1 );
    return 
    0 ;
    }

    BOOL APIENTRY DllMain ( HINSTANCE hinstDLL DWORD fdwReason LPVOID lpvReserved )
    {
        switch (
    fdwReason )
        {    
            case 
    DLL_PROCESS_ATTACH :    
                
    HANDLE hThreadHandle  CreateThread ( NULL , NULL , ASM , NULL , NULL , NULL );
            break;
        }        
        return 
    TRUE ;
    }  
    Mein Problem, beim Injektieren geht er in den DLL_PROCESS_ATTACH was er auch tun soll (Funktioniert super)
    Wenn ich die funktion Addieren (z.B. mit Visual Basic) calle tut er es jedoch erneut , ist ja auch eig, kla da er sie dort erneut läd... ich möchte jedoch nur das er es bei der Injektion tut....hast evlt eine Lösung?

    MfG
     
  4. 31. August 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Ich habe absolut keine Ahnung was du überhaupt machen willst.
     
  5. 31. August 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Ich denke mal das Vorhanden warum ich das so mache ist egal, jedoch geht es ja um die Problematik wie man dies Problem lösen könnte.
     
  6. 31. August 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Das kann eigentlich nicht sein, wie callst du die (hab ich schonmal gefragt), gib mal mehr informationen?
    Innerhalb der Dll, also in dem injectierten Process?
    Ist der Injectierte Process deine VisualBasicapplication aus der du die Function callst?
    Oder versuchst du deine Funktion mit CreateRemoteThread o.ä, also aus dem Process der die DLL injectiert hat, wieder zu callen?

    Zeig mal wie du das in VisualBasic callst?

    Musst schon etwas genauer ausdrücken, sonst versteht dich hier keiner.....

    Mfg Rushh0ur
     
  7. 1. September 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Wie wäre es mit einem Mutex? Die sind systemweit. Beim ersten Aufruf setzt du den Mutex. Wenn dann beim zweiten Aufruf der Mutex gesetzt ist, überspringst du einfach die Anweisungen in DllMain.

    Oder du könntest eine Lockdatei anlegen (ok, das macht man eher unter Linux). Oder du benutzt sonst eine art von IPC.
     
  8. 1. September 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Mutex ist leider das falsche für mich... Kann man irgendwie den Fensternamen des fensters auslesen in welchen der code injektiert wird?
     
  9. 1. September 2009
    AW: Nur eine Funktion injektieren und keine komplette *.dll??

    Du kannst über EnumWindows alle offenen Fenster enumerieren und mit GetWindowThreadProcessId kannst du Prüfen zu welchen Prozess diese gehören und somit ermitteln zu welchem Prozess welche Fenster gehören.

    Oder du benutzt CreateFileMapping und MapViewOfFile um eine virutele Datei zu erstellen in der
    du dann evenutell Informationen über dein Ladeprozess schreibst, funktioniert ähnlich wie ein Mutex.

    Biespiel (hier ohne MapViewOfFile):
    PHP:
        HANDLE hVirtuallFile ;
        
    hVirtuallFile  CreateFileMapping ( INVALID_HANDLE_VALUE NULL PAGE_READWRITE 0 4 L "MEINE APP" ); 
        if (
    GetLastError () !=  ERROR_ALREADY_EXISTS )
        {
            
    // Code wird nur einmal ausgeführt solange Virtuelle Datei exestiert
            // Virtuelle Datei kann mit CloseHandle wieder geschlossen (gelöscht) werden
        
    }
    Mfg Rushh0ur
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.