tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von saftmeister
  • 1 Beitrag von saftmeister
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
652
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Tomsen1410 Tomsen1410 ist offline Mitglied Silber
    Registriert seit
    Oct 2008
    Beiträge
    75
    Hey,
    Ich habe nämlich im Internet ein Tutorial für einen DLL Injector gefunden, doch jetzt stellen sich mir ein paar fragen:

    1. Was genau ist eigentlich ein Handle? Ein Pointer? (Ich habe auch schon etwas damit programmiert)

    2. Was ist der Datentyp HINSTANCE, HANDLE, HWND, PROCESSENTRY32 und fpLoadLibrary ?

    3. Was macht denn die Funktion "VirtualAllocEx", "CreateToolhelp32Snapshot", "Process32Next" und "Process32First"?

    4. Was macht denn "typedef HINSTANCE (*fpLoadLibrary)(char*);
    " ( ich weiß was typedef macht, aber das verstehe ich nicht)

    Zur Hilfe hier noch der Script des Injectors:

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    
    #include <iostream>
    #include <Windows.h>
    #include <TlHelp32.h>
     
    using namespace std;
    bool InjectDLL(DWORD ProcessID);
     
    char FileToInject[] = "YtAssaultCubeDLL.dll";
    char ProcessName[] = "ac_client.exe";
    typedef HINSTANCE (*fpLoadLibrary)(char*);
     
     
    int main()
    {
        DWORD processId = NULL;
     
        PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)};
        HANDLE hProcSnap;
     
        while(!processId)
        {
            system("CLS");
            cout << "Searching for " << ProcessName <<"..." <<endl;
            cout << "Make sure your game is running" <<endl;
            hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
            
            if(Process32First(hProcSnap, &pe32))
            {
                do
                {
                    if(!strcmp(pe32.szExeFile, ProcessName))
                    {
                        processId = pe32.th32ProcessID;
                        break;
                    }
                }
                while(Process32Next(hProcSnap, &pe32));
            }
            Sleep(1000);
        }
     
     
        while(!InjectDLL(processId))
        {
            system("CLS");
            cout << "DLL failed to inject" << endl;
            Sleep(1000);
        }
     
        cout << "DLL Injected successfuly!" << endl << endl; 
        cout << "Closing Injector in 5 seconds" << endl;
     
        CloseHandle(hProcSnap);
        Sleep(5000);
     
        return 0;
    }
     
     
    bool InjectDLL(DWORD ProcessID)
    {
        HANDLE hProc;
        LPVOID paramAddr;
     
        HINSTANCE hDll = LoadLibrary("KERNEL32");
     
        fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");
     
        hProc = OpenProcess (PROCESS_ALL_ACCESS, false, ProcessID);
     
        char dllPath[250] = "C:\\HACKS\\";
     
        strcat(dllPath, FileToInject);
     
        paramAddr = VirtualAllocEx(hProc, 0, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
        bool memoryWritten = WriteProcessMemory(hProc, paramAddr, dllPath, strlen(dllPath)+1, NULL);
     
        CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0);
     
        CloseHandle(hProc);
     
        return memoryWritten;
    }

    Danke schonmal
    Geändert von Tomsen1410 (03.02.12 um 18:04 Uhr)
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Hallo,

    ich weiß ja nicht, ob man sich als Anfänger wirklich an solche Kaliber wagen sollte, Injection ist ein heikles Thema. Damit kann man sehr viele böse Dinge tun. Weil ich grade der Meinung bin, das du nichts illegales tun willst, werde ich dir versuchen, deine Fragen zu beantworten:

    1.
    - Prinzipiell ist ein Handle eine Zahl, mit der ein Programm eine Resource nummeriert. Dabei kann es sich z.B. um eine geöffnete Datei, ein Fenster, ein Element auf einem Fenster, ein Socket und so weiter und so fort sein.
    - Ein Pointer - oder zu Deutsch ein Zeiger - ist eine Variable die für nichts anderes da ist, als eine Adresse im Speicher zu beinhalten. Der Pointer zeigt als auf eine ganz bestimmte Stelle im Speicher. Mehr ist das erstmal nicht. An der Adresse im Speicher liegen dann die eigentlichen Nutzdaten. Sozusagen ist der Pointer ein Wegweiser zu den Daten.

    2. HINSTANCE, HANDLE und HWND sind Zeiger für einen bestimmten Zweck. HINSTANCE verwendet man für eine Programminstanz (also einen gestarten Prozess). HANDLE sollte jetzt mal klar sein, es handelt sich um einen Basis-Typ, der für alle möglichen anderen Typen verwendet wird, was man daran sieht, wie HINSTANCE und HWND definiert werden:

    Code c:
    1
    2
    3
    4
    
    typedef PVOID HANDLE; // PVOID ist Pointer auf Void
     
    typedef HANDLE HWND;
    typedef HANDLE HINSTANCE;

    PROCESSENTRY32 ist eine Struktur. Für was sie verwendet wird, kannst du in der MSDN nachlesen: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    fpLoadLibrary ist erstmal nichts andere als eigens definierter Typ. Die Art und Weise, wie er definiert ist, lässt darauf schließen, das es sich um einen Funktionszeiger mit einer Parameterliste von einem Element vom Typ Pointer auf Character (also String) handelt.

    3.
    - VirtualAllocEx ist die Implementierung, um Speicher in dem virtuellen Adressraum eines bestimmten Prozesses Speicher anzufordern. Bessere weil detailierte Erklärung findest du hier: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    - CreateToolhelp32Snapshot macht eine Momentaufnahme eines Prozesses. Was genau gesnapshottet werden soll, wird über Flags gesteuert. Man bekommt ein HANDLE auf den Snapshot-Bereich zurück. Weitere Informationen hier: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    - Process32Next und Process32First werden zum Iterieren über die in einem Systemsnapshot befindlichen Prozesse verwendet. Weitere Informationen hier: http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    4. Habe ich bereits in 2. erklärt. Es handelt sich um die Definition eines Funktionszeigers. Einfaches Beispiel:

    Code c:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
    #include <stdio.h>
    #include <errno.h>
     
    typedef int (*schreibe)(int,char *);
     
    int schreibe_auf_bildschirm(int anzahl, char *wort)
    {
      int i;
      for(i = 0; i < anzahl; i++)
      {
        printf("%s", wort);
      }
     
      return 0;
    }
     
    int schreibe_in_datei(int anzahl, char *wort)
    {
      int i;
      FILE *f = fopen("datei.ext", "w");
      if( f != NULL )
      {
        for( i = 0; i < anzahl; i++ )
        {
          if( fprintf(f, "%s", wort) == 0 )
          {
             fclose(f);
             return errno;
          }
        }
        fclose(f);
        return 0;
      }
      else
      {
        return errno;
      }
    }
     
    int main(int argc, char **argv)
    {
      // Jetzt verwendet wir den Funktionszeiger für das Schreiben auf den Bildschirm
      schreibe schreibefunktion = schreibe_auf_bildschirm;
     
      // eigentlich wird die Funktion schreibe_auf_bildschirm() aufgerufen
      schreibefunktion (10, "Hallo Welt\n");
     
      // Jetzt verwendet wir den Funktionszeiger für das Schreiben in die Datei
      schreibefunktion = schreibe_in_datei;
     
      // eigentlich wird die Funktion schreibe_in_datei() aufgerufen
      schreibefunktion (10, "Hallo Welt\n");
    }

    * ungetestet und aus dem Ärmel geschüttelt
    Tomsen1410 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    Tomsen1410 Tomsen1410 ist offline Mitglied Silber
    Registriert seit
    Oct 2008
    Beiträge
    75
    Danke
    Also ich habe mit Handles etc... schon manchmal programmiert nur wusste ich nicht genau, was das jetzt eigentlich ist. Und ich wusste auch was Pointer sind, nur habe ich mich gefragt ob ein Handle vielleicht ein Pointer auf etwas ist.
    Und nein, ich möchte damit nichts illegales, ich wollte einfach nur zu einem etwas älterem Spiel einen kleinen Hack(unendlich Leben etc.) schreiben zur Übung(natürlich nur SinglePlayer hehe)
    Also vielen Dank für die Antwort!

    EDIT: Ich hätte dann zum Handle noch eine Frage:
    Ist der Handle dann praktisch eine "Index" eines bestimmten Prozesses der läuft(wenn man sich alle Prozesse wie ein Array anschauen würde) ?
    Geändert von Tomsen1410 (04.02.12 um 12:24 Uhr)
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Zitat Zitat von Tomsen1410 Beitrag anzeigen
    Ist der Handle dann praktisch eine "Index" eines bestimmten Prozesses der läuft(wenn man sich alle Prozesse wie ein Array anschauen würde) ?
    Wenn man so will, ja. Aber bei Windows ist ein Handle eigentlich immer ein Zeiger auf eine Ressource. Habe ja in Punkt 2 die Definitionen von HWND und HINSTANCE gezeigt. Wenn du es dir so besser vorstellen kannst:

    Das Handle für eine spezifische Resource in einer Liste ist nicht der Index des Elements sondern ein Zeiger, der auf das Element zeigt.
    Tomsen1410 bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    Tomsen1410 Tomsen1410 ist offline Mitglied Silber
    Registriert seit
    Oct 2008
    Beiträge
    75
    Hey, danke.
    Hatte gestern keine Zeit zum antworten.
    Ich hab da noch einige Fragen zur "Inject" -funktion:
    1. Was genau macht denn die LoadLibrary("KERNEL32") Funktion?

    2. Falls ich das richtig verstanden habe, wird mit der folgenden Zeile ein Pointer auf die "GetProcAddress" Funktion erstellt? Die Zeile:
    "fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");"
    Nur was macht die GetProcAddress Funktion? :P

    3. Was macht "CreateRemoteThread" ?

    Hier die Funktion:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    bool InjectDLL(DWORD ProcessID)
    {
        HANDLE hProc;
        LPVOID paramAddr;
     
        HINSTANCE hDll = LoadLibrary("KERNEL32");
     
        fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");
     
        hProc = OpenProcess (PROCESS_ALL_ACCESS, false, ProcessID);
     
        char dllPath[250] = "C:\\HACKS\\";
     
        strcat(dllPath, FileToInject);
     
        paramAddr = VirtualAllocEx(hProc, 0, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
        bool memoryWritten = WriteProcessMemory(hProc, paramAddr, dllPath, strlen(dllPath)+1, NULL);
     
        CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0);
     
        CloseHandle(hProc);
     
        return memoryWritten;
    }

    Danke für die Geduld :P
    Geändert von Tomsen1410 (05.02.12 um 19:36 Uhr)
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    1: Um eine DLL zu laden und die Funktionen daraus zu verwenden gibt es 2 Möglichkeiten:

    a) Mit einer dazugehörenden lib-Datei kompilieren.
    Vorteil: Man muss sich nicht selbst um das Laden kümmern, das macht der Compiler.
    Nachteil: Wenn die DLL nicht gefunden wird, geht das ganze Programm nicht. Auch, wenn es ohne DLL vielleicht trotzdem Sinn machen würde. Außerdem Speicherverbrauch, falls man die DLL eventuell nicht immer braucht...

    b) LoadLibrary. Eben umgekehrt zu a. Selbst laden, bei Bedarf.

    Dein Befehl läd die kernel32.dll
    Kann man aber leicht über Google herausfinden.

    Normalerweise ist es sinnlos, die kernel32.dll selbst zu laden, weil sie als wahrscheinlich wichtigste dll bei jedem Programm irgendwo gebraucht wird (zB. zum Programmstart selbst) und schon compilermäßig dabei ist.
    Der Beweis dafür ist LoadLibrary. Das kommt nämlich selbst aus der kernel32.dll.
    Wenn die nicht schon geladen wäre könnte man die Funktion gar nicht verwenden.

    Sinn machen kann es nur bei solche Sachen wie Injections etc...wie bei dir.

    2: Mit GetProcAddress kann man aus so einer selbst geladenen dll per Name eine ihrer Funktionen heraussuchen. Man bekommt einen Funktionspointer, über den man die Funktion dann auch aufrufen kann. Bei dir wird die Funktion LoadLibraryA geladen (praktisch LoadLibrary).
    Sieht man aber auch schnell über Google.

    3: MSDN...
    Zitat Zitat von http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437%28v=vs.85%29.aspx
    Creates a thread that runs in the virtual address space of another process.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 12.02.08, 19:26
  2. Antworten: 0
    Letzter Beitrag: 07.08.07, 18:12
  3. MovieClip ohne Klassen initializieren
    Von PixelShader im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 21.10.06, 11:48
  4. Hilfe! Flash Anfänger sucht schnelle Hilfe!
    Von Skydiver2004 im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 02.12.04, 20:26
  5. Antworten: 8
    Letzter Beitrag: 14.06.04, 10:37

Stichworte