doc9009 Опубликовано 7 июля, 2013 Поделиться Опубликовано 7 июля, 2013 возникает ошибка нарушение прав доступа на моменте поиска по сигнатуре, уже весь мозг себе поломал, вот мой код: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); // запоминаем номер в переменную pidhModuleSnap = 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 42DWORD 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 же... может кто подсказать как то же самое осуществить без инжекта?и я буду очень благодарен тому кто объяснит мне работу сканера сигнатур(его подробный алгоритм) Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 8 июля, 2013 Поделиться Опубликовано 8 июля, 2013 Дело в том, что ты ищешь сигнатуру в своей программе, а не игре. Ссылка на комментарий Поделиться на другие сайты Поделиться
doc9009 Опубликовано 8 июля, 2013 Автор Поделиться Опубликовано 8 июля, 2013 проблема кроется я думаю потому что в этой функции с нужного процесса ничего не считывается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, но тут же я поймал ступор, как пользуясь этой функцией можно прочитать всю последовательность байт по нужному адресу, а не только значение, которое там лежит? Ссылка на комментарий Поделиться на другие сайты Поделиться
serega11134 Опубликовано 8 июля, 2013 Поделиться Опубликовано 8 июля, 2013 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
doc9009 Опубликовано 8 июля, 2013 Автор Поделиться Опубликовано 8 июля, 2013 спасибо, я как раз уроки кодера смотрю, но до этого урока пока не дошел, поэтому поднял на мой взгляд теперь глупую тему Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения