Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Fragen - Antworten
Autor
Nachricht
x0X0x
Newbie
Newbie

Anmeldedatum: 02.05.2008
Beiträge: 12

Bestimmte Adresse auslesen
Verfasst am: 02.05.2008, 21:02

Schönen guten Abend allerseits.

Erstmal möchte ich mich hiermit, mit meinem ersten Posting, herzlichst dem Forum begrüßen und euch beglückwünschen, welch eine tolle Community ihr da am Laufen habt.

Nun zu meiner Frage.
Ich würde gerne eine bestimmte Adresse eines Programmes auslesen.
Dazu muss ich den Processhandle der Applikation herausfinden, wobei ich bestimmt API, etc. anwenden muss....
Und weiter weiß ich nicht. Späterstens jetzt solltest Du mitbekommen haben dass ich noch nicht so erfahren bin.
Habt also bitte Verständnis bei Unverständlichkeiten meinerseits, ich bin leider noch Anfänger aber das war jeder einmal von uns, also hoffe ich auf hilfreiche Antworten.
Selbstverständlich könnt ihr nach den nötigen Informationen für eine sinnvolle Antwort nachfragen, ich werde sie gerne beantworten sofern ich dazu in der Lage bin.

Also, könnt ihr mich auf den richtigen Weg zu meinem Ziel führen?

Freundliche Grüße aus Österreich
x0X0x

P.S. Ich bin mir sicher dieses Thema wird unvermeidbar angesprochen werden - ich habe es zur Kenntnis genommen. klick
_________________
 
noname
Poster
Poster

Anmeldedatum: 30.04.2008
Beiträge: 131


Verfasst am: 02.05.2008, 23:04

Herzlich Willkommen,

ich hatte einst das gleiche Interesse und nach ewig langem Suchen habe ich etwas interessantes auf Google gefunden. Damit ließ sich beispielsweise auslesen, wieviel Geld man hatte* etc.

Hier der Code:
Visual Basic: [code]
Function getmoney() As Integer
Dim myProcesses As Process() = Process.GetProcessesByName("hl")
If myProcesses.Length = 0 Then
MsgBox("Process not found!")
Timer1.Stop()
Exit Function
End If

Dim processHandle As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, myProcesses(0).Id)
If processHandle = IntPtr.Zero Then
MsgBox("Process not found!")
Timer1.Stop()
Exit Function
End If
Dim Address(0 To 1) As Integer
Dim vBuffer(0 To 1) As Long
Dim convert(0 To 1) As Integer
Dim byte_array0 As Byte() = Nothing
Address(0) = &H1A1FD4C
ReadProcessMemory(processHandle, Address(0), vBuffer(0), 4, 0)
byte_array0 = BitConverter.GetBytes(vBuffer(0))
convert(0) = BitConverter.ToInt32(byte_array0, 0)
Return convert(0)
End Function
[/code]

Edit: API's vergessen..
Visual Basic: [code]
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
Public Declare 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
Const PROCESS_ALL_ACCESS = &H1F0FFF
[/code]

Edit2: *Wieviel Geld man hatte, schon Klar. Muss dazusagen das es sich um das Spiel Counter-Strike dreht Smile
 
x0X0x
Newbie
Newbie

Anmeldedatum: 02.05.2008
Beiträge: 12


Verfasst am: 03.05.2008, 00:17

Wow... herzlichsten Dank für den Codesnippet..

Frage...
1) Womit steht diese Adresse in Verbindung und wozu ist sie da? Das hab ich irgendwie nicht ganz aus dem Code identifizieren können....
2) Address(0) = &H1A1FD4C
Meine Adresse lautet 9D804, wenn ich &H1A1FD4C durch das ersetze kann er nicht compilieren....
"D" darf nicht zum Beschreiben eines Exponenten verwendet werden. Verwenden Sie stattdessen "E".
Warum denn nicht?... Integer ist Integer, bei Deiner Adresse ist doch auch ein D enthalten... was muss ich da machen? :confused:

//oder muss man da irgendwie für Hexadezimalwerte ein & vor den Zeichen stellen?
 
noname
Poster
Poster

Anmeldedatum: 30.04.2008
Beiträge: 131


Verfasst am: 03.05.2008, 00:26

Ich lese die Adressen mit TSearch (ArtMoney, CheatEnigne) aus. Diese lautet jetzt zum Beispiel 01A1FD4C, jetzt schreibe ich:

Address(0) = &H01A1FD4C

Visual Studio macht die 0 am Anfang automatisch weg:

Address(0) = &H1A1FD4C
 
x0X0x
Newbie
Newbie

Anmeldedatum: 02.05.2008
Beiträge: 12


Verfasst am: 03.05.2008, 00:38

Okay und wofür ist die Adresse der Variable PROCESS_ALL_ACCESS?
 
noname
Poster
Poster

Anmeldedatum: 30.04.2008
Beiträge: 131


Verfasst am: 03.05.2008, 16:49


Const PROCESS_ALL_ACCESS = &H1F0FFF

Das ist afaik nur eine Konstante die bInheritHandle beschreibt, welche für die OpenProcess API benutzt wird.
 
x0X0x
Newbie
Newbie

Anmeldedatum: 02.05.2008
Beiträge: 12


Verfasst am: 04.05.2008, 20:24

Hallo nochmal...
Danke vorerst mal für den Source, hat mir sehr geholfen!

Ich habs jetzt, dass ich den Wert 1 oder 2 zurückgegeben kriege...
Jetzt habe ich WriteProcessMemory deklariert, um wenn der Wert 2 ist ihn auf 1 zu setzen.
Deklaration:
Code:
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByVal lpBuffer As Long, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
Und jetzt die Methode so.....
Code:
WriteProcessMemory(processHandle, Address(0), 1, 1, 0)
-> In Address(0) steckt jetzt eine 2 und mit der Methode will ich das jetzt auf 1 setzen...
Wie mache ich das?

Ich kenn mich noch nicht so aus... sorry.
 
Bahamut
Poster
Poster

Anmeldedatum: 17.04.2008
Beiträge: 142


Verfasst am: 05.05.2008, 09:53

Nun dein Code stimmt eingentlich fast, nur dass der vierte Parameter muss der gleiche sein wie bei ReadProcessMemory -> also auch wieder 4 für 4 Bytes.

Somit sieht der Code dann so aus:

Code:
[COLOR=seagreen]'Deklaration[/COLOR]<br />[SIZE=2][COLOR=#0000ff]Declare [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Function[/COLOR][/SIZE][SIZE=2] WriteProcessMemory [/SIZE][SIZE=2][COLOR=#0000ff]Lib [/COLOR][/SIZE][SIZE=2][COLOR=#a31515]"kernel32"[/COLOR][/SIZE][SIZE=2] ([/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] hProcess [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] lpBaseAddress [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff]ByRef[/COLOR][/SIZE][SIZE=2] lpBuffer [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][SIZE=2] nSize [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff]ByRef[/COLOR][/SIZE][SIZE=2] lpNumberOfBytesWritten [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE][SIZE=2]) [/SIZE][SIZE=2][COLOR=#0000ff]As [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Integer[/COLOR][/SIZE]<br /> <br />[COLOR=#2e8b57]'Code in getmoney(), ganz am Ende kurz vor Return[/COLOR]<br />[SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff]If [/COLOR][/SIZE][SIZE=2][COLOR=black][SIZE=2]convert(0) [/SIZE]= 1[/COLOR] [/SIZE][SIZE=2][COLOR=#0000ff]Then<br />[/COLOR][/SIZE][SIZE=2][COLOR=black]WriteProcessMemory(processHandle, Address(0), 1, 4, 0)[/COLOR]<br />[/SIZE][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff]If<br />[/COLOR][/SIZE][/COLOR][/SIZE][/COLOR][/SIZE]


Eigentlich würd ich für das Schreiben ne extra Funktion empfehlen, aber so ist es wohl am einfachsten zu verstehen.
 
x0X0x
Newbie
Newbie

Anmeldedatum: 02.05.2008
Beiträge: 12


Verfasst am: 05.05.2008, 19:40

Hm.... also nach längerem Grübeln an dem ganzen Code bin ich noch immer nicht auf das richtige Ergebnis gestoßen...
Ich hab alles überprüft - das Process-Handle stimmt, die Adressen sind richtig........ nur wird irgendwie kein Wert in die blöde Adresse geschrieben....
Hier mein Source:
Code:
...<br /><br /><br />    Dim Address(0 To 1) As Integer<br />    Dim vBuffer(0 To 1) As Long<br />    Dim convert(0 To 1) As Integer<br />    Dim byte_array0 As Byte() = Nothing<br /><br />    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click<br />        Address(0) = blabla 'Diese Variable trägt schon die richtige Adresse, nur wie man sie berechnet habe ich aus Platzgründen ausgelassen....<br />        ReadProcessMemory(processHandle, Address(0), vBuffer(0), 4, 0)<br />        byte_array0 = BitConverter.GetBytes(vBuffer(0))<br />        convert(0) = BitConverter.ToInt32(byte_array0, 0)<br />        MessageBox.Show(convert(0)) 'der Wert von  Address(0)<br />    End Sub<br /><br />    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click<br />        WriteProcessMemory(processHandle, Address(0), 2, 1, 0)<br />    End Sub
P.S.: Ich habe es bezüglich des vierten Parameters von WriteProcessMemory auch mit 4 Byte getestet und es funktioniert genau so wenig wie mit 1 Byte..... [img]/sad.gif[/img]

Der Wert in der entgültigen Adresse (Address(0)) wird einfach nicht geändert... es geschieht nichts.

Bitte um Rat.
 
noname
Poster
Poster

Anmeldedatum: 30.04.2008
Beiträge: 131


Verfasst am: 05.05.2008, 19:58

Um welche Anwendung handelt es sich denn?
_________________


 
x0X0x
Newbie
Newbie

Anmeldedatum: 02.05.2008
Beiträge: 12


Verfasst am: 05.05.2008, 20:09


Es handelt sich um das Spiel Battlefield2, Singleplayer...

Alleeess klaaaar............. hat sich erledigt, ich hatte einen falschen Datentyp in der Deklaration von WriteProcessMemory......... bin super froh. Danke nochmals für eure Hilfe! Smile
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB.NET] Fragen - Antworten
 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Frage über mein game 163 25.09.2011, 16:33
Keine neuen Beiträge Wie bringe ich mein Programm dazu, auf Return zu reagieren? 581 24.12.2009, 14:42
Keine neuen Beiträge [Probleme]Hoffe Auf schnelle Antwort 398 16.07.2009, 21:08
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 796 20.05.2002, 00:28
Keine neuen Beiträge Eine kleine Frage an euch.. 906 30.09.2007, 08:57
 




[ Time: 0.3880s ][ Queries: 121 (0.0265s) ][ GZIP on - Debug on ]