C++ ReadProcessMemory adress+offset

0

Witam

To mój pierwszy post na tym forum, więc witam wszystkich.
Wracam do programowania po niemal 3 latach i już pierwszego dnia napotkałem problem.

A więc do sedna:
Przy pomocy CE znalazłem pointer i offset interesującego mnie adresu. Zawsze zwraca właściwą wartość w CE, czyli jest właściwy.
Próbowałem coś takiego:

ReadProcessMemory(warspear, (LPCVOID*)(addy+ offset), &mp, 4, 0); 

ale zwraca zero. Nie bardzo wiem jak to ugryźć teraz.
Obok wczytuje wartość z adresu, do którego zaprowadził mnie w tej chwili, przy tym odpaleniu, program CheatEngine ze znalezionego adresu+offset. Odczytuje dobrą wartość, ale adres ten jest zmienny...

W czym tkwi błąd?
Pozdrawiam
Bartosz

Skrócona całość:

 #include "stdafx.h"
#include "windows.h"
#pragma comment(lib, "user32.lib")
#include <iostream>
using namespace std;

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

	HWND handle = FindWindow(0, L"Warspear Online");

	DWORD pid;
	GetWindowThreadProcessId(handle, &pid);

	HANDLE warspear = OpenProcess(PROCESS_ALL_ACCESS, false, pid);

	int mp, mp1;
	DWORD addres = 0x04786414;
	DWORD addy = 0x0018FAE8;
	WORD offset = 0x09C;
	

	ReadProcessMemory(warspear, (LPCVOID*)(addy+ offset), &mp, 4, 0);
	ReadProcessMemory(warspear, (LPVOID*)addres, &mp1, 4, 0);
	cout << "wlasciwe MP: " << mp1 << endl;
	cout << "aktualne MP: " << mp << endl;
	cout << "\n\n"<< endl;
	system("pause");

	
}
0

W sumie to nie wiem co chcesz osiągnąć?

Piszesz że ReadProcessMemory(warspear, (LPVOID*)addres, &mp1, 4, 0); (z addres == 0x04786414) zwraca prawidłowy wynik.
Piszesz że ReadProcessMemory(warspear, (LPCVOID*)(xxxx), &mp, 4, 0); (z xxxx == addy + offset == 0x4915efc) zwraca nieprawidłowy wynik.

Obok wczytuje wartość z adresu, do którego zaprowadził mnie w tej chwili, przy tym odpaleniu, program CheatEngine ze znalezionego adresu+offset. Odczytuje dobrą wartość, ale adres ten jest zmienny...

Tak czy inaczej w jednym i drugim przypadku wczytujesz wartość spod stałego adresu.

Ogólnie napisz coś więcej o tym czym jest ten adres (rozumiem adres VA?) i offset (offset w czym? tablicy? sekcji? jeszcze czymś innym?) - wtedy będzie można coś więcej kombinować...

0

Pointery w grach masz zazwyczaj wielopoziomowe. Musisz znalezc tzw. "base pointer" bo tylko on da ci zawsze wskazanie do tego co chcesz. Jest on "staly". W CE adresy bazowe sa oznaczone kolorem zielonym. Wtedy masz dany offset i dodajesz go do zazwyczaj 0x00400000 ktory jest adresem od ktorego liczy sie offset(adres bazowy modulu exeka). Wtedy w zaleznosci od tego ilu poziomowy jest pointer musisz tyle razy czytac z pamieci i dodawac offsety. Bo kazdy pointer wskazuje na nastepny i na nastepny i dopiero najnizszy/wyzszy(zalezy jak patrzec) ma dana wartosc.

0

Tu wyszła moja głupota... A sprawa jest prosta. Adres statyczny doprowadza mnie do adresu dynamicznego, do którego właśnie należy dodać offset.

ReadProcessMemory(warspear, (LPCVOID*)(addy1), &szukanyadresdynamiczny, 4, 0);
ReadProcessMemory(warspear, (LPCVOID*)(szukanyadresdynamiczny+offset), &mp1, 4, 0);

Dopiero teraz wszystko działa jak należy i moje

mp1

zawiera to czego szukałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1