Speicher auslesen - 1 Prozess, mehrere Fenster

12/05/2019 12:12 PierreDole#1
Moin,
hoffe, daß ich hier im richtigen Forum bin. Meine Frage hat nicht direkt etwas mit der Programmierung zu tun, eher mit der Vorbereitung.

Ein Spiel hat einen Launcher, mit dem man mehrere Instanzen des gleichen Spiels starten kann. Ich möchte einige Daten aus dem Spiel auslesen. Bei Spielen mit nur einem Fenster holt sich den Basis-Pointer und gut ist (wenn ich das richtig verstanden habe). Wie sieht es aber aus, wenn man mehrere Instanzen öffnen kann?
12/05/2019 12:24 Elongate#2
Quote:
Originally Posted by PierreDole View Post
Moin,
hoffe, daß ich hier im richtigen Forum bin. Meine Frage hat nicht direkt etwas mit der Programmierung zu tun, eher mit der Vorbereitung.

Ein Spiel hat einen Launcher, mit dem man mehrere Instanzen des gleichen Spiels starten kann. Ich möchte einige Daten aus dem Spiel auslesen. Bei Spielen mit nur einem Fenster holt sich den Basis-Pointer und gut ist (wenn ich das richtig verstanden habe). Wie sieht es aber aus, wenn man mehrere Instanzen öffnen kann?
Ich gehe mal davon aus das du mit Cheat Engine arbeitest.
Jede Instanz hat eigentlcih sein eigenen Prozess.
Das heißt du suchst erst im einen Prozess und dann im nächsten
oder öffnest 2 mal Cheat Engine.
Normalerweise sucht mal sich aber den Multilevelpointer
damit man nicht immer wieder neu suchen muss.
12/05/2019 12:33 PierreDole#3
Ja, ich werde dafür die CheatEngine benutzen. Habe aber in Speicherauslesen bisher keine Erfahrung gesammelt.
Normalerweise kenne ich das auch so, daß jedes Fenster einen eigenen Prozess hat. Der Task Manager zeigt aber keine weiteren Prozesse an. Nachdem der Launcher gestartet wurde, bleibt es bei dem einen Prozess, egal ob und wie viele Fenster ich öffne.
12/05/2019 12:36 Elongate#4
Quote:
Originally Posted by PierreDole View Post
Ja, ich werde dafür die CheatEngine benutzen. Habe aber in Speicherauslesen bisher keine Erfahrung gesammelt.
Normalerweise kenne ich das auch so, daß jedes Fenster einen eigenen Prozess hat. Der Task Manager zeigt aber keine weiteren Prozesse an. Nachdem der Launcher gestartet wurde, bleibt es bei dem einen Prozess, egal ob und wie viele Fenster ich öffne.
Kann eigentlich nicht sein, kannst du nicht wählen zwischen Application, Prozess und Fenster?
Zumindest da muss es drin stehen.
12/05/2019 12:45 PierreDole#5
Unter "App" gibt es den einen Eintrag, bzw, wenn ich es aufklappe, dann sind da zwei Einträge, bei denen es immer bleibt. Unter "Hintergrundprozesse" und "Windows-Prozesse" gibt es keine Einträge.

Vielleicht noch als Nachtrag:

Wenn ich in C# die Fenster des Prozesses auslese, dann bekomme ich immer die Daten des zuletzt aktiven Fensters. Das kann der Launcher sein, oder auch ein Spielfenster.
Habe auf Stackoverflow ein Code Snippet gefunden, der das alles aus der user32.dll ausließt. Da bekomme ich sogar jeden aufpoppenden Tool-Tip als "Fenster" zurück. Da sind auch die Spiele-Fenster mit drin.
Von daher, die handler der Fenster habe ich, aber das wird mir beim Auslesen des Speichers nicht wirklich helfen, oder?
12/06/2019 10:55 florian0#6
Quote:
Originally Posted by PierreDole View Post
Unter "App" gibt es den einen Eintrag, bzw, wenn ich es aufklappe, dann sind da zwei Einträge, bei denen es immer bleibt. Unter "Hintergrundprozesse" und "Windows-Prozesse" gibt es keine Einträge.
Nimm mal nen richtigen Task-Manager. z.B. Sysinternals Process Explorer. Nicht dieses Windows Spielzeug.
[Only registered and activated users can see links. Click Here To Register...]

Da muss der Prozess auftauchen. Wenn nicht, führ den Taskmanager mal als Admin aus.

Quote:
Originally Posted by PierreDole View Post
Von daher, die handler der Fenster habe ich, aber das wird mir beim Auslesen des Speichers nicht wirklich helfen, oder?
Vom Window Handle kommst du auch auf das Process Handle, von daher kann das auch schon helfen:
[Only registered and activated users can see links. Click Here To Register...]
12/06/2019 13:30 PierreDole#7
Hab die ProcessIds ausgelesen.

Code:
[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

// weiter unten in der foreach-Schleife

     GetWindowThreadProcessId(hWnd, out processId);
     Console.WriteLine("processId: {0}, hWnd.toString(): {1}", processId, hWnd.ToString());
Wie vermutet, es ist nur ein Prozess.

Launcher mit zwei offenen Spielefenstern:
Code:
processId: 16272, hWnd.toString(): 133126
processId: 16272, hWnd.toString(): 68766
processId: 16272, hWnd.toString(): 68734
12/07/2019 01:47 elmarcia#8
Maybe they share the same process but different thread or sth, u can try to find the value anyway.
Open CE, launch two game instances, (Instance1, Instance2),

Edit: u can add scan tabs in CE if you need to search for two different values

In instance1 change sth and search for the corresponding address,
In instance2, change sth that shouldn't match with Instance1 and find the correct address,

Make pointer scan in the addresses found of instance1 and instance2, compare results to find out the offset of the address from instance1 to instance2.

Ex:
baseAdd = 0x400000 ("game.exe")
Pointer1 scan points to -> 0x400000 + 0x1234 = 0x4001234
Pointer2 scan points to -> 0x400000 + 0x2468 = 0x4002468

Diff: 0x2468 - 0x1234 -> 0x1234
Then instance address = baseAdd + 0x1234 * instanceID (1,2,3...)

This is just a guess, you need to find out the correct offset between game instances if they share the same process, but different window...
12/22/2019 13:14 PierreDole#9
I made a pointer list of one window, closed the game, restarted it and made another list and compaired the two lists. Just to see if I could find at least one base address. There were 0 pointer left, not a single one.

I got another idea, its also just a guess.
Because the base address must be somewhere in the memory (I think it must), what if I searched the whole memory for a string? The strings I looking for are very unique, f.e. nicknames, so maybe it could be a good try. But I dont know how to search the memory independet to the process.
12/23/2019 19:33 elmarcia#10
Quote:
Originally Posted by PierreDole View Post
I made a pointer list of one window, closed the game, restarted it and made another list and compaired the two lists. Just to see if I could find at least one base address. There were 0 pointer left, not a single one.

I got another idea, its also just a guess.
Because the base address must be somewhere in the memory (I think it must), what if I searched the whole memory for a string? The strings I looking for are very unique, f.e. nicknames, so maybe it could be a good try. But I dont know how to search the memory independet to the process.
What game r u talking about maybe i could try find sth, i use CE a lot and have some reverse skills
12/24/2019 19:12 PierreDole#11
My Idea was to make a statistic tool for PokerStars like Jivaro. You have to pay for Jivaro, so I want to do it by myself. But I didnt expect the devs will make it so hard to read the game data. I already started to make it with screen scraping. It works so far (I didnt finish yet) but its not really the best way.