Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Read memory procces


Rekomendowane odpowiedzi

Opublikowano

Witam,

 

Już w jakimś stopniu ogarnąłem C++ i chciałbym napisać mały programik który z pewnej gry wyczytuje np. HP czyli chodzi mi o operacje na pamięci. W C# wiem jak to wszystko zrobić lecz w C++ nie znalazłem polskiego kursu/poradnika jak to zrobić :C

Opublikowano

Ucząc się programować ucz się angielskiego, w tej branży bez tego języka jak bez ręki, niezależnie czy piszesz kod dla siebie czy chcesz z tym jakąkolwiek przyszłość wiązać.

 

Jako, że potrafisz z tego korzystać w C#, to wiesz na czym się to mniej więcej opiera.

 

ReadProcessMemory:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553(v=vs.85).aspx

 

WriteProcessMemory:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681674(v=vs.85).aspx

 

Korzystanie z dokumentacji też istotna sprawa.

 

Po kolei:

ReadProcessMemory

BOOL WINAPI ReadProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPCVOID lpBaseAddress,
  _Out_  LPVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesRead
);
WriteProcessMemory

BOOL WINAPI WriteProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPVOID lpBaseAddress,
  _In_   LPCVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesWritten
);
Nie różni się to od C#, bo korzysta z tego samego API. Jedyną rzeczą, którą się różnią może być np. pozyskiwanie ID odpowiedniego procesu. Jak mniemam w C# używasz klasy Process, możesz poszukać odpowiednika w C++ albo obejść się bez tego z wykorzystaniem np. FindWindow czy innej funkcji, która wyciągnie PID po zadanych kryteriach (np. nazwę poprzez snapshot'a -> CreateToolhelp32Snapshot).

 

Albo jeszcze prościej, poszukać gotowego liba/soruce, który zrobi to wszystko dwiema metodami za Ciebie. Przypadek powtarzający się miliard razy więc na pewno ktoś takie coś już wykombinował.

YOU MUST DIE

- Ganon, Koridai

Opublikowano

Ucząc się programować ucz się angielskiego, w tej branży bez tego języka jak bez ręki, niezależnie czy piszesz kod dla siebie czy chcesz z tym jakąkolwiek przyszłość wiązać.

 

Jako, że potrafisz z tego korzystać w C#, to wiesz na czym się to mniej więcej opiera.

 

ReadProcessMemory:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553(v=vs.85).aspx

 

WriteProcessMemory:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681674(v=vs.85).aspx

 

Korzystanie z dokumentacji też istotna sprawa.

 

Po kolei:

ReadProcessMemory

BOOL WINAPI ReadProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPCVOID lpBaseAddress,
  _Out_  LPVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesRead
);
WriteProcessMemory

BOOL WINAPI WriteProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPVOID lpBaseAddress,
  _In_   LPCVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesWritten
);
Nie różni się to od C#, bo korzysta z tego samego API. Jedyną rzeczą, którą się różnią może być np. pozyskiwanie ID odpowiedniego procesu. Jak mniemam w C# używasz klasy Process, możesz poszukać odpowiednika w C++ albo obejść się bez tego z wykorzystaniem np. FindWindow czy innej funkcji, która wyciągnie PID po zadanych kryteriach (np. nazwę poprzez snapshot'a -> CreateToolhelp32Snapshot).

 

Albo jeszcze prościej, poszukać gotowego liba/soruce, który zrobi to wszystko dwiema metodami za Ciebie. Przypadek powtarzający się miliard razy więc na pewno ktoś takie coś już wykombinował.

 

No cóż do w C# miałem gotową klasę do operacji na pamięci więc nie wiem jak to wygląda nawet w C# :) a nie znalazłem żadnej biblioteki gotowej w C++ a na necie nie ma jakiś normalnie opisanych przykładów

Opublikowano

Ja to robie tak:

DWORD processID;
HWND hwnd = FindWindow("TibiaClient",0);
GetWindowThreadProcessId(hwnd, &processID);
HANDLE handle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, processID);

int hpValue;
ReadProcessMemory(handle, (void*)HP, &hpValue, 4, 0);

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

 

Ja to robie tak:

DWORD processID;
HWND hwnd = FindWindow("TibiaClient",0);
GetWindowThreadProcessId(hwnd, &processID);
HANDLE handle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, processID);

int hpValue;
ReadProcessMemory(handle, (void*)HP, &hpValue, 4, 0);

I Zwraca mi ciągle 0

Opublikowano

jesli sprawdzasz to teraz na tibi to trzeba base adres dodac do adresu hp dalem to jako przyklad 

ReadProcessMemory(handle, (void*)(HP+baseaddr), &hpValue, 4, 0);  

sprobuj tego wlasnie skonczylem i dziala elegancko:

int GetHP(HANDLE hand,DWORD baseAdr,int hpaddr,int hpmaxaddr, int xoraddr){
		int hpValue;
		int XorAdValue;
		int maxHpValue;
		ReadProcessMemory(hand, (void*)(hpaddr+baseAdr), &hpValue, 4, 0);
		ReadProcessMemory(hand, (void*)(xoraddr+baseAdr), &XorAdValue, 4, 0);
		ReadProcessMemory(hand, (void*)(hpmaxaddr+baseAdr), &maxHpValue, 4, 0);
		int maxHitpoints = maxHpValue^XorAdValue;
		int hitpoints = hpValue^XorAdValue;
		int retuHP=((hitpoints*100)/maxHitpoints);
return retuHP;
}

tu adresy:

#define  HP 0x5CF000
#define HP_max 0x5CF02C
#define  XorAd 0x432BB0

base addres odczytasz:

DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId);//deklaracja

DWORD baseAddr = GetModuleBase("Tibia.exe", processID);/odczytuje 
DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId)//i funkcja do odczytu
    {
       MODULEENTRY32 lpModuleEntry = {0};
       HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
       if(!hSnapShot)
          return 0;
       lpModuleEntry.dwSize = sizeof(lpModuleEntry);
       BOOL bModule = Module32First( hSnapShot, &lpModuleEntry );
       while(bModule)
       {
          if(!strcmp( lpModuleEntry.szModule, lpModuleName ) )
          {
             CloseHandle( hSnapShot );
             return (DWORD)lpModuleEntry.modBaseAddr;
          }
          bModule = Module32Next( hSnapShot, &lpModuleEntry );
       }
       CloseHandle( hSnapShot );
       return 0;
    }

lapanie handle i procesu masz w poprzednij poscie

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

jesli sprawdzasz to teraz na tibi to trzeba base adres dodac do adresu hp dalem to jako przyklad 

ReadProcessMemory(handle, (void*)(HP+baseaddr), &hpValue, 4, 0);  

sprobuj tego wlasnie skonczylem i dziala elegancko:

int GetHP(HANDLE hand,DWORD baseAdr,int hpaddr,int hpmaxaddr, int xoraddr){
		int hpValue;
		int XorAdValue;
		int maxHpValue;
		ReadProcessMemory(hand, (void*)(hpaddr+baseAdr), &hpValue, 4, 0);
		ReadProcessMemory(hand, (void*)(xoraddr+baseAdr), &XorAdValue, 4, 0);
		ReadProcessMemory(hand, (void*)(hpmaxaddr+baseAdr), &maxHpValue, 4, 0);
		int maxHitpoints = maxHpValue^XorAdValue;
		int hitpoints = hpValue^XorAdValue;
		int retuHP=((hitpoints*100)/maxHitpoints);
return retuHP;
}

tu adresy:

#define  HP 0x5CF000
#define HP_max 0x5CF02C
#define  XorAd 0x432BB0

base addres odczytasz:

DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId);//deklaracja

DWORD baseAddr = GetModuleBase("Tibia.exe", processID);/odczytuje 
DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId)//i funkcja do odczytu
    {
       MODULEENTRY32 lpModuleEntry = {0};
       HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
       if(!hSnapShot)
          return 0;
       lpModuleEntry.dwSize = sizeof(lpModuleEntry);
       BOOL bModule = Module32First( hSnapShot, &lpModuleEntry );
       while(bModule)
       {
          if(!strcmp( lpModuleEntry.szModule, lpModuleName ) )
          {
             CloseHandle( hSnapShot );
             return (DWORD)lpModuleEntry.modBaseAddr;
          }
          bModule = Module32Next( hSnapShot, &lpModuleEntry );
       }
       CloseHandle( hSnapShot );
       return 0;
    }

lapanie handle i procesu masz w poprzednij poscie

Nie sprawdzam tego na tibi a na małej gierce CounterStrike 2D która nie jest zabezpieczona w żaden sposób. Dodatkowo nic nie  czaje z tego co napisałeś są do tego jakieś gotowe klasy?? W C# wyczytanie z klasą zajmuje mi max 3 linijki

 

Mam 0x0CE067A8 adress i jak dzięki tylko temu odczytać pamiec

Opublikowano

nie wiem czy sa wiem, ze c# jest duzo laptwiej to pisac w c++ nieznalazlem wiec pisze sobie sam xD

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

nie wiem czy sa wiem, ze c# jest duzo laptwiej to pisac w c++ nieznalazlem wiec pisze sobie sam xD

A mając tylko adres "0x0CE067A8 " mogę odczytać wartość procesu??

Opublikowano

jesli wiesz czego to adres to mozesz:

DWORD processID;
HWND hwnd = FindWindow("CS?",0);
GetWindowThreadProcessId(hwnd, &processID);
HANDLE handle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, processID);
int hpValue;
ReadProcessMemory(handle, (void*)0x0CE067A8, &hpValue, 4, 0);

cout<<hpValue;

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

 

jesli wiesz czego to adres to mozesz:

DWORD processID;
HWND hwnd = FindWindow("CS?",0);
GetWindowThreadProcessId(hwnd, &processID);
HANDLE handle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, processID);
int hpValue;
ReadProcessMemory(handle, (void*)0x0CE067A8, &hpValue, 4, 0);

cout<<hpValue;

:( ciągle zwaraca 40 na każdym adresie

Opublikowano

podajesz nazwe okna zamiast "CS?"

Tak podaje normalną nazwe okna

 

 

 

Edit. Przy okazji sprawdziłem czy

HWND hwnd = FindWindow(0,"CounterStrike2D");

zawiera true czy false i niestety false :C coś nie mogę uchwytu złapać

 

 

 

 

@@edit: poradziłem sobie :) ale mam jeszcze problem z tym żę się adres ten resetuje po tym jak zrestartuje appke i jak temu zaradzic

Opublikowano

pointer trzeba wyjac adresu jak znajdziesz adres->prawym ->pointer cos tam 

 

 

 

a ja mam maly problem z funkcja ktos zwroci mi string xD

 

 

const char * GetString(HANDLE hand,DWORD baseAdr,int String_addr){
int Sart=String_addr+baseAdr;
char StatBarValue;
string nap;
int i=0;
do{
ReadProcessMemory(hand, (void*)(Sart+i), &StatBarValue, sizeof(StatBarValue), 0);
nap=nap+StatBarValue;
i++;
}while(StatBarValue != '\0'&& StatBarValue+1 !=  '\0');
return nap;
}

jakies rady?

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

 

pointer trzeba wyjac adresu jak znajdziesz adres->prawym ->pointer cos tam 

 

 

 

a ja mam maly problem z funkcja ktos zwroci mi string xD

 

 

const char * GetString(HANDLE hand,DWORD baseAdr,int String_addr){
int Sart=String_addr+baseAdr;
char StatBarValue;
string nap;
int i=0;
do{
ReadProcessMemory(hand, (void*)(Sart+i), &StatBarValue, sizeof(StatBarValue), 0);
nap=nap+StatBarValue;
i++;
}while(StatBarValue != '\0'&& StatBarValue+1 !=  '\0');
return nap;
}

jakies rady?

 

 

http://ideone.com/BiGt0b

Opublikowano

1. Czemu czytasz 1 BAJT? http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Pojecie-zmiennej-i-podstawowe-typy-danych/11 zacznij od tego.

2. W C/C++ stringi kończą się JEDNYM zerem.

3. Funkcja powinna zwracać const char*

4. Czytaj 255 Bajtów, następnie sprawdzaj czy jest zero.

5. ADRES w INT? O_o

6. Nie pomogę, nie mam Windowsa.

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Opublikowano

ok naprawilem blad(chyba) adrsy deklaruje pod  DWORD,

 

string getRead(HANDLE hand, DWORD Address,DWORD BaseADR){
    DWORD Napis=Address+BaseADR;
    char nap;
    string napis;
    do{
        ReadProcessMemory(hand, (void*)Napis, &nap, sizeof(nap), 0);
        napis+=nap;
        Napis++;
    }while(nap != '\0');
return napis;
}

i tez dziala xD

 sprawa sie ma tak, ze musze miec ta funkcjie w glownym kodzie( nie w includzie gdzie mam reszte funkcji) inaczej wywala ze string nie moze byc typem

 

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

#includa dalem do bibliotek, ale nie dalem namespace std;...

dzieki smiga teraz pieknie ^^

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

W CE mi działa, ale już jak napisałem to w C++ to nie działa

zmienna value to int value = 5

WriteProcessMemory(hProc, (LPVOID)GetModuleBase("nazwagry",procID)+0x04039538+0x28+0x19c+0x224+0x7d4+0x518, &value, (DWORD)sizeof(value), NULL);

Funkcja getmodulebase

DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId)
{
   MODULEENTRY32 lpModuleEntry = {0};
   HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );

   if(!hSnapShot)
      return NULL;
   lpModuleEntry.dwSize = sizeof(lpModuleEntry);
   BOOL bModule = Module32First( hSnapShot, &lpModuleEntry );
   while(bModule)
   {
      if(!strcmp( lpModuleEntry.szModule, lpModuleName ) )
      {
         CloseHandle( hSnapShot );
         return (DWORD)lpModuleEntry.modBaseAddr;
      }
      bModule = Module32Next( hSnapShot, &lpModuleEntry );
   }
   CloseHandle( hSnapShot );
   return NULL;
}

TuByłaSygnatura.png

Opublikowano

Czytasz tak: ["nazwagry"+0x04039538+0x28+0x19c+0x224+0x7d4+0x518] a powinno być:[[[[[["nazwagry"+0x04039538]+0x28]+0x19c]+0x224]+0x7d4]+0x518] jak to zrobić pomysł. 

 

A i 0x04039538 to chyba offset nie jest... jak już to 0x00039538

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...