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
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
x0X0x 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
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
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
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
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
-> 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
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
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
Anmeldedatum: 30.04.2008 Beiträge: 131
Verfasst am: 05.05.2008, 19:58
Um welche Anwendung handelt es sich denn? _________________
x0X0x 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!