vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 17.02.05 02:46

Hallo erstmal,

ich bin relativ ein Anfänger in Sachen VB und eigentlich ist mein Fachgebiet PHP, nur leider komme ich nicht drumherum mich mit VB zu beschäftigen.
Folgendes Problem:
Ich benötige ein Script, welches aller 30 sek. eine Webseite aufruft und einen Wert vom Typ String sendet. Dieser Wert soll von einem Spiel aus dem Speicher ausgelesen werden.
Soweit so gut, habe ich das auch hinbekommen und zwar habe ich die API "ReadProcessMemory" dazu benutzt.
Nur möchte ich aber auch zusätzlich noch eine andere Seite aufrufen und zwar genau dann, wenn das Spiel beendet ist. Und ganau an dieser Stelle fangen meine Probleme an!
Denn die Speicheradresse, welche den Wert für das Spielende hat, ist vom Typ Integer (1 Byte). Nur leider funtzt das bei mir mit den ReadProcessMemory nicht. Da der Wert im Speicher vom Typ Integer ausgibt. Hier mal ein Beispielcode:

'1. Adresse:  &H2F7E684 = Servername
'2. Adresse:  &H122A220 = Gibt beim laufenden Spiel 1und bei Spielende 0 zurück
 
 
Const hMemAddr = &H2F7E684  'Speicheradressen (siehe oben)
Const sProcessID = "Fenstertitel meines Games" 'das sagt eigentlich schon alles 
' ;)
 
Private Sub Form_Load()
 
   Dim hwnd As Long
   Dim pid As Long
   Dim pHandle As Long
 
 
   hwnd = FindWindow(vbNullString, sProcessID)
   If (hwnd = 0) Then
      MsgBox "Window not found!"
      Exit Sub
   End If
 
 
   GetWindowThreadProcessId hwnd, pid
 
   pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
   If (pHandle = 0) Then
      MsgBox "Couldn't get a process handle!"
      Exit Sub
   End If
   Timer1.Enabled = True
 
End Sub
 
 
Private Sub Timer1_Timer()
 
   ' Declare some variables we need
   Dim hwnd As Long
   Dim pid As Long
   Dim pHandle As Long
   Dim sOutput As String * 20 ' Logisch, definiert sOutput als String
 
   hwnd = FindWindow(vbNullString, sProcessID)
   If (hwnd = 0) Then Exit Sub
 
   GetWindowThreadProcessId hwnd, pid
 
 
   pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
   If (pHandle = 0) Then Exit Sub
 
   Call ReadProcessMemory(pHandle, hMemAddr, sOutput, 20, 0)
 
   Text1.Text = sOutput
 
   CloseHandle hProcess
End Sub
Das Modul:
Public Const PROCESS_ALL_ACCESS = &H1F0FFF
 
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName _
  As String, ByVal lpWindowName As String) As Long
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, _
lpdwProcessId As Long) As Long
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, _
ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, _
lpNumberOfBytesWritten As Long) As Long
Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, _
ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, _
lpNumberOfBytesWritten As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Bei diesem Code gibt er genau das aus, was er ausgeben sollte, nämlich den Servernamen des Spieles.
Aber sobald ich die zweite Adresse (welche den Wert: 0 oder 1 zurückgibt ) benutze und "sOutput" als Integer definiere, erhalte ich die Fehlermeldung, dass die Typen unverträglich sind.
Wie schaffe ich es die 1 bzw. die 0 auszulesen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 17.02.05 18:50

Bei welcher Zeile gibt er denn genau den Fehler aus?
Übrigens mal ganz nebenbei: Integer hat nicht nur 1 Byte, das sollten auch PHP-Programmierer wissen (auch wenn man da ja eigentlich gar keine Variablentypen kennt ), denn 1 Byte ist nunmal ein Byte!!!

So wie ich das bisher sehe begehst Du da einen absolut grundsätzlichen Fehler. Variablentypen im Zusammenhang mit dem Betriebssystem müssen absolut eindeutig festgelegt sein, du kannst nicht mal eben einen Integer übergeben wo das System einen String erwartet. Nach dem Auslesen mit dem String kannst Du Dir eine Variable vom Typ Integer dimensionieren, die dann den Wert erhalten soll.
Auch dass Deine Variablen im Timer-Event definiert werden ist nicht so gut, mach's lieber im Allgemein-Teil.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 17.02.05 20:06


Danke ersteinmal für die Antwort.
Das ein Integer 2 Byte hat, weiß ich, nur habe ich das deshalb so geschrieben, da mir ArtMoney (das habe ich genutzt um die Speicheradressen zu finden) das halt so geschrieben hat und ich deshalb besser deutlich machen wollte, vom welchen Typ dieser Wert ist.

Der fehler erscheint, nach dem ich "sOutput" als Integer Dimensioniert habe, Hier

Call ReadProcessMemory(pHandle, hMemAddr, sOutput, 2, 0)
Das gleiche passiert auch wenn ich "sOutput" als Byte Dimensioniere.

Martoeng schrieb:
Zitat:

Nach dem Auslesen mit dem
String kannst Du Dir eine Variable vom Typ Integer
dimensionieren, die dann den Wert erhalten soll.


Ok, das heisst ich lasse sOutput als String und nachdem ich den Wert von "ReadProcessMemory" erhalten habe, wandle ich diesen um in einen Integer Wert? Aber ich Schätze mal das scheint auch Falsch zu sein, da ich das (glaube ich) schon getestet habe. Ich Denke mal, ich habs jetzt Falsch verstanden

Martoeng schrieb:
Zitat:

Auch dass Deine Variablen im Timer-Event definiert werden ist nicht so gut, mach's lieber im Allgemein-Teil


Danke, für den Tip, im Haupt-Script habe ich das nämlich auch so gemacht
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 17.02.05 21:15

Wandle es hinterher in einen Integer um. Es kann sein, da der String ja eine feste länge hat, dass entweder Nullzeichen oder Leerzeichen im String hinter der Ziffer enthalten sind.
Mach's vielleicht einfach so:

Dim bytValue As Byte
bytValue = CByte(Mid$(sOutput,1,1))


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 17.02.05 22:14

Dann erhalte ich auch die Fehlermeldung:

Laufzeitfehler: 13
Typen unverträglich

An dieser Stelle:
bytValue = CByte(Mid$(sOutput,1,1))]
So ähnlich hatte ich das auch schon getestet gehabt nur leider mit CInt(), aber das ist genau das selbe Spiel

Achja, vielleicht solltest du wissen, dass sOutput als String folgendes Zeichen zurückgibt:
 <--- Das sollte normalerweise eine 1 sein!
Deshalb klappt das auch Sicherlich nicht mit dem CByte, da sOutput nunmal keine Nummer enthält.
Ich habe Die Adresse jetzt auch einmal mit TSearch ausgelesen und dort erhalte ich auch meine 1 bei Laufender Map und bei Map-Ende meine 0.
Also kann die Adresse auch nicht Falsch sein.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 17.02.05 22:19

Nimm mal die Asc-Funktion. Schätze mal, die Zahl ist der Ascii-Wert. 0 und 1 sind beides nichtdruckbare Zeichen.

Also bytValue = Asc(Mid$(sOutput,1,1))


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 17.02.05 23:17

Japp Dankeeeeee genau das wars

Jetzt kann ich endlich weitermachen.
Noch eine Frage ich habe noch eine Adresse in der Die Zeit Abläuft (8 Bytes) ich habe es gerade versucht bytValue als Date zu Dimensionieren, nur erhalte ich da leider nur 00:00:00
Naja, ist aber auch kein Wunder da ASC() ja auch nur max. 2 Bytes zurückgibt. Aber wie kann ich diese auslesen?
Achja sOutput gibt leider garnix aus.

Aber trotzdem ersteinmal Danke, das wichtigste Problem wurde schonmal gelöst, das andere ist nebensächlich.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 17.02.05 23:46

naja, in ner kleinen for-schleife kannst du ja jeweils ein zeichen weiter nach hinten wandern und mit asc den wert ermitteln.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 18.02.05 02:31

Hmmm das klappt schon Teilweise, nur habe ich dabei ein kleines Problem, denn die Ausgabe stimmt irgendwie überhaupt nicht.
Das ist die von mir erstellte for Schleife:

   Dim strValue As String
 
    Dim i As Integer
 
      For i = 1 To Len(sOutput)
          strValue = strValue & Asc(Mid(sOutput, i, 1))
       Next i
 
   Text1.Text = strValue
Aber anstatt mir die Textbox z.B.:
2184393523200 ausgibt, erhalte ich folgenden Wert 000152252100000000011254000
Naja ich mach jetzt Feierabend, muss gleich wieder aufstehen, Danke nochmals und gute Nacht
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: jens52
Datum: 18.02.05 09:23

Hallo JimKnopf,
gib doch mal genauer an, was das für 8Bytes sind? Ist das der Wert aus der Speicheradresse, wo der Timer seine eingestellte Zeit ablegt oder was? Läuft der Timer noch - oder ist er abgelaufen? Sind deine 8Bytes ein Zwischenstand und verändern die sich. Wenn ja, welche Zahlen verändern sich wie? In deinem Fall, wo du direkt aus dem Speicher lesen willst, sind solche Infos wichtig.

Denk bitte dran, das sind binäre Infos, die du ausliest. Nur wenn du diese als solche betrachtest - siehe oben dein 0 und 1 Thema, dann findest du die richtige Lösung.
Gruss Jens52
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 18.02.05 10:34

Nun bei ArtMoney & Co bleibt der Wert bei 8 Bytes was für 8 Bytes es sind kann ich leider nicht sagen
Die Zahl: 2184393523200 ist der Start-Wert und entspricht 35 Min. Sobald das Spiel gestartet ist, zählt diese abwärts bis der Wert bei 0 angelangt ist!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: jens52
Datum: 18.02.05 13:22

Hallo JimKnopf,
sorry aber ich hab's noch nicht ganz verstanden - du hast eine Speicher-Startadresse, von der du mittels sout-string 20 Bytes ausliest. Diese Speicherstartadresse hat aber nur eine Zeitinformation von 8Byte Breite - oder??? Das heißt deine restlichen 12 Bytes sind unbrauchbarer Müll für deine Zeit-Info ->
1) erst mal diese wegschneiden -> nur die ersten 8Bytes verwenden
2) teste mal welche Info er ablegt in der Speicheradresse, wenn du z.B. 100ms als Timer-Laufzeit einstellst.
3) versuch mal deine 8Bytes zu lesen und schau dann, was du zurückbekommst. Nur so kommst du weiter.
nenn mal solch eine feste Zuordnung, dann kann man sehen, wie die 8Bytes zu interpretieren sind.

Gruß Jens52
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 18.02.05 14:14

Testen, kann ich das erst am Abend, wenn ich zu Hause bin
zur Timerlaufzeit: Ich kann in dem Spiel keine Zeit in ms Festlegen ;) Nur Minuten!
Wenn ich die Zeit z.B. auf 30min einstelle, dann zeigt mir die Adresse diesen Wert: 1872337305600
Also entspricht 1 Sek = 1040187392 (tja was auch immer
Anfangs dachte ich es wären NanoSekunden, aber 1 Sek hat normalerweise 1000000000 ns und nicht 1040187392!
Naja und die 1872337305600 (30 min) zählen Rückwärts bis auf 0 (Countdown).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 18.02.05 19:30

So ich hab mir das ganze mal über den Memory Editor von ArtMoney angeschaut, und nun wird mir auch klar, wieso mein Script die Nullen ausgibt, nur weiss ich trotzdem nicht wie ich den Korrekten Wert erhalte
Hier mal ein Screenshot vom Memory Editor:



Die ersten 3 Bytes, Zeigen eine Null an (und wenn ich die Adresse als String auslese, erhalte ich auch logischerweise dann 3 Nullen) Unten Rechts sieht man den Tatsächlichen Wert welchen ich auch auslesen möchte. Und nun Versteht ihr hoffentlich auch was ich mit Integer 8 bytes meine.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 18.02.05 19:41

Integer heißt ja zunächst nur "Ganzzahl".
Mir ist allerdings immer noch nicht klar, was das eigentlich für eine Zahlenkombination sein soll, denn wie Du schon geschrieben hast ist das ja keine Millisekundenangabe oder ähnliches.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 18.02.05 20:29

Stimmt, aber egal welche Zeit ich im Spiel einstelle, wenn ich sie auf eine Sekunde herunterrechne, komme ich immer auf 1040187392 uz (Unbekannter Zeitwert )
Es war dadurch auch ziemlich schwierig für mich, überhaupt diese Adresse zu finden, da ich zuerst auch nach Sekunden und Millisekunden gesucht hatte.
Aber wichtiger ist eigentlich die Frage: Wie kann ich diesen Wert auslesen?
Gibt es evntl. noch eine andere Möglichkeit ausser ReadProcessMemory ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 18.02.05 20:50

Mit Peek und Poke kann man auch direkt Speicherzellen ansprechen, die gibt's in Kürze in einer hübschen Form hier zum Download.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 18.02.05 21:14

Ähm Blubb Blubb
Peek und Poke? hmmm Schnupper, davon habe ich schonmal was gehört *g* war bloß ziemlich lange her
Ach ja das gute alte BASIC
Ok, solange werd ich noch warten können.
Danke nochmal für die Tatkräftige Unterstützung und nen schönen Abend noch
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 09.03.05 12:47

Moin , Ich wollt mal fragen wie es jetzt mit dem Peek & Poke ausschaut?
Gibt es da jetzt schon was oder dauert es noch ne Weile?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 10.03.05 22:59

Würde mal so knappe 2 Wochen ungefähr schätzen. Ist alles derzeit im Test.
Dann gäbe es die erste Beta-Version.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: Jimknopf
Datum: 12.03.05 09:28

Danke schön
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Speicheradresse vom Typ Integer auslesen 
Autor: ModeratorMartoeng (Moderator)
Datum: 12.03.05 18:51

Kein Problem. Habe die ganzen Dateien mal mit in Urlaub genommen. Wird wohl irgendwann nächste Woche die erste Version geben, allerdings noch nicht beta-getestet (Peek & Co. sollten aber wohl funktionieren) und es sind auch nicht alle Funktionen dokumentiert (bspw. die HTML-Hilfe-Funktionen noch nicht).
Aber viele Funktionen sind sowieso selbsterklärend. Also bis denne.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel