2017-01-09 18 views
-2

ゲームメモリからエンティティ名を読み取ろうとすると、ポインタを使用してチェックすると100%正確になります。ReadProcessMemoryでのエラー299

読み込み/書き込みフロート/整数値問題がない

32ビットプロセス、ゲームaswellは - 、x64の中でコードをコンパイルdidntはヘルプを試してみました。

GetLastError()

リターンは299

ERROR_PARTIAL_COPY

299 (0x12B) 

Only part of a ReadProcessMemory or WriteProcessMemory request was completed. 

任意のアイデアをどのようなことができる理由がnr個?あなただけのstd ::文字列のメモリ位置にC-文字列にコピーすることはできません

#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

以下 コード。何をしたい

は、おそらくこのようなものである(あなたが読んでいるこの実際にnullが終了しているされた文字列と仮定):文字列は右のあなたがする必要があるかもしれませんページ境界付近である場合も

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 /モンスターの名前が15シンボルを超えないためです。

文字列readName(HANDLEのhandlez、DWORDベース、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 


    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()を呼び出します。 –

関連する問題