Register for your free account! | Forgot your password?

You last visited: Today at 23:55

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



VB Trainer

Discussion on VB Trainer within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
P-a-i-n's Avatar
 
elite*gold: 0
Join Date: Nov 2009
Posts: 1,258
Received Thanks: 396
VB Trainer

So dann werd ich euch mal Zeigen oder erklären das man mit VB auch den Speicher bearbeiten kann ich persönlich finde es nicht so gut dafür es ist aber möglich.

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 IntegerByVal bInheritHandle As IntegerByVal 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 IntegerByVal lpBaseAddress As IntegerByRef lpBuffer As IntegerByVal nSize As IntegerByRef lpNumberOfBytesWritten As Integer) As Integer
    
Public Declare Auto Function WriteProcessMemory Lib "kernel32" Alias "WriteProcessMemory" (ByVal hProcess As IntegerByVal lpBaseAddress As IntegerByRef lpBuffer As IntegerByVal nSize As IntegerByRef lpNumberOfBytesWritten As Integer) As Integer 
Nehmen wir uns als erstes OpenProcess vor
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 ProcessByVal 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(&H1F0FFF0Prozess(0).Id)
        
ReadProcessMemory(ProzessHandleAdresseLeseBuffer4Nothing)
        
CloseHandle(ProzessHandle)

        Return 
LeseBuffer

    End 
Function 
Auf die Funktion gehe ich nicht mehr ein das hatten wir schon allen nur auf den Funktionskopf.
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 
Damit fragt man nur das ab.
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 ProcessByVal Adresse As IntegerByVal 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(&H1F0FFF0Prozess(0).Id)
        
WriteProcessMemory(ProzessHandleAdressewert4Nothing)
        
CloseHandle(ProzessHandle)

        Return 
wert

    End 
Function 
Ist das selbe wie oben wie man sieht, daran kann man gut erkennen das man diese Funktionen nach seinen belieben Anpassen kann.
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 
Der Spielname ist halt der Prozessname
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 ProcessByRef 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(BaseAdresseHex16)

    
End Sub 
Gehe ich erst mal direkt auf den wieder auf den Aufruf ein.
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(ProzessModuleBase)

        If 
ModuleBase <= 0 Then
            
Exit Sub
        End 
If

        
Dim muni1 As String
        Dim Munition 
As Int32 "&H" ModuleBase "&HF46A70"

        
muni1 Convert.ToString(Munition16)

        
TextBox1.Text AdresseLesen(Prozess"&H" muni1
Als erstes Übergibt man den Prozess und die Modulebase
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(ProzessModuleBase)


        If 
ModuleBase <= 0 Then
            
Exit Sub
        End 
If

        
Dim muni1 As String
        Dim Munition 
As Int32 "&H" ModuleBase "&HF46A70"
        
muni1 Convert.ToString(Munition16)

        
AdresseSchreiben(Prozess"&H" muni1999
Das selbe wie oben nur das man mit dem hier als 3 Parameter den Wert übergibt der in die Adresse geschrieben werden soll.


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ß.
Attached Files
File Type: rar test.rar (155.4 KB, 216 views)
P-a-i-n is offline  
Thanks
12 Users
Old 03/13/2011, 19:14   #2




 
Omdi's Avatar
 
elite*gold: 1
Join Date: Apr 2010
Posts: 13,772
Received Thanks: 15,036
Sehr gutes Tutorial hat mir sehr geholfen
Allerdings würde es mir helfen wenn du noch ein
Paar Tutorial Links zu cheat Engine ,olly usw. Hier
Reinstellen kannst
Omdi is offline  
Thanks
1 User
Old 06/14/2011, 19:21   #3
 
elite*gold: 0
Join Date: Nov 2010
Posts: 700
Received Thanks: 507
Gutes Tutorial hat mir geholfen

Ich hab bisher nur mit vb gearbeitet noch nicht mit c++
Deshalb Daumen hoch und thx
supercracker13 is offline  
Old 11/05/2011, 18:59   #4
 
Ko§oVo's Avatar
 
elite*gold: 0
Join Date: Aug 2011
Posts: 187
Received Thanks: 575
Mfg Ko§oVo

Hallo zusammen.

Kurze Frage ist das mit Offset bzw Pointer?

oder nur die Normalen adressen die sich sowiso wieder ändern...
Ko§oVo is offline  
Old 03/29/2013, 16:11   #5
 
elite*gold: 0
Join Date: Oct 2010
Posts: 25
Received Thanks: 4
Quote:
Originally Posted by Ko§oVo View Post
Hallo zusammen.

Kurze Frage ist das mit Offset bzw Pointer?

oder nur die Normalen adressen die sich sowiso wieder ändern...
Denke mit Offset bzw. Pointer ansonsten würde es sich ned lohen weil du es nur dann solange nutzen kannst bis du das Game neustartest!
dennydenny is offline  
Old 03/29/2013, 16:34   #6
 
elite*gold: 0
Join Date: Mar 2011
Posts: 29
Received Thanks: 15
Quote:
Originally Posted by dennydenny View Post
Denke mit Offset bzw. Pointer ansonsten würde es sich ned lohen weil du es nur dann solange nutzen kannst bis du das Game neustartest!
Scooped is offline  
Thanks
1 User
Reply




All times are GMT +1. The time now is 23:56.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.