[TuT] Hack-Injector

10/24/2010 10:05 Anfang!#1

TuT : Hack-Injector

__________________________________________

1.0 Einleitung
1.1 Benötigte Tools
2.0 Theorie
2.1 Der Injector
__________________________________________

__________________________________________

1.0 Einleitung

Ich werde in diesem Tutorial alles so einfach wie möglich zu erklären,
und kein Fachchinesisch verwenden.
Daher sollte das Tutorial auch für Einsteiger bestens geignet sein.
Den Hack-Injector werde ich in Visual Basic .Net schreiben.
Bitte beachtet, dass dieses Tutorial nicht ohne meine Erlaubnis kopiert
werden darf.

__________________________________________

__________________________________________

1.1 Benötigte Tools

Um den Hack zu schreiben, braucht ihr 3 Dinge:
[Only registered and activated users can see links. Click Here To Register...] [Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...] Zeit & Geduld
[Only registered and activated users can see links. Click Here To Register...] Grundlegende Visual Basic .Net Kenntnisse

__________________________________________

__________________________________________

2.0 Theorie

Ein Injector injeziert (daher der Name) einen Hack (meistens ein Dynamic Link Library) in einen Prozess.
z.B. bei Warrock:
Der Injector injeziert den Hack (Hack.dll) in den Prozess (Warrock.exe).

Das ganze kann ziemlich einfach realisiert werden.
Man benötigt dazu einige API-Aufrufe und grundlegende Visual Basic Kenntnisse.
Ich werde nachfolgend alles genau Kommentieren. So sollte es zu keine Verständniss-Schwierigkeiten kommen.

__________________________________________

__________________________________________

2.1 Der Injector

Als erstes erstellen wir in der Entwicklerumgebung (Visual Basic 2010 EE) ein neues Projekt.

[Only registered and activated users can see links. Click Here To Register...]

Nun passen wir die Form-Eigenschaften wie z.B. Icon, Formname usw. an, womit ihr bereits Erfahrung haben solltet.
Sobald ihr fertig seit, sollte es so aussehen:

[Only registered and activated users can see links. Click Here To Register...]

Jetzt müssen wir einige Steuerelemente erstellen:
Label: lblHack
Label: lblProcess
Textbox: txtHack
Textbox: txtProcess
Button: cmdInject
Timer: tmInject

Beim Timer setzen wir den Interval noch auf 50.
Nun sieht es in etwa so aus:

[Only registered and activated users can see links. Click Here To Register...]

Das Design haben wir nun.
Jetzt kommt es zum etwas anspruchsreicheren Teil.
Zum programmieren.

Zunächst brauchen wir folgende API-Funktionen.
(Diese kommen direkt unter die Public Class Form1).

Code:
Private TargetProcessHandle As Integer
Private pfnStartAddr As Integer
Private pszLibFileRemote As String
Private TargetBufferSize As Integer

Public Const PROCESS_VM_READ = &H10
Public Const TH32CS_SNAPPROCESS = &H2
Public Const MEM_COMMIT = 4096
Public Const PAGE_READWRITE = 4
Public Const PROCESS_CREATE_THREAD = (&H2)
Public Const PROCESS_VM_OPERATION = (&H8)
Public Const PROCESS_VM_WRITE = (&H20)

Public Declare Function ReadProcessMemory Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByVal lpBuffer As String, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer) As Integer

Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" ( _
ByVal lpLibFileName As String) As Integer

Public Declare Function VirtualAllocEx Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpAddress As Integer, _
ByVal dwSize As Integer, _
ByVal flAllocationType As Integer, _
ByVal flProtect As Integer) As Integer

Public Declare Function WriteProcessMemory Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByVal lpBuffer As String, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer) As Integer

Public Declare Function GetProcAddress Lib "kernel32" ( _
ByVal hModule As Integer, ByVal lpProcName As String) As Integer

Private Declare Function GetModuleHandle Lib "Kernel32" Alias
"GetModuleHandleA" ( _
ByVal lpModuleName As String) As Integer

Public Declare Function CreateRemoteThread Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpThreadAttributes As Integer, _
ByVal dwStackSize As Integer, _
ByVal lpStartAddress As Integer, _
ByVal lpParameter As Integer, _
ByVal dwCreationFlags As Integer, _
ByRef lpThreadId As Integer) As Integer

Public Declare Function OpenProcess Lib "kernel32" ( _
ByVal dwDesiredAccess As Integer, _
ByVal bInheritHandle As Integer, _
ByVal dwProcessId As Integer) As Integer

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Integer

Private Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" ( _
ByVal hObject As Integer) As Integer
Gut, die API Funktionen brauchen wir jetzt, um die eigentliche Injection vorzunehmen.
Die Injection schreiben wir in eine eigene Sub.
So können wir sie später perfomanter verwenden.

Code:
Private Sub Inject()
        Dim TargetProcess As Process() = Process.GetProcessesByName(txtProcess.Text) ' Der Ziel Prozess
        Dim Rtn As Integer
        Dim LoadLibParamAdr As Integer

        tmInject.Stop() ' Den Injection-Timer stoppen

        Try
            TargetProcessHandle = OpenProcess(PROCESS_CREATE_THREAD Or PROCESS_VM_OPERATION Or PROCESS_VM_WRITE, False, TargetProcess(0).Id) ' Den Ziel-Process öffnen
            pszLibFileRemote = txtHack.Text ' Die Hack-DLL
            pfnStartAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA") ' Die Start-Adresse ermitteln
            TargetBufferSize = 1 + Len(pszLibFileRemote)
            LoadLibParamAdr = VirtualAllocEx(TargetProcessHandle, 0, TargetBufferSize, MEM_COMMIT, PAGE_READWRITE) 
            Rtn = WriteProcessMemory(TargetProcessHandle, LoadLibParamAdr, pszLibFileRemote, TargetBufferSize, 0) 
            CreateRemoteThread(TargetProcessHandle, 0, 0, pfnStartAddr, LoadLibParamAdr, 0, 0)
            CloseHandle(TargetProcessHandle) ' Injector aus dem Prozess "entfernen"

        Catch ex As Exception ' Falls ein Fehler auftritt
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
            Me.Close()
        End Try
End Sub
[Only registered and activated users can see links. Click Here To Register...]

Jetzt sind wir gleich fertig.
Wir müssen noch im Tick-Event des Timers 'tmInject' die Sub aufrufen:

Code:
Private Sub tmInject_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmInject.Tick
        Call Inject() ' Die Injection-Sub aufrufen
End Sub
Außerdem müssen wir jetzt noch beim cmdInject_Click-Event den Timer 'tmInject' starten:

Code:
Private Sub cmdInject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdInject.Click
        tmInject.Start() ' Den Timer starten
End Sub
Nun sind wir fertig.
Ihr könnt den Injector nun beliebig erweitern.
Zum Beispiel: Automatisches schließen nach der Injection, AutoInject, Hack / Process Saving usw.

Ich hoffe das Tutorial war hilfreich.
Ein Thanks tut auch nicht weh.

Ich habe den Sourcecode als Projekt im Anhang hinzugefügt.

__________________________________________
10/24/2010 12:48 .Tyccinuy!#2
Nice Tutorial, werde mich auchmal ran machen.
10/24/2010 13:43 Ende!#3
Nettes Tutorial, wäre aber vllt nicht von Nachteil, wenn du zumindest mal so grundlegend erklären würdest, das diese "Inject" Funktion überhaupt genau macht. Ich denke, dass das die Anfänger (an die sich das Tutorial ja wendet) vmtl recht wenig interessieren wird, aber imo sollte man trotzdem einfach wissen, was der Code den man verwendet überhaupt tut - auch als Anfänger ;p
10/26/2010 15:58 K1ng106#4
Das Tutorial ist schlecht gemacht da du nicht viel erklärst!

PS: Beim ersten code sind Fehler drinnen!
10/26/2010 16:03 Anfang!#5
Es sind keine Fehler drinnen, da ich es natürlich selbst getestet habe ;)
Naja, bei API Deklarationen gibt es nicht wirklich viel zu erklären.
10/26/2010 16:20 K1ng106#6
Bei mir sind aber Fehler drinnen!

In dem berreich sind die Fehler:
Code:
Private Declare Function GetModuleHandle Lib "Kernel32" Alias
"GetModuleHandleA" ( _
ByVal lpModuleName As String) As Integer
10/26/2010 21:42 Anfang!#7
Wo bitte ist da ein Fehler?
Das angehängte Beispielprojekt funktioniert und ist der selbe Code.
Hast du eventuell "Option Strict On"?
10/26/2010 22:42 K1ng106#8
Quote:
Originally Posted by Anfang! View Post
Wo bitte ist da ein Fehler?
Das angehängte Beispielprojekt funktioniert und ist der selbe Code.
Hast du eventuell "Option Strict On"?
Puhh.. Weiß ich garnicht!
Aber bei mir wurden hier Fehler angeszeigt:
Code:
Alias
"GetModuleHandleA"
10/27/2010 19:24 Anfang!#9
Hm.. Kannst mal einen Screenshot davon machen?
Bei mir gibt es keine Fehler.
10/28/2010 20:05 K1ng106#10
Entschuldige aber hat etwas lange gedaurt!
Hier der Screen: [Only registered and activated users can see links. Click Here To Register...]

MFG K1ng106
10/29/2010 23:22 K1ng106#11
/push
10/31/2010 02:05 Amphy94#12
Getestet und funtkoniert.

Nice
01/01/2011 20:15 supercracker13#13
Bei mir funz es auch nit

kann mir das mal jemand das mal erklären
ich hatte den selben fehler also brauche ich keine screens
01/02/2011 15:25 krustx#14
sry, aber ich finde das ist kein tut, sondern eine Einladung zum C&P, das sieht man auch an den anderen Antworten, sorry K1ng106, aber wenn du noch nicht mal weißt, wie man eine API Funktion aufruft, geschweigedenn einen Zeilenumbruch zu entfernen, dann solltest du verdammt nochmal anfangen die sprache zu lernen!

wozu wird ein timer benötigt ? Wenn man einmal eine dll injiziert hat, die einen Thread im Fremdprozess startet, dann läuft dieser für gewöhnlich durchgehend, warum sollte man die dll im Intervall von 50 ms durchgehend injizieren ?
Noch etwas, du holst die API Funktionen, die du garnicht verwendest, zB ReadProcessMemory
01/18/2011 14:35 xEncounter#15
@K1ng106

#reported cause doublepost

lese dir bitte in Ruhe die Forenregeln durch.