| |
VB & Windows APISpeicheradresse 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? | |
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 | |
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. | |
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. | |
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 | |
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 | |
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! | |
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 | |
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). | |
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. | |
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 ? | |
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 | |
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? | |
Re: Speicheradresse vom Typ Integer auslesen | | | Autor: Jimknopf | Datum: 12.03.05 09:28 |
| Danke schön | |
| 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 |
|
|
Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|