Für den Anfang es sind viele Sachen die nur die Basics brauchen in sachen Programmierung die anderen zu finden ist wieder eine andere Sache.
Ich sag mal so wer mit Cheat Engine oder mit Ollydbg noch nie was gemacht hat brauch sich das eigentlich garnicht anschauen ich Pack am Ende ein Video noch hier drauf wo ich mal mein Trainer zeige und etwas dazu sage.
Fangen wir mal an.
Ich Empfehle euch Visual Basic 2010 zu nutzen das Framework 4 ist wirklich gut, Hab es in VB2008 probiert da geht es nicht.
Erstmal die API-Funktion die wir Importieren
PHP Code:
Public Declare Auto Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
Public Declare Auto Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
Public Declare Auto Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Public Declare Auto Function WriteProcessMemory Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Damit öffnet man ein laufenden Prozess um ein Prozesshandle zu erhalten.
Der aufruf nachher
OpenProcess(&H1F0FFF, 0, Prozess(0).Id)
&H1F0FFF steht für PROCESS_ALL_ACCESS das erlaubt uns den Zugriff auf den Speicher.
Die 0 oder auch False das brauchen wir nicht man setzt es True beim Process erstellen wir wollen ja was erhalten und nicht erstellen.
Prozess ID ermitteln wir später dazu komme ich nachher noch.
CloseHandle(ProzessHandle)
Damit schließt man das Handle wieder nachdem man was übergeben hat.
Muss man das JaEin wenn man es nicht schließt nennt man es Datenleck.
Man kann sich das so vorstellen mit OpenProcess und CloseHandle
Ich gebe jemand etwas in die Hand z.B ein Feuerzeug und danach nehme ich ja die Hand wieder zurück und halte nicht mit der Person händchen also läßt man es los in diesem Fall schließen.
ReadProcessMemory
WriteProcessMemory
Diese Funktionen 2 sind gleich, das kann man mit den machen je nachdem was man für ein Wert schreiben will z.B integer, bytearray, Single, Long etc.
Kann man sie umändern.
ReadProcessMemory nehmen wir mal
hProcess As Integer = Das Processhandle das wir mit OpenProcess öffnen
lpBaseAddress As Integer = Die Speicheradresse die wir bearbeiten wollen(Pointer oder normale Adresse)
lpBuffer As Integer = Hier laden wir den inhalt der Zieladresse rein
nSize As Integer = Die Anzahl der Bytes die aus dem Prozess gelsen werden.
Es gibt wenn ich mal Cheat Engine nehme 1 Byte, 2 Bytes, 4 bytes, 8 bytes, Float, Double.
in 4 Bytes stehen z.B Munitionsangaben, teilweise die Engerie etc
in Float laufzahlen Uhrzeit,Laufen,Rennen,Springen
1 Byte gibts auch steht für Aus und An also 0 und 1 (False und True) sowas sucht man damit
Das sind die 3 die am meisten vorkommen.
lpNumberOfBytesWritten As Integer = Hier kommt beim Auslesen garnichts rein weil wir was auslesen, das gibt die größe eines Array an.
Bsp
Dim LALA As Byte() = New Byte() {&H74, &HC}
Die größe des Byte-Arrays ist in dem Beispiel 2 brauch man mehr zum Schreiben als zum Auslesen.
So hätten wir schonmal ein kleinen Teil fertig, ich merke schon ich schreib zu viel.
Es wird jetzt Blöd zum erklären weil ich mit einer Klasse arneite aber egal ich hänge das Projekt und mit ran.
Funktion zum Lesen
PHP Code:
Public LeseBuffer As Long
Public Function AdresseLesen(ByVal ProName As Process, ByVal Adresse As Integer)
Dim Prozess As Process() = Process.GetProcessesByName(ProName.ProcessName)
If Prozess.Length <= 0 Then
Exit Function
End If
Dim ProzessHandle As IntPtr = OpenProcess(&H1F0FFF, 0, Prozess(0).Id)
ReadProcessMemory(ProzessHandle, Adresse, LeseBuffer, 4, Nothing)
CloseHandle(ProzessHandle)
Return LeseBuffer
End Function
ProName ist der Prozessname der wird übergeben beim Funktionsaufruf dafür hab ich mir was schönes ausgedacht
Hier wird die Adresse erwartet beim Funktionsaufruf auch dafür hab ich mir was schönes ausgedacht.
Damit
PHP Code:
If Prozess.Length <= 0 Then
Exit Function
End If
Ist den die größe des Prozess kleiner oder gleich 0.
Wenn es so ist dann beende diese Funktion.
Ist eine Sicherheitsabfrage gegen Crashes.
Die abfrage ist Sicher weil sie erstellt eine Zahl in allen Diminsionen des System Arrays.
Kommen wir zum Schreiben.
PHP Code:
Public Function AdresseSchreiben(ByVal ProName As Process, ByVal Adresse As Integer, ByVal wert As Integer)
Dim Prozess As Process() = Process.GetProcessesByName(ProName.ProcessName)
If Prozess.Length <= 0 Then
Exit Function
End If
Dim ProzessHandle As IntPtr = OpenProcess(&H1F0FFF, 0, Prozess(0).Id)
WriteProcessMemory(ProzessHandle, Adresse, wert, 4, Nothing)
CloseHandle(ProzessHandle)
Return wert
End Function
Ich kümmer mich mal nur um die Funktionsaufruf.
ProName ist geklärt.
Adresse ist geklärt.
Der wer ist nichts anderes als wie das was ihr in diese Adresse reinschreiben wollt.
So sind die 2 Funktionen mal geklärt.
Kommen wir nun zur Form1, ich hab es mir so gedacht ich werde nur die wichtigen Sachen erklären ladet euch dann das Projekt runter und schaut es euch an.
Im Source stehen auch erklärung weil ich nicht auf alles eingehen werde und auch dazu weil C&P = nur Fehler erzeugt daher mach ich es so weil ich weiß das es geht.
Kommen wir zu den globalen Varibalen
PHP Code:
Public SpielName As String = "iw3sp" 'ohne --> .exe <--
Public ModuleName As String = "iw3sp.exe" 'mit --> .exe <-- || oder dll je nachdem
Public Prozess As Process 'erhält später den Prozessnamen
Public ModuleBase As Integer 'erhält später die größe der ModuleBase
Den sehr ihr gut wenn ihr z.B den Taskmanager öffnet auf Prozesse geht,
Die Anwendung sucht einen recht Klick drauf und auf Eigenschaften da sehr ihr das Icon der Anwendung und der Name so wie er richtig ist.
Das war die Art um ganz sicher zu gehen.
Der Modulename ist da wo euere Adressen drin sind und sie sind meist alle im Hauptprozess.
Kommen wir zur ModuleBase da hab ich eine weile dran gesessen und mir was einfallen lassen.
Was ich dazu sagen will man kann diese auch mit Integern Rechnen was ich allerdings sehr Hässlich finde ich Konvertiere alles in Hex so hab ich mehr den durchblick das ist Geschmackssache.
Aber ich hab ihn geschrieben und da hat jeder so seine Art.
PHP Code:
Sub ProzessName(ByRef Prozess As Process, ByRef ModuleBase As String)
Dim BaseAdresse As String
Dim BaseAdresseHex As Integer
Try
Dim p As Process = Process.GetProcessesByName(SpielName)(0)
For Each Module1 As System.Diagnostics.ProcessModule In p.Modules
If Module1.FileName.IndexOf(ModuleName) <> -1 Then
BaseAdresse = Module1.BaseAddress.ToString
Prozess = p
End If
Next
Label2.Text = "Spiel gefunden"
Catch ex As Exception
Label2.Text = "Spiel nicht gefunden"
End Try
BaseAdresseHex = BaseAdresse
ModuleBase = Convert.ToString(BaseAdresseHex, 16)
End Sub
Wie man sieht nutze ich nicht ByVal sondern ByRef ist Basicwissen aber für die die es nicht Wissen.
ByVal erwartet was und ByRef übergibt was.
Als erstes holen wir uns den Prozessnamen.
Dann Suchen wir nachdem Module in diesem Prozess.
Wenn er nichts findet fällt die größe -1,xxxxxxxxxxxxxxxxxxx aus daher die Sicherheitsabfrage.
IndexOf ist sehr nützlich, es gibt die ersten Zahlen aus die in der dem angegeben Module sind also die BaseAdresse.
p = der Prozessname
Dann übergebe wird die BaseAdresse an einen integer übergeben wo sie danach in Hex-Konvertiert wird.
Wieso dieses hin und her-geschiebe ganz einfach die Konvertierung will 2 integer.
Wichtig ist das sie in einen String Konvertiert wird weil durch die Hex-Zeichen A,B,C,D,E,F
Die kann ein integer nicht tragen bzw aufnehmen.
Die 16 bei der Konvertierung steht für die Zahlensystem von Hex
Mehr zu Hex
Hexadezimalsystem
Ausgelesen kann es dann werden .
Das in ein Button
PHP Code:
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim muni1 As String
Dim Munition As Int32 = "&H" & ModuleBase + "&HF46A70"
muni1 = Convert.ToString(Munition, 16)
TextBox1.Text = AdresseLesen(Prozess, "&H" & muni1)
Der Rest sollte klar sein und man läßt den Wert in Textbox ausgeben.
Die Modulebase + Offset das Offset stellt die ADresse da bzw den Pointer den ihr mit Cheat Enginen oder Ollydbg gefunden habt.
Multioffsets brauch man in der Regel GARNICHT sie sind nur dazu da um den Pointer zufinden einen anderen Zweck haben die nicht.
Ich arbeite immer mit Baseadresse + Offset = Zieladresse.
Man kann dies wie schon gesagt auch mit Integern machen ich mag Hex mehr ist halt nichts mit C&P habs geschrieben so wie ich es mag.
Ich zeig euch mal ein Trainer mit dem Source den ich für den CoD4 SinglePlayer gemacht habe was alles mit VB möglich ist nachteil.
VB unterstützt kein Float das ist wirklich Bitter bei sowas aber da hab ich eine Lösung gefunden.
Noch das letzte.
PHP Code:
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim muni1 As String
Dim Munition As Int32 = "&H" & ModuleBase + "&HF46A70"
muni1 = Convert.ToString(Munition, 16)
AdresseSchreiben(Prozess, "&H" & muni1, 999)
So hoffe das ich alles gut erklärt habe soweit.
Es so nutzen ist kein muss nur Vorschlag den Source kann sich ja jeder Anpassen wie er möchte da ich es für ein Freund gemacht habe, habe ich halt dieses Tut gemacht.
In dem Video zeig ich euch mal was mit VB möglich ist die Adressen zu finden
hat gut 13-14 Stunden gedauert für das alles.
Hauptsächlich gearbeitet mit Ollydbg,TSearch und Cheat Engine.
Kann ich ja auch Hochladen wenn jemand lieber den will.
Wichtig ist das ihr dem Programm auch Admin rechte gebt hab ich noch nicht gemacht weil ich VB immer als Admin Starte.
Dann Bastelt was schickes drauß.






