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

C++ - Writeprocessmemory


Rekomendowane odpowiedzi

Opublikowano

Witam,

nie będę owijał w bawełnę.

Piszę mały program( w celach edukacyjnych) ,który znajdzie okno,zapisze jego ID , otworzy proces, wpisze wartość 1000 do komórki pamięci o adresie 0x00962734 (Cheat Engine Tutorial - Step 2).

O to co do tej pory napisałem:

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <fstream>
#include <stdio.h>
#include <conio.h>
#define ADRES 0x00962734
using namespace std;

HANDLE Process()
     {
         HWND hwnd;
         hwnd = FindWindow(0, L"Step 2");
if (hwnd)
{
cout << "Znalazłem okno" << endl;
}
else
{
cout << "Nie znalałem okna" << endl;
}

         DWORD proc_id;
         GetWindowThreadProcessId(hwnd, &proc_id);
         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 
         return hProcess;
     }


int main()
{
setlocale(LC_ALL,"");
HANDLE hProcess = Process();

//WriteProcessMemory(hProcess, (LPVOID)ADRES,mleko,odkrowy,NULL);

 getch();

}

 

Wszystko ładnie , wyszukuje okno. I teraz problem Nie wiem dokładnie jak użyć funkcji WriteProcessMemory.

A dokładniej 3 i 4 parametr. Czy mógłby mi ktoś to wytłumaczyć? Wartość 1000 do ADRES.

 

Z góry dzięki za pomoc.

Za wysoka.

Opublikowano

DWORD val = 500;

bool APIENTRY DllMain(HMODULE hModule, unsigned long ulReason, void* vpReserved)
{

 if(ulReason == DLL_PROCESS_ATTACH)
 {
WriteProcessMemory( GetCurrentProcess(), (void*)0x963F74, &val, sizeof(val), 0 );
 }
return true;
}

 

Kod testowany,działa.

 

Jeśli koniecznie chcesz to zrobić przez .exe ( no a wiem, że chcesz :P ) i ten sposób nie działa to po OpenProcess --> printf("Error Code: %i\n",GetLastError()), jeśli wyjdzie 0 to znaczy że masz 'full access'.

 

Jeśli zwróci coś innego to sprawdź co mu nie pasuje tutaj: Error Codes MSDN

GetLastError() można wywołać po każdej funkcji, więc po WPM też sprawdź. Mi się nie udało przez .exe zawsze zwracało Access is denied. :angry:

Opublikowano

Po ProcessOpen mam Access is denied ,a po WriteProcessMemory The handle is invalid -.-

 

Zaraz napisze swój program ,który wyświetli MsgBox ,gdy zmienna a będzie równa 1000. Zobaczymy.

 

#Edit:

To samo -.-

 

 

#Edit2:

Mam kolejny pomysł:

int value;
HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, 0, ProcessExists("Tutorial.exe"));
ReadProcessMemory(Handle, (LPVOID)0x00962734, &value, 4, NULL);

 

Ale nie moge skompilować.Coś z ProcessExists nie tak ,ale co?

Tak wiem tym razem read :D

 

 

#Edit3:

Dobra idę spać -.-. Na dzisiaj starczy tej nauki :> Wy oczywiście możecie przez noc mi pomóc :D

Jutro jeszcze popróbuję (aż do skutku-nie odpuszczę :D).

Za wysoka.

Opublikowano

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

int main() {

// pobieranie uchwytu okna
HWND hFind = FindWindow(0, L"Step 2");

// pobieranie ID procesu
DWORD dwProcId;
GetWindowThreadProcessId(hFind, &dwProcId);

// otwieranie procesu
HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcId);

// zmiana wartosci na 1000
int value = 1000;
WriteProcessMemory(proc,                                  // uchwyt otwartego wczesniej procesu
                                    (void *)0x00962734,            // adres od ktorego zaczynamy "zapisywac"
                                    &value,                              // wskaznik na dane do zamiany
                                    4,                                    // liczba bajtow do zapisania
                                    NULL);				


       /*
// odczytywanie wartosci =)
int rval;
ReadProcessMemory(proc,                                 // uchwyt otwartego wczesniej procesu
                                   (void *)0x00962734,           // adres od ktorego zaczynamy "odczytywac"
                                   &rval,                                // wskaznik na bufor do zapisu
                                   4,                                    // liczba bajtow do odczytania
                                   NULL);


*/


return 0;

}

 

Testowane, działa, nie jestem pewien czy to miałeś na myśli ;)

Opublikowano

Właśnie testowałem na Viscie ( łaskawie się visual zainstalował z problemami.. ) no i wszystko śmiga, żadnych błędów nie ma :P

 

hymm jeszcze możesz spróbować odpalić na xp w trybie zgodności z win 2000. Jeszcze jak odpale xp to sprawdze jeden inny pomysł i dam znać :)

Opublikowano

Zaraz,zaraz.

Czyli tu wina systemu? (Odpalałem z trybem zgodności z 2000-też nie działa ;d)

 

@Kolego 2xup:

Na jakim systemie odpaliłeś i Ci działało?

 

Może inny kompilator? Środowisko programistyczne(Ja używam Visual C++ 2008). No już sam nie wiem ;x

 

@t3ix:

Ok,czekam :D

Za wysoka.

Opublikowano

BOOL SetDebugPrivileges()
{
  BOOL               bRET = FALSE;
  TOKEN_PRIVILEGES   tp;
  HANDLE             hToken;

  if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))
  {
     if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
     {
        if (hToken != INVALID_HANDLE_VALUE)
        {
           tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
           tp.PrivilegeCount = 1;
           if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, 0, 0))
              bRET = TRUE;
           CloseHandle(hToken);
        }
     }
  }
  return bRET;
}

 

przed OpenProcess

SetDebugPrivileges();

 

Śmiga na xp, właśnie sprawdziłem xD

 

ps. 100 ^^

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...