Fragensteller
Bitte nochmal um Hilfe bei ReadProcessMemory und WriteProcessMemory

Frage
-
So habe mein letztes Projekt erstmal abgebrochen weil ich dieses "ReadProcessMemory" und "WriteProcessMemory" nicht verstehe. Hat Jemand vieleicht eine schöne Seite wo das ganze an einem funtionierenden Beispiel erleutert ist, oder vieleicht sogar ein Projekt an dem ich das ganze mal Probieren kann.
Nach dem ich den ganzen Tag schon rumprobiert habe, bin ich jetzt echt verzweifelt, wenn ich mal etwas funktionierendes hätte, andem ich sehe das es überhaupt geht, dann komme ich vieleicht weiter.
Lg RonnyMontag, 28. Dezember 2009 17:14
Alle Antworten
-
Hallo Ronny,
einfach mal ein wenig Google bemühen, dann findet man schon einige Beispiele. Gut, viele nicht in VB.NET, aber zumindest C#, wie dieses hier:
FreeCell & Hearts, Behind the scenes
http://www.codeproject.com/KB/trace/freecellreader.aspx
Und natürlich das Du selber gefunden hast für C++:
http://www.elitepvpers.de/forum/gamehacking-coding/225242-tutorial-gamehacking-howto-i-ger.html
Du musst Dich halt ein wenig damit auseinandersetzen und den dort verwendeten Code verstehen. Aber das würde ich als Grundvoraussetzung betrachten, wenn man im Speicher fremder Prozesse rumfuhrwerken möchte. Das ist sicher nicht das trivialste Thema und Du möchtest dabei auch was lernen.
Thorsten Dörfler
Microsoft MVP Visual BasicMontag, 28. Dezember 2009 21:37Moderator -
Hallo Torsten
Ich Danke Dir für dieses Beispiel, und werde mich auch gleich damit befassen, klar möchte ich was lernen, und bisher hatte ich damit auch immer Erfolg. Aber Dieses Thema raubt mir zur Zeit den letzten Nerv. Ich werde heute nochmal ganz von vorne beginnen, jetzt nachdem ich geschlafen habe, und den Kopf wieder etwas frei habe, bin ich mir fast sicher, das meine in den letzten 2 Tagen Programmierten Programme garnicht so falsch sind, sonder meine dazu verwendeten Speicheradressen. Kennst Du zufällig eine von irgend einem Programm in (Standartprogramm das Jeder hat) eine statische Speicheradresse die sich zum Testen eignet? Wie gesagt ich habe dieses Tool "Cheat Engine 5.5" (freeware) zum ermitteln von Speicheradressen benutzt wenn ich dort eine Speicheradresse gefunden habe zb. Punktestand Solitär konnte ich den dort wunderbar ändern, in Visalbasic allerdings nicht habe zwar Das Programm immer gefunden, doch beim auslesen der Speicheradresse mittles ReadProcessMemory erhalte ich immer den Wert 0, naja solange ich den Wert nicht lesen kann brauche ich garnicht versuchen ihn zu schreiben/verändern. Deswegen fragte ich,
ob Jemand vllt Vieleicht einen funktionierenenden Beispielcode hat, um zusehen was ich bis jetzt falsch gemacht habe. Und dieses Beispiel in C++ mmh ich verstehe leider nicht viel von C++. Trotzdem habe ich versuch mir dieses Programm in C++ nachzubauen und in Vb.net zu übersetzen, Naja dabei musste ich feststellen das C++ nicht mein Ding, ist und eine vernünftige Übersetzung kamm dabei auch nicht raus. Ich bin eigentlich kein Freund von Copy/ Paste weil man nix daraus lernt, allerdings kann manchmal einen fertigen funktionierenden Code, dazu verwenden, um ihn zu zerlegen und zu verstehen was da eigentlich passiert. Ob mir dein neues Beispiel in C# weitehilft wird sich zeigen, bin froh das ich mit Visual Basic langsam aber sicher klar komme, vor noch nicht ganz einem Jahr wusste ich noch nichtmal was Visual Basic ist. Habe seit dem gute Fortschritte gemacht und auch schon viele, teilweise sehr aufwendige Programme geschrieben. Beim lernen von Visual Basic war mir dieses Forum hier immer eine sehr grosse hilfe, denn Foren gibt es viele, jedoch klare ausagekräftige Antworten sind schwer zu finden. Falls noch Jemand noch ein schönes Beispiel für Vb.net findet, was sich mit "ReadProcessMemory" und "WriteProcessMemory" aus einandersetzt wäre ich sehr dankbar da ich dann dieses Übersetzungsproblem nicht habe.
viele Grüße
RonnyDienstag, 29. Dezember 2009 08:11 -
Hallo nochmal
Also mein Code ist garnicht so falsch, mein Problem warum es nicht geht scheint ganz woanders zu liegen.
Habe mal ein kleines Beispiel gemacht, in dem es erstmal nur um "ReadProcessMemory" geht. Dabei bin ich auf folgendes Problem gestoßen
und zwar funktioniert der Code fehlerfrei auf Windows Xp 32 Bit aber auf Vista 64 bit wird der Wert immer nur 0 angezeigt. Kann es sein Vista keinen zugriff auf den Speicher zuläst???? Alles was ich bis jetzt probiert habe funktioniert auf dem XP Rechner aber nicht auf meinen Hauptrechner mit Vista 64 Bit
Hier mal das Beispiel was auf Xp Fehlerfrei läuftPublic Class Form1 Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer Private 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 Dim ExeName As String = "sol" '!!Ohne ".exe"!! Dim Prozess1 As Process Public RBuff As Long Dim pList() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcesses 'liste aller activen Processe Public Function ReadLong(ByVal ProcessName As Process, ByVal Address As Integer) Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName) If GameLookUp.Length = 0 Then End End If Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id) ReadProcessMemory(processHandle, Address, RBuff, 4, Nothing) CloseHandle(processHandle) Return RBuff End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click pList = System.Diagnostics.Process.GetProcesses For Each proc As System.Diagnostics.Process In pList 'Dim Name As String = proc.ProcessName 'ListBox1.Items.Add(Name) If proc.ProcessName = ExeName Then Prozess1 = proc Label1.ForeColor = Color.Green Label1.Text = "Spiel gefunden" TextBox1.Text = ReadLong(Prozess1, "&H000AA830")'Punktestand
Dieses Beispiel tut nix weiter als mir den Punktestand von Solitair anzeigen
Exit Sub End If Label1.ForeColor = Color.Red Label1.Text = "Game not found!" TextBox1.Text = Nothing Next End Sub End Class
Unter vista nennt sich der Process nicht "sol" sondern "Solitair aber waum bekomme ich unter Vista immer nur 0 angezeigt
die Speicheradresse ist unter Vista auch anders als unter Xp ( 01007170) aber auch wenn ich die richtige Adresse unter Vista benutze ist der Value der gelesen wird immer 0
Wo liegt der entscheidente unterschied zwischen XP und Vista? Auch ein ausführen als Administrator bringt mich nicht weiter???
Lg RonnyDienstag, 29. Dezember 2009 10:38 -
Hallo Ronny,
der entscheidende Unterschied ist 32-Bit und 64-Bit, d. h. die Größe einer Adressse (IntPtr)
ist einmal 4 Bytes und im zweiten Falle 8 Bytes. Einiges dazu findest Du in
Everything You Need To Know To Start Programming 64-Bit Windows Systems
Code, der direkt auf die Speicheradressen eines Prozesses zugreift ist,
ist vom Betriebssystem abhängig, da sich damit die Speicherverwaltung ändert.
Empfehlenswert ist es, sich anfangs auf eine Plattform zu konzentrieren,
denn alles plattformunabhängig zu gestalten, ist eine Aufgabe für sich.
Gruß Elmar
Dienstag, 29. Dezember 2009 11:15Beantworter -
Danke Elmar
das Problem hatte ich in anderen Anwendung auch schon, habe mich dort aber immer beholfen in dem ich die WindowsVersion ausglesen habe und dann mit einer If Abfrage die Werte bestimmt habe : Also wenn wenn Windowsplatform 32Bit dann Wert ...... Else 64 Bit dann Wert ...
Aber wie das mit dem 8 Bit jetzt umsetze muss ich mir nochmal genauer anschauen. Aber der Tip bringt mich warscheinlich weiter.
So langsam läst mich das ganze keine Ruhe mehr. Habe gestern den gesamten Tag damit zugebracht den Code hier auf 64Bit zum laufen zubringen, und heute morgen musste ich feststellen das er auf XP die ganze Zeit schon funktionierte. Aber 64 Bit ist mir wichtiger.
Gruß RonnyDienstag, 29. Dezember 2009 14:14 -
Hallo Ronny,
ich habe hier gerade kein 64-Bit System zur Hand, so dass ich nicht selbst probieren kann.
Laut http://stackoverflow.com/questions/1332067/problem-using-openprocess-and-readprocessmemory
könnte jedoch ein fehlendes VirtualProtectEx die Ursache sein.
Zudem solltest Du PROCESS_ALL_ACCESS reduzieren auf PROCESS_VM_READ,
denn in Process Security and Access Rights findet sich der Hinweis, dass dies
zuviel für Windows Vista++ sein kann.
Und werte nach solchen AufrufenGetLastError
aus, das mag Informationen zur
Fehlerursache liefern. Blind sollte man dort nie durchlaufen.
Gruß ElmarDienstag, 29. Dezember 2009 17:52Beantworter -
Hallo Wild-Life78,
Schau Dir die folgende Diskussion an. Vielleicht findest Du etwas dass Dir weiter helfen kann.
http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/80072c5a-52b1-4d07-b3b3-db6b25df24f8
Als erstes sehe ich dass die Deklaration dieser Funktion (ReadProcessMemory) nicht so wie bei Dir aussieht.
http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/16385422-a1b6-4b8c-9029-3b89a958365d
Grüße,Robert
Dienstag, 29. Dezember 2009 17:56Moderator -
So habe soweit ich mir das übersetzen konnte, das ganze mal angeschaut. Habe mich auch noch auf anderen Seiten belesen, unter Windows7 64 bit scheint es dasselbe Problem zu geben, also stehe ich damit nicht ganz alleine da, leider hilft mir das nicht weiter, denn in keinem der Problem Treads ist eine wirklich funktionierende Lösung zu finden.
Robert Du hast Recht das meine Deklaration anders ist, habe auch mal andere ausprobiert, Immer das gleiche fast alles was ich gefunden habe funktioniert unter Xp und unter Vista nicht.
Gruß RonnyDienstag, 29. Dezember 2009 19:58 -
Ich habe mir jetzt Die ganze Diskussion angschaut, und eigentlich fast alles ausprobiert, ich kann nicht behaupten das ich alles verstanden habe, dazu fehlt es mir an Erfahrung, aber im vergleich zu der Version die ich bereit,s unter Xp getetstet habe, ist das einfach nur, noch verwirrender und zu funktionieren scheint das auch nicht. Hier im Forum sind jede Menge Profis am Werk, arbeitet denn niemand von Euch mit 64Bit und kann mir den gefallen tun, und das mal für mich testen, ob es unter "64Bit" überhaupt möglich ist einen Wert aus dem Speicher zu lesen und gegebenfalls zu ändern. Unter Xp scheint es so einfach zu sein, naja nicht einfach, aber für mich noch einigermaßen nachvollziehbar. Ich würde hier nicht fragen wenn es mir nicht wirklich wichtg wäre.
So nun gebe ich für Heute auf.
Gute Nacht ... (-:
Gruß RonnyDienstag, 29. Dezember 2009 23:20 -
Also danke für den code, sieht gut aus. Aber bei mir zeigt es immer 0 an(bei zahl und bei Text).
1. Wie kann ich die Adresse finden? (Im Moment nutze ich Cheat Engine)
2. Ich habe 64bit win7 kann ich machen, dass es auf 64bit und auf 32bit läuft?
LG Yves RiedenerMittwoch, 19. Mai 2010 14:41 -
Hallo Yves,
Lies mal folgenden Diskussionsfaden:
In diesem Beitrag wird etwas um einen 0 Wert gesprochen.
Bitte öffne immer ein Neuer Thread für eine Neue Frage.
Danke und Grüße,
Robert
Freitag, 28. Mai 2010 09:09Moderator