locked
Bitte nochmal um Hilfe bei ReadProcessMemory und WriteProcessMemory RRS feed

  • 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 Ronny
    Montag, 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 Basic
    Montag, 28. Dezember 2009 21:37
    Moderator
  • 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
    Ronny

    Dienstag, 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äuft

    Public 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 
    Exit Sub End If Label1.ForeColor = Color.Red Label1.Text = "Game not found!" TextBox1.Text = Nothing Next End Sub End Class
    Dieses Beispiel tut nix weiter als mir den Punktestand von Solitair anzeigen
    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 Ronny
    Dienstag, 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:15
    Beantworter
  • 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ß  Ronny
    Dienstag, 29. Dezember 2009 14:14
  • Bin immer noch nicht weiter unter Xp kein Problem unter Vista 0 Chance
    Habe gedacht das wenn ich den Buffer auf 8 setze, das ich dann weiterkomme aber nix, immer noch das selbe

    Gruß Ronny
    Dienstag, 29. Dezember 2009 16:55
  • 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 Aufrufen GetLastError aus, das mag Informationen zur
    Fehlerursache liefern. Blind sollte man dort nie durchlaufen.

    Gruß Elmar
    Dienstag, 29. Dezember 2009 17:52
    Beantworter
  • 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:56
    Moderator
  • 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ß Ronny
    Dienstag, 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ß Ronny
    Dienstag, 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 Riedener
    Mittwoch, 19. Mai 2010 14:41
  • Hallo Yves,

    Über welchem Code sprichst Du?

    Grüße,

    Robert

    Donnerstag, 20. Mai 2010 06:59
    Moderator
  • den von wildlife
    LG Yves Riedener
    Samstag, 22. Mai 2010 14:30
  • Hallo Yves,

    Lies mal folgenden Diskussionsfaden:

    http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/fe818113-040d-400a-9578-685bad6d1b16

    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:09
    Moderator