Перейти к содержанию

Рекомендуемые сообщения

возникает ошибка нарушение прав доступа на моменте поиска по сигнатуре, уже весь мозг себе поломал, вот мой код:


void Button1Click(HWND hWnd)
{
HWND hWndGame = NULL;
DWORD pid = 0;
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
DWORD BA = NULL;
hWndGame = FindWindow(NULL, TEXT("Mass Effect"));
GetWindowThreadProcessId(hWndGame,&pid); // запоминаем номер в переменную pid
hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, pid );

me32.dwSize = sizeof( MODULEENTRY32 );
Module32First(hModuleSnap, &me32);
BA = (DWORD)me32.modBaseAddr;
//80 93 73 00 06 00 00 00 00 00 E0 40 00 00 C8 42
DWORD address1 = FindPattern(BA, 0xFFFFFFFF, (PBYTE)"\x80\x93\x73\x00\x06\x00\x00\x00\x00\x00\xE0\x40\x00\x00\xC8\x42", "????xxxxxxxxxxxx");
}
bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
for(;*szMask;++szMask,++pData,++bMask)
if(*szMask=='x' && *pData!=*bMask)
return 0;
return (*szMask) == NULL;
}
DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i<dwLen; i++)
if (bCompare((BYTE*)(dwAddress+i),bMask,szMask))
return (DWORD)(dwAddress+i);
return 0;
}

AOBscan-ом пытаюсь отыскать адрес денег по составленной сигнатуре, есть подозрение, что я не правильно составил сигнатуру, сейчас опишу как я её составлял:

1) в CE нашел адрес с деньгами

2) нажал просмотреть этот регион памяти

3) там был код вида (80 93 73 00 06 00 00 00 00 00 E0 40 00 00 C8 42), сделал эксперимент с деньгами меняя их значение и этим я выяснил, что первый байт отвечает за кол-во денег(80 93 73 00), остальные 3 байта вроде статичны

4) составил сигнатуру и маску: (80 93 73 00 06 00 00 00 00 00 E0 40 00 00 C8 42); (????xxxxxxxxxxxx)

все понял код для инжекта dll же... может кто подсказать как то же самое осуществить без инжекта?

и я буду очень благодарен тому кто объяснит мне работу сканера сигнатур(его подробный алгоритм)

Ссылка на комментарий
Поделиться на другие сайты

проблема кроется я думаю потому что в этой функции с нужного процесса ничего не считывается


DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i<dwLen; i++)
if (bCompare((BYTE*)(dwAddress+i),bMask,szMask))
return (DWORD)(dwAddress+i);
return 0;
}

не долго думав мне пришло в голову, что по идее можно использовать readprocessmemory, но тут же я поймал ступор, как пользуясь этой функцией можно прочитать всю последовательность байт по нужному адресу, а не только значение, которое там лежит?

Ссылка на комментарий
Поделиться на другие сайты

template <class T> T ReadMemoryAddress(DWORD address)

{

static char buffer[1024];

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, NULL);

ReadProcessMemory(hProcess, (LPCVOID) address, &buffer, sizeof(buffer), NULL);

CloseHandle(hProcess);

return reinterpret_cast<T> (buffer) ;

}

bool bCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)

{

for(;*szMask;++szMask,++pData,++bMask)

if(*szMask=='x' && *pData!=*bMask)

return 0;

return (*szMask) == NULL;

}

DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)

{

for(DWORD i=0; i<dwLen; i++)

if (bCompare(ReadMemoryAddress<BYTE*>(dwAddress + i),bMask,szMask))

return (DWORD)(dwAddress+i);

return 0;

}

Улучшаем свой первый EXE трейнер на C++ (видео урок #10)

Coder

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.