2017-01-09 3 views
-2

Попытка прочитать имя сущности из игровой памяти, указатели на 100% правильны, так как с помощью ce проверить.Ошибка 299 на ReadProcessMemory

нет проблем чтения/записи поплавка/целочисленных значений

32-битного процесса, игра как хорошо - попыталась компиляцией коды в x64, не помогло.

GetLastError()

возвращает Н.Р. 299

ERROR_PARTIAL_COPY

299 (0x12B) 

Only part of a ReadProcessMemory or WriteProcessMemory request was completed. 

Любые идеи, что может быть причина? код ниже

#include <windows.h> 
#include <TlHelp32.h> 
#include <iostream> 
#include <string> 
#include <time.h> 
#include <tchar.h> 



using namespace std; 

DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, TCHAR *lpszModuleName); 
string readName(HANDLE handlez, DWORD base, DWORD bp, DWORD ofset1, DWORD ofset2, DWORD ofsetInc); 


int main() 
{ 
    DWORD baseOfset = 0x60DE90; 
    DWORD ofset1 = 0x4c4; 
    DWORD ofset2 = 0x6a0; 
    DWORD ofset3 = 0x18; 


    HWND window = NULL;//FindWindow(0, _TEXT("Gothic II - 2.6 (pol)")); 
    DWORD pID = 0; 
    DWORD dwBP = NULL; 
    HANDLE handle = NULL;// OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); 
    string gameStatus; 
    int refresher = clock(); 
    gameStatus = "Waiting for game"; 




    window = FindWindow(0, _TEXT("Gothic II - 2.6 (pol)")); // window title 
    if (window) 
    { 
     GetWindowThreadProcessId(window, &pID); 
     if (pID != 0) 
     { 
      handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pID); 
      dwBP = dwGetModuleBaseAddress(pID, _T("Gothic2.exe")); // proc name 

      if (handle == INVALID_HANDLE_VALUE || handle == NULL || dwBP == NULL) 
      { 
       gameStatus = "No handle"; 
      } 
      else 
      { 
       gameStatus = "OK"; 
      } 
     } 
     else 
     { 
      gameStatus = "No access"; 
     } 
    } 
    else 
    { 
     gameStatus = "No window"; 

    } 




    while (!GetAsyncKeyState(VK_DELETE)) 
    { 
     if (clock() - refresher > 1000) 
     { 
      refresher = clock(); 


      cout << gameStatus << endl; 
      string elo="a"; 


       elo = readName(handle, dwBP, baseOfset, ofset1, ofset2, ofset3); 
       if (elo == "a") 
       { 
        cout << ":(\n"; 
       } 

       cout << "Name: " << elo <<".\n"; 

       cout << "Name: " << &elo << ".\n" << endl; 
       system("pause"); 

         } 
    } 


    CloseHandle(handle); 
} 

string readName(HANDLE handlez, DWORD base, DWORD bp, DWORD ofset1, DWORD ofset2, DWORD ofsetInc) 
{ 

    DWORD adresik; 

    ReadProcessMemory(handlez, (LPCVOID)(base + bp), &adresik, sizeof(DWORD), NULL); // base adress + base pointer 
    adresik += ofset1;   //1st lvl pointer 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += ofset2;   // 2nd lvl pointer 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += ofsetInc;   // 3rd lvl pointer this goes up +=20 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += 0x12c;     // 4th static pointer 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += 0x0;      // 5th static pointer 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 


    string papa; 

    ReadProcessMemory(handlez, (LPCVOID)adresik, &papa, sizeof(string), NULL); // get name 
    DWORD ero = GetLastError(); 
    cout << ero << endl; 
    return papa; // return name 


} 


DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, TCHAR *lpszModuleName) 
{ 
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier); 
    DWORD dwModuleBaseAddress = 0; 
    if (hSnapshot != INVALID_HANDLE_VALUE) 
    { 
     MODULEENTRY32 ModuleEntry32 = { 0 }; 
     ModuleEntry32.dwSize = sizeof(MODULEENTRY32); 
     if (Module32First(hSnapshot, &ModuleEntry32)) 
     { 
      do 
      { 
       if (_tcscmp(ModuleEntry32.szModule, lpszModuleName) == 0) 
       { 
        dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr; 
        break; 
       } 
      } while (Module32Next(hSnapshot, &ModuleEntry32)); 
     } 
     CloseHandle(hSnapshot); 
    } 
    return dwModuleBaseAddress; 
} 

ответ

1

Вы не можете просто скопировать в с-строки в ячейку памяти с станд :: строки.

Что вы хотите, вероятно, что-то вроде этого (при условии, что это на самом деле, оканчивающихся нулем строку, которую вы читаете):

const int MAX_SIZE = 512; 
const char buffer[MAX_SIZE]; 
string papa; 

ReadProcessMemory(handlez, (LPCVOID)adresik, buffer, MAX_SIZE, NULL); // get name 

papa = buffer;  

Кроме того, если строка является правильным вокруг страницы-границы, вам может понадобиться для прочитайте его побайтовым или небольшим фрагментам, пока не найдете завершающий нулевой символ. Поэтому, если вы можете найти длину строки, хранящуюся в любом месте, я предлагаю вам прочитать и использовать это.

0

Приветствия приятеля, который помог мне! ее исправленный код readName, на всякий случай;) изменил максимальный размер до 15, так как в NPC/monster в игре не было более 15 символов.

строка readName (HANDLE handlez, DWORD база, DWORD п.н., DWORD ofset1, DWORD ofset2, DWORD ofsetInc) {

DWORD adresik; 

    ReadProcessMemory(handlez, (LPCVOID)(base + bp), &adresik, sizeof(DWORD), NULL); // base adress + base pointer 
    adresik += ofset1;   //1st lvl pointer 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += ofset2;   // 2nd lvl pointer 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += ofsetInc;   // 3rd lvl pointer this goes up +=20 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += 0x12c;     // 4th static pointer 
    ReadProcessMemory(handlez, (LPCVOID)adresik, &adresik, sizeof(DWORD), NULL); 
    adresik += 0x0;      // 5th static pointer 


    string papa; 
    const int max_size = 15; 
    const char buffer[max_size] = { 'b' }; 


    ReadProcessMemory(handlez, (LPCVOID)adresik, (void*)&buffer, sizeof(buffer), NULL); // get name 

    papa = buffer; 

    DWORD ero = GetLastError(); 
    cout << ero << endl; 
    return papa; // return name 


} 
+0

Ваша проверка ошибок не так. Вам нужно проверить возвращаемое значение 'ReadProcessMemory', если ** и только если ** это false, ** тогда ** вы вызываете GetLastError(). –

Смежные вопросы