Ich habe mit AutoIt genug Trainer geschrieben, jetzt steige ich dafür auf VB um.
Das Spiel: Stronghold Crusader (Zum Trainer testen sehr gut geeignet)
In Autoit habe ich folgende adresse angegeben (Für Gold): 0x0116BCD0
Funktioniert alles Super.
Nun aber in VB:
'################################################# ########################################
'#---------------------------- Schreiben der Werte --------------------------------------#
'################################################# ########################################
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim Gold1 As String
Dim Gold As Int32 = "&H" & ModuleBase + "&H0116BCD0"
Gold1 = Convert.ToString(Gold, 16)
AdresseSchreiben(Prozess, "&H" & Gold1, 1)
End Sub
'#---------------------------- Schreiben der Werte --------------------------------------#
'################################################# ########################################
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim Gold1 As String
Dim Gold As Int32 = "&H" & ModuleBase + "&H0116BCD0"
Gold1 = Convert.ToString(Gold, 16)
AdresseSchreiben(Prozess, "&H" & Gold1, 1)
End Sub
Dort funktioniert die Adresse in dem Format nicht.
Beim Auslesen kommt eine "0" raus, also liegt es ja an der Adressen angabe.
Die Adresse selbst funktioniert ja in Autoit.
Das komplette VB Trainer modul:
Imports System.Runtime.InteropServices
Imports System.Drawing.Drawing2D
Public Class Form1
'################################################# ########################################
'#--------------------------- Globale Varibalen -----------------------------------------#
'################################################# ########################################
Public SpielName As String = "Stronghold Crusader" 'ohne --> .exe <--
Public ModuleName As String = "Stronghold Crusader.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
'################################################# ########################################
'#----------------------------- FormClosed ----------------------------------------------#
'################################################# ########################################
''' <summary>
''' Die Dll entladen
''' </summary>
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
'---> Anfang für die DLL
Try
Me.KeyboardHook1.RemoveHook()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
'Ende <---
End Sub
'################################################# ########################################
'#------------------------------ FormLoad -----------------------------------------------#
'################################################# ########################################
''' <summary>
''' Die Dll aus den Ressourcen laden
''' </summary>
'''
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Process.EnterDebugMode()
'---> Anfang für die DLL
System.Reflection.Assembly.Load(My.Resources.Windo wsHookLib1)
Try
Me.KeyboardHook1.InstallHook()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
'Ende <---
End Sub
'################################################# ########################################
'#------------------------------ KeyDown ------------------------------------------------#
'################################################# ########################################
''' <summary>
''' Hier kommen alle Hotkeys rein und Funktionen
''' </summary>
'''
Private Sub KeyboardHook1_KeyDown(ByVal sender As Object, ByVal e As WindowsHookLib.KeyBoardEventArgs) Handles KeyboardHook1.KeyDown
'Gute HotKeyLip
If e.KeyValue = Keys.NumPad1 Then
MsgBox("Hallo")
End If
End Sub
'################################################# ########################################
'#--------------------- Prozessname und ModuleBase --------------------------------------#
'################################################# ########################################
''' <summary>
''' Spielname suchen wenn vorhanden dann den Modulename suchen
''' Mit indexOf die erste vorkommende Zeichenkette suchen(Die Baseadresse)
''' BaseAdresse in einen String packen (damit auch Buchstaben übergeben werden können)-> daher String
''' gefundener Spielname in p an Prozess übergeben
''' Baseadresse konvertieren zu Hex und an die Modulebase übergeben
''' Noch eine kleine Klarstellung manche denken sicher was ist wenn die Modulebase
''' z.B A,B,C enthält und an einen integer gibt kommt es doch zu Fehler, die Antwort dazu,
''' Nein, weil man sie als integer ausliest und sie noch zu Hex-konvertieren muss.
''' Verwendung wo man möchte übergabe durch ByRef
''' </summary>
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
'################################################# ########################################
'#--------------------------- Lesen der Werte -------------------------------------------#
'################################################# ########################################
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim muni1 As String
Dim Munition As Int32 = "&H" & ModuleBase + "&H0116BCD0"
muni1 = Convert.ToString(Munition, 16)
TextBox1.Text = AdresseLesen(Prozess, "&H" & muni1)
End Sub
'################################################# ########################################
'#---------------------------- Schreiben der Werte --------------------------------------#
'################################################# ########################################
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim Gold1 As String
Dim Gold As Int32 = "&H" & ModuleBase + "&H0116BCD0"
Gold1 = Convert.ToString(Gold, 16)
AdresseSchreiben(Prozess, "&H" & Gold1, 1)
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim g As Graphics = e.Graphics
Dim rechteck As New Rectangle(1, 1, 500, 355)
Dim Verlauf As New LinearGradientBrush(rechteck, Color.DarkCyan, Color.Black, LinearGradientMode.Vertical)
g.FillRectangle(Verlauf, rechteck)
End Sub
End Class
Imports System.Drawing.Drawing2D
Public Class Form1
'################################################# ########################################
'#--------------------------- Globale Varibalen -----------------------------------------#
'################################################# ########################################
Public SpielName As String = "Stronghold Crusader" 'ohne --> .exe <--
Public ModuleName As String = "Stronghold Crusader.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
'################################################# ########################################
'#----------------------------- FormClosed ----------------------------------------------#
'################################################# ########################################
''' <summary>
''' Die Dll entladen
''' </summary>
Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
'---> Anfang für die DLL
Try
Me.KeyboardHook1.RemoveHook()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
'Ende <---
End Sub
'################################################# ########################################
'#------------------------------ FormLoad -----------------------------------------------#
'################################################# ########################################
''' <summary>
''' Die Dll aus den Ressourcen laden
''' </summary>
'''
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Process.EnterDebugMode()
'---> Anfang für die DLL
System.Reflection.Assembly.Load(My.Resources.Windo wsHookLib1)
Try
Me.KeyboardHook1.InstallHook()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
'Ende <---
End Sub
'################################################# ########################################
'#------------------------------ KeyDown ------------------------------------------------#
'################################################# ########################################
''' <summary>
''' Hier kommen alle Hotkeys rein und Funktionen
''' </summary>
'''
Private Sub KeyboardHook1_KeyDown(ByVal sender As Object, ByVal e As WindowsHookLib.KeyBoardEventArgs) Handles KeyboardHook1.KeyDown
'Gute HotKeyLip
If e.KeyValue = Keys.NumPad1 Then
MsgBox("Hallo")
End If
End Sub
'################################################# ########################################
'#--------------------- Prozessname und ModuleBase --------------------------------------#
'################################################# ########################################
''' <summary>
''' Spielname suchen wenn vorhanden dann den Modulename suchen
''' Mit indexOf die erste vorkommende Zeichenkette suchen(Die Baseadresse)
''' BaseAdresse in einen String packen (damit auch Buchstaben übergeben werden können)-> daher String
''' gefundener Spielname in p an Prozess übergeben
''' Baseadresse konvertieren zu Hex und an die Modulebase übergeben
''' Noch eine kleine Klarstellung manche denken sicher was ist wenn die Modulebase
''' z.B A,B,C enthält und an einen integer gibt kommt es doch zu Fehler, die Antwort dazu,
''' Nein, weil man sie als integer ausliest und sie noch zu Hex-konvertieren muss.
''' Verwendung wo man möchte übergabe durch ByRef
''' </summary>
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
'################################################# ########################################
'#--------------------------- Lesen der Werte -------------------------------------------#
'################################################# ########################################
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim muni1 As String
Dim Munition As Int32 = "&H" & ModuleBase + "&H0116BCD0"
muni1 = Convert.ToString(Munition, 16)
TextBox1.Text = AdresseLesen(Prozess, "&H" & muni1)
End Sub
'################################################# ########################################
'#---------------------------- Schreiben der Werte --------------------------------------#
'################################################# ########################################
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
ProzessName(Prozess, ModuleBase)
If ModuleBase <= 0 Then
Exit Sub
End If
Dim Gold1 As String
Dim Gold As Int32 = "&H" & ModuleBase + "&H0116BCD0"
Gold1 = Convert.ToString(Gold, 16)
AdresseSchreiben(Prozess, "&H" & Gold1, 1)
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim g As Graphics = e.Graphics
Dim rechteck As New Rectangle(1, 1, 500, 355)
Dim Verlauf As New LinearGradientBrush(rechteck, Color.DarkCyan, Color.Black, LinearGradientMode.Vertical)
g.FillRectangle(Verlauf, rechteck)
End Sub
End Class
Ich hoffe ihr könnt mir sagen was falsch ist :/
Gruß