2015-09-14 2 views
0

Я пытаюсь использовать рутину FP, но она не работает ... Почему? Это мой код:Ошибка управления памятью

int output = FindPattern(0x0042A000, 0x2000, "\x68\x00\x00\x00\x00\xFF\x76\x08\x89\x46\x44", "x????xxxxxx"); 
       if (output > -1) { 
        ReadProcessMemory(hProcHandle, (PVOID)address, &value2, sizeof(value2), NULL);     
       } 

Function: 
int FindPattern(int start_offset, int size, const char * pattern, const char * mask) 
{ 
    int pos = 0; 

    for (int retAddress = start_offset; retAddress < start_offset + size; retAddress++) 
    { 
     if (*(const char*)retAddress == pattern[pos] || mask[pos] == '?') 
     { 
      if (mask[pos+1] == '\0') 
       return retAddress+1; 
      pos++; 
     } 
     else 
      pos = 0; 
    } 

    return -1; 
} 

Я также попытался:

DWORD output = FindPattern(hProcHandle, "\x68\x00\x00\x00\x00\xFF\x76\x08\x89\x46\x44", "x????xxxxxx"); 


bool VerifyAddress(HANDLE hwnd, DWORD dwAddress, char *bMask, char *szMask) 
{ 
    PBYTE *pTemp = { 0 }; 

    for (int i = 0; *szMask; ++szMask, ++bMask, ++i) 
    { 

     if (!ReadProcessMemory(hwnd, reinterpret_cast<LPCVOID>(dwAddress + i), &pTemp, sizeof(pTemp), 0)){ 
      return false; 
     } 

     if (*szMask == 'x' && (char)pTemp != *bMask){ 
      return false; 
     } 
    } 

    return true; 
} 

DWORD FindPattern(HANDLE hwnd, char* bMask, char *szMask) 
{ 
    for (DWORD dwCurrentAddress = 0x4FFFFFF; dwCurrentAddress < 0x7FFFFFF; dwCurrentAddress++){ 
     if (VerifyAddress(hwnd, dwCurrentAddress, bMask, szMask)) { 
      return dwCurrentAddress; 
     } 
    } 

Но с этими кодами я всегда

Необработанное исключение в 0x01034BB1 в program.exe: 0xC0000005: Access место для считывания ошибок 0x02343DA2.

ответ

0

Этот код:

int output = FindPattern(0x0042A000, 0x2000, 

означает, что вы используете адрес 0x0042A000 локальным для процесса, так что вы итерацией некоторых случайных адресов в вашем процессе, который является Неопределенным поведением и заканчивается исключением.

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

+0

Кроме того, вы смешиваете 'int' и' char * '. Используйте тип memsize, когда вы имеете дело с указателями, иначе он рано или поздно сработает. 'int val = (int) address' не получается, потому что адрес не подходит в' val' в 64-битных системах. – HelloWorld

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