2016-03-25 3 views
1

Возможно, есть несколько сообщений, которые объясняют мою проблему несколькими способами ... Но я искал поиск в google и stackoverflow searchbox, и я ничего не нашел. Итак, я пойду.Запись в другой памяти процесса с WriteProcessMemory и указателем

Я хочу написать в Process Memory строку Изменение его в C++, но я даже не знаю, как хорошо это работает так ..

У меня есть этот указатель: Image of the pointer Пожалуйста, может кто-то помочь я это делаю?

Я пробовал его, но он не работает ..

#include <windows.h> 
#include <iostream> 

int main() { 
    HWND hWnd = FindWindow(0, "WindowName"); 
    if (hWnd == 0) { 
     std::cout << "Cannot find window." << std::endl; 
    } 
    DWORD pId; 
    GetWindowThreadProcessId(hWnd, &pId); 
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId); 
    DWORD baseAddress = 0x009B03D0; 
    DWORD offset = 0xA7; 
    DWORD ptrAddress; 
    char *newString = "newvalue"; 
    ReadProcessMemory(hProc, (void*)baseAddress, &ptrAddress, sizeof(DWORD), 0); 
    WriteProcessMemory(hProc, (void*)(ptrAddress + offset), newString, strlen(newString), 0); 
    std::cout << "Done. " << &ptrAddress << std::endl; 
    std::getchar(); 
} 

я должен получить указатель и jumpt к последней, потому что я только один смещение .. Но я не получаю правильный ..


Edit:

Вот мой новый код, он работает до тех пор функции WriteProcessMemory .. что может быть не так?

код, который РАБОТАЕТ:

int main() 
{ 
    unsigned long Pointer; /* to hold the final value */ 
    unsigned long temp;  /* hold the temp values */ 
    unsigned long address = 0x009B03D0; 
    unsigned long offset = 0xA7; 
    unsigned long newString = 0; 
    DWORD pid; 
    HWND hwnd; 
    hwnd = FindWindow(0, TEXT("NewWindow")); 
    if (!hwnd) 
    { 
     cout << "No!\n"; 
     cin.get(); 
    } 
    else 
    { 
     GetWindowThreadProcessId(hwnd, &pid); 
     HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); 
     if (!phandle) 
     { 
      cout << "None!\n"; 
      cin.get(); 
     } 
     else 
     { 
      while (1) 
      { 

       ReadProcessMemory(phandle, reinterpret_cast<LPVOID>(address), &temp, sizeof(temp), 0); 
       Pointer = temp + offset; 
       //Good 
       ReadProcessMemory(phandle, reinterpret_cast<LPVOID>(Pointer), &newString, 16, 0); 
       cout << reinterpret_cast<LPVOID>(Pointer) << " en " << newString; 
       Sleep(1000); 
      } 
      return 0; 
     } 
    } 
} 

КОД, ЧТО НЕ РАБОТАЕТ:

int main() 
{ 
    unsigned int Pointer; /* to hold the final value */ 
    unsigned int temp;  /* hold the temp values */ 
    unsigned int address = 0x009B03D0; 
    unsigned int offset = 0xA7; 
    unsigned int newString = 1768060259; 
    DWORD pid; 
    HWND hwnd; 
    hwnd = FindWindow(0, TEXT("NewWindow")); 
    if (!hwnd) 
    { 
     cout << "NO\n"; 
     cin.get(); 
    } 
    else 
    { 
     GetWindowThreadProcessId(hwnd, &pid); 
     HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); 
     if (!phandle) 
     { 
      cout << "NONE\n"; 
      cin.get(); 
     } 
     else 
     { 
      while (1) 
      { 

       ReadProcessMemory(phandle, reinterpret_cast<LPVOID>(address), &temp, sizeof(temp), 0); 
       Pointer = temp + offset; 
       //Good 
       if (!WriteProcessMemory(phandle, reinterpret_cast<LPVOID>(Pointer), &newString, sizeof(newString), 0)) 
        std::cerr << "Couldn't write process memory:" << GetLastError() << std::endl; 
       cout << reinterpret_cast<LPVOID>(Pointer) << " en " << newString; 
       Sleep(1000); 
      } 
      return 0; 
     } 
    } 
} 
+2

Пожалуйста, не публикуйте 'недействительным main': это нестандартное и, насколько я знаю, только Visual C++ принимает его, то есть другие компиляторы * не * принимать. –

+0

Я не могу, потому что я даже не знаю код xD – Onelio

+0

Итак, что случилось. Вы не проверяли наличие ошибок. Возможно, один из вызовов API не удался. Чего вы ожидаете? Как вы подтвердили, что этого не произошло? Что случилось? Вы не указали нулевой терминатор. –

ответ

1

Каждый процесс имеет свою собственную память и адресное пространство. Итак, ReadProcessMemory() и WriteProcessMemory() используют промежуточный буфер для выполнения своей работы по доступу к памяти другого процесса.

К сожалению, есть проблемы с вашим ReadProcessMemory() вызова:

  • вы не инициализируете ptrAddress, чтобы указать на буфер
  • вы передаете адрес ptrAddress, а не его значение, которое должно указывать на действительный buffer
  • вы передаете 0 (т. е. nullptr) вместо того, чтобы передавать адрес переменной zie, которая должна содержать количество байтов, которое может быть прочитано.

Обратите внимание, что вы управляете адресом в целевом процессе, используя DWORD для LPCVOID. Первый всегда 32 бит, в то время как последний зависит от ваших параметров компиляции (32-разрядный код или 64-разрядный код).

Вы также должны проверить error code в случае отказа. Почти наверняка необходимо, чтобы специальные права требовались для чтения/записи в отдельных процессах.

Здесь скорректированный код с некоторыми диагностическими сообщениями, которые помогут вам в дальнейшем.

HWND hWnd = FindWindow(0, TEXT("WindowName")); 
if (hWnd == 0) { 
    std::cerr << "Cannot find window." << std::endl; 
} 
else { 
    DWORD pId; 
    GetWindowThreadProcessId(hWnd, &pId); 
    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId); 
    if (hProc) { 
     char *newString = "newvalue"; 
     size_t sz = strlen(newString) + 1; 
     LPVOID baseAddress = (LPVOID)0x009B03D0; 
     DWORD offset = 0xA7; 
     LPVOID ptrAddress = new char[sz]; 
     SIZE_T bytes_read = 0, bytes_written=0; 
     if (ReadProcessMemory(hProc, baseAddress, ptrAddress, sz, &bytes_read) || GetLastError()== ERROR_PARTIAL_COPY) { 
      if (bytes_read == 0) 
       std::cerr << "Houston, we have a problem..." << std::endl; 
      if(!WriteProcessMemory(hProc, baseAddress, (LPCVOID)newString, sz, &bytes_written)) 
       std::cerr << "Couldn't write process memory:" << GetLastError() << std::endl; 
      std::cout << "Done. " << bytes_read <<" bytes read and "<<bytes_written<<" bytes written"<< std::endl; 
     } 
     else { 
      std::cerr<< "Couldn't read process memory:" << GetLastError() << std::endl; 
     } 
     delete[] ptrAddress; 
    } 
    else { 
     std::cerr << "Couldn't open process " << pId << ": " << GetLastError() << std::endl; 
    } 
} 
std::getchar(); 
+0

Вы забыли «)» в («WindowName»)); XD (Позвольте мне попробовать) – Onelio

+0

Выполнено как admin Я получаю это: https://i.gyazo.com/b2ec7c5fb53e6c410df801ffb51db94e.png Но я заметил, что что-то изменилось в CE, потому что оно перестало показывать значение (Но оно все еще в Область памяти) – Onelio

+0

@James Извините, я просто понял, что в состоянии записи отсутствовал символ '!', Заставляя отображать сообщение об ошибке записи, несмотря на то, что все прошло хорошо. Я отредактировал ответ. – Christophe