-
Постов
25 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент Chusa
-
Странно, но при чтение в переменной coor_X имеется значение, да оно не того типа, но оно имеется. Сначало я нажимаю, чтобы записать в эти переменные, а потом, чтобы записать и когда записываю в переменных уже нули. Хотя, когда читаю память в переменнх имеется значение. И еще у меня вопрос возник про чтение вот у меня в переменной center_X есть адрес в котором хранится значение координаты Х и последняя функция RPM получается читает в переменную cord_X значение этого адреса, но оно не в том типе и даже то, что приводил кенг не работает вот пример значение cord_X == 184490720, а f_coord_X == -107374176 Хотя истинное значение в данный момент равно 2250.819336.
-
При записи в память при таком коде case WM_KEYDOWN: if(wParam == 0x49) { MessageBox(hWnd,"Сохранение координат","Lol",MB_OK); VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); ReadProcessMemory(phandle,(LPCVOID)Base, &CPed, sizeof(Base), NULL); center = CPed + 0x14; ReadProcessMemory(phandle,(LPCVOID)center, &coord_X1, sizeof(center), NULL); center_X = coord_X1 + 0x30; ReadProcessMemory(phandle,(LPCVOID)center_X, &coord_X, sizeof(center_X), NULL); float f_coord_X = (float)coord_X; ReadProcessMemory(phandle,(LPCVOID)center, &coord_Y1, sizeof(center), NULL); center_Y = coord_Y1 + 0x34; ReadProcessMemory(phandle,(LPCVOID)center_Y, &coord_Y, sizeof(center_Y), NULL); float f_coord_Y = (float)coord_Y; ReadProcessMemory(phandle,(LPCVOID)center, &coord_Z1, sizeof(center), NULL); center_Z = coord_Z1 + 0x38; ReadProcessMemory(phandle,(LPCVOID)center_Z, &coord_Z, sizeof(center_Z), NULL); float f_coord_Z = (float)coord_Z; } if(wParam == 0x55) { MessageBox(hWnd,"Телепорт","Lol",MB_OK); WriteProcessMemory(phandle, ¢er_X, (LPCVOID)coord_X, sizeof(center_X), NULL); WriteProcessMemory(phandle, ¢er_Y, (LPCVOID)coord_Y, sizeof(center_Y), NULL); WriteProcessMemory(phandle, ¢er_Z, (LPCVOID)coord_Z, sizeof(center_Z), NULL); VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); CloseHandle(phandle); }Выдает вот такие ошибки, на отладке смотрел читает правильно, но при записи выдает вот так ошибки: Run-Time Check Failure #3 - The variable 'coord_X' is being used without being initialized. Run-Time Check Failure #3 - The variable 'coord_Y' is being used without being initialized. Run-Time Check Failure #3 - The variable 'coord_Z' is being used without being initialized.
-
А потом когда будем записывать, то это будет тритий параметр как я понял? И выглядеть это будет как то так? WriteProcessMemory(phandle, &coord_X, coord_X , sizeof(coord_X), NULL); Получается вот так coord_X == 181410528 f_coord_X == -107374176. coord_Y == 3298893584 f_coord_Y == 3.29889357e+009 coord_Z == 1096163328 f_coord_Z == -107374176. Настоящие координаты не менялись такие же, как и на скрине
-
LONG WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ HDC hDC; PAINTSTRUCT ps; DWORD Base = 0xB6F5F0; DWORD CPed = 0; HWND hwnd = FindWindow(0, "GTA:San Andreas"); DWORD pID = UpdatePID("gta_sa.exe"); HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pID); DWORD coord_X; DWORD coord_X1; DWORD coord_Y; DWORD coord_Y1; DWORD coord_Z; DWORD coord_Z1; DWORD center = 0; DWORD center_X = 0; DWORD center_Y = 0; DWORD center_Z = 0; DWORD old_prot = 0; switch(msg) { case WM_DESTROY: PostQuitMessage(0); case WM_COMMAND: switch(wParam) { case 1: break; } case WM_KEYDOWN: if(wParam == 0x49) { MessageBox(hWnd,"Сохранение координат","Lol",MB_OK); VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); ReadProcessMemory(phandle,(LPCVOID)Base, &CPed, sizeof(Base), NULL); center = CPed + 0x14; ReadProcessMemory(phandle,(LPCVOID)center, &coord_X1, sizeof(center), NULL); center_X = coord_X1 + 0x30; ReadProcessMemory(phandle,(LPCVOID)center_X, &coord_X, sizeof(center_X), NULL); ReadProcessMemory(phandle,(LPCVOID)center, &coord_Y1, sizeof(center), NULL); center_Y = coord_Y1 + 0x34; ReadProcessMemory(phandle,(LPCVOID)center_Y, &coord_Y, sizeof(center_Y), NULL); ReadProcessMemory(phandle,(LPCVOID)center, &coord_Z1, sizeof(center), NULL); center_Z = coord_Z1 + 0x38; ReadProcessMemory(phandle,(LPCVOID)center_Z, &coord_Z, sizeof(center_Z), NULL); } if(wParam == 0x55) { MessageBox(hWnd,"Телепорт","Lol",MB_OK); WriteProcessMemory(phandle, &coord_X, 0, sizeof(coord_X), NULL); WriteProcessMemory(phandle, &coord_Y, 0, sizeof(coord_Y), NULL); WriteProcessMemory(phandle, &coord_Z, 0, sizeof(coord_Z), NULL); VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); CloseHandle(phandle); } break; case WM_PAINT: { hDC = BeginPaint(hWnd, &ps); OnPaint(hDC); EndPaint(hWnd, &ps); break; } default: return DefWindowProc (hWnd, msg, wParam, lParam); } return 0;}Я знаю, что скорей всего надоел с этой темой, но прошу помочь еще. Читать все начало и все правильно, но теперь я не понимаю, на каком моменте мне надо остановиться. Дело в том, что в таблице СЕ вот такая ситуацияБаза адреса это переменная Base, из нее читается CPed, потом в переменную center пишется CPed+0x14, для первого смещения, далее coord_X1 читается(CPed+0x14) и далее в center_X пишется coord_X1+0x30 и это как я понял нужный адрес и мы читаем его последней функцией RPM в переменную coord_X, но в ней уже непонятный для меня мусор(но я не обратил внимания и стал сразу же писать функции для записи) и заметил это только на отладке, и теперь я не понимаю откуда надо начинать писать, если вам не трудно, то подскажите пожалуйста. Учту твои советы, всю нужную литературу прочитаю.
-
Все заработало. Надо было извенить третий параметр функции RPM. Вот как изменился код. Сейчас буду дописывать, чтобы читал все координаты до конца и записывал. Спасибо большое за помощь. case WM_KEYDOWN: if(wParam == 0x49) { DWORD Base = 0xB6F5F0; DWORD CPed = 0; HWND hwnd = FindWindow(0, "GTA:San Andreas"); DWORD pID = UpdatePID("gta_sa.exe"); HANDLE phandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pID); MessageBox(hWnd,"Сохранение координат","Lol",MB_OK); DWORD coord_X; DWORD coord_X1; DWORD coord_Y; DWORD coord_Y1; DWORD coord_Z; DWORD coord_Z1; DWORD center = 0; DWORD center_X = 0; DWORD center_Y = 0; DWORD center_Z = 0; DWORD old_prot = 0; VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); ReadProcessMemory(phandle,(LPCVOID)Base, &CPed, sizeof(Base), NULL); center = CPed + 0x14; VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); CloseHandle(phandle);Если нужен будет полный код, то он вот здесь вот https://yadi.sk/d/cFXHd8S5aLqXT. Как допишу полностью отмечусь, еще раз спасибо за помощь.
- 61 ответ
-
- 1
-
-
case WM_KEYDOWN: if(wParam == 0x49) { DWORD Base = 0xB6F5F0; DWORD CPed = 0; HWND hwnd = FindWindow(0, "GTA:San Andreas"); DWORD pID = UpdatePID("gta_sa.exe"); HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pID); MessageBox(hWnd,"Сохранение координат","Lol",MB_OK); DWORD coord_X; DWORD coord_X1; DWORD coord_Y; DWORD coord_Y1; DWORD coord_Z; DWORD coord_Z1; DWORD center = 0; DWORD center_X = 0; DWORD center_Y = 0; DWORD center_Z = 0; DWORD old_prot = 0; VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), PAGE_EXECUTE_READWRITE, &old_prot); ReadProcessMemory(phandle,(LPCVOID)Base, (LPVOID)CPed, sizeof(Base), NULL); center = CPed + 0x14; VirtualProtectEx(phandle, (LPVOID)Base, sizeof(Base), old_prot, &old_prot); CloseHandle(phandle);Вот так получилось и все равно в Cped == 0. Название изменилось потому, что я стал пробывать не на Криминальной России, а на обычной Сан-Андреас(Думал в этом ошибка).
-
Я по поводу функции FindWindow, а если я не знаю класс окна(или просто на данной стадии не понимаю, что это), то можно поставить просто 0? И еще заголовок окна жертвы брать из названия окна игры? По поводу pID - здесь все правильно я проверял pID находит правильно, я сверял с Диспетчером задач. Сейчас буду пробывать с функцией VirtualProtectEx и напишу о результатах.
-
1. А что именно туда надо передавать? ЗАголовок какого окна? 2. Функция UpdatePID работает отлично, все проверено на отладке. Вот ее код int UpdatePID(char* pName){ HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 pInfo; DWORD pID = 0; pInfo.dwSize = sizeof(PROCESSENTRY32); if(Process32First(snapshot,&pInfo)) { while(Process32Next(snapshot,&pInfo)) { if(_stricmp(pName,pInfo.szExeFile) == 0) { CloseHandle(snapshot); return pID = pInfo.th32ProcessID; } } } CloseHandle(snapshot); return 0;}3. Хэндл закрывается. 4 и 5 этот пункт я не смог реализовать потому, что выдает ошибку, что невозможно пребразовать DWORD в PDDWORD.
-
Все теперь я понял свою ошибку буду исправлять, спасибо за помощь. Вообщем я поменял, как было сказанно, но все равно в переменной CPed == 0. Но только одно я не смог сделать, это снять защиту потому, что выдает ошибку. Вот код который получился case WM_KEYDOWN: if(wParam == 0x49) { DWORD Base = 0xB6F5F0; DWORD CPed = 0; HWND hwnd = FindWindow(0, "grand_theft_auto_san_andreas.dll"); DWORD pID = UpdatePID("grand_theft_auto_san_andreas.dll"); HANDLE phandle = OpenProcess(PROCESS_VM_READ, 0, pID); MessageBox(hWnd,"Сохранение координат","Lol",MB_OK); DWORD coord_X; DWORD coord_X1; DWORD coord_Y; DWORD coord_Y1; DWORD coord_Z; DWORD coord_Z1; DWORD center = 0; DWORD center_X = 0; DWORD center_Y = 0; DWORD center_Z = 0; DWORD old_prot = 0; ReadProcessMemory(phandle,(void*)Base, (LPVOID)CPed, sizeof(Base), NULL); center = CPed + 0x14;
-
Вообщем попробывал, как ты сказал все тоже самое. Потом я решил начать писать все с нуля написал только чтение из памяти без всяких клавиш тупо вывод на консоль значений при каждом смещении, так все равно читате только то , что в базовом адресе и все дальше не идет. Я не знаю, что делать. Делал все, как показано у тебя в видео 1 к 1, только изменяется название игры и базовый адрес со смещениями
-
Keng я как только не пробывал, но у меня постоянно не может прочесть Handle процесса, но есть одна странность, что значение в базы он читает, но не записывает и поэтому дальше чтение по со смещениями не идет. Я пробывал делать, как ты, но у меня все равно пишет unused <Чтение памяти невозможно> , хотя значение базы читает правильно, я проверял на отладке, но не записывает его. Я снимал защиту на чтение с помощью функции VirtualProtect, но все равно пишет, что чтение невозможно. Если у тебя будет свободная минутка, то можешь написать чтение на координату Х, а дальше я уже сам пойму.
-
Я смотрел все твои уроки и кодера тоже. Именно после уроков мне и захотелось перевести все с СЕ на С++ потому, что он открывает еще большие просторы. Keng можешь объяснить как хотя бы прочесть одну координату, я а дальше я на примере сдедлаю. Вот та часть которую я написал сейчас, в вот здесь послностью весь код https://yadi.sk/d/6nkwuunIZdgPq case WM_KEYDOWN: if(wParam == 0x49) { DWORD pID = UpdatePID("grand_theft_auto_san_andreas.dll"); DWORD offsets_coordX[2] = {0xE, 0x1E}; DWORD offsets_coordY[2] = {0xE, 0x22}; DWORD offsets_coordZ[2] = {0xE, 0x26}; MessageBox(hWnd,"Сохранение координат","Lol",MB_OK); DWORD coord_X; DWORD coord_X1; DWORD coord_Y; DWORD coord_Y1; DWORD coord_Z; DWORD coord_Z1; DWORD center = 0; DWORD center_X = 0; DWORD center_Y = 0; DWORD center_Z = 0; ReadProcessMemory(hWnd,(LPCVOID)Base, (LPVOID)CPed, sizeof(Base), NULL); center = CPed + 0xE; ReadProcessMemory(hWnd,(LPCVOID)center, (LPVOID)coord_X1, sizeof(center), NULL); center_X = coord_X1 + 0x1E; ReadProcessMemory(hWnd,(LPCVOID)center_X, (LPVOID)coord_X, sizeof(center_X), NULL); ReadProcessMemory(hWnd,(LPCVOID)center, (LPVOID)coord_Y1, sizeof(center), NULL); center_Y = coord_Y1 + 0x22; ReadProcessMemory(hWnd,(LPCVOID)center_Y, (LPVOID)coord_Y, sizeof(center_Y), NULL); ReadProcessMemory(hWnd,(LPCVOID)center, (LPVOID)coord_Z1, sizeof(center), NULL); center_Z = coord_Z1 + 0x26; ReadProcessMemory(hWnd,(LPCVOID)center_Z, (LPVOID)coord_Z, sizeof(center_Z), NULL); } Заранее спасибо.
-
Да ты меня не правильно понял) В CE у меня уже все координаты найдены, теперь же я хочу, чтобы в любой момент времени я мог нажать клавишу и координаты записались(как делал ты в видео-уроке, но только я хчу реализовать на С++ и для трех осей), а потом нажать другую и опять вернуться на тоже место. И я не могу понять с чего начать читать потому что все что у меня есть в начале это указтель на CPed 0xB6F5F0 и я не знаю, как его прочитать, чтобы потом читать со смещениями. Как-то так) Сори если очень муторно по-другому я пока что не могу объянсить
-
Я начинающий и еще не очень сильно разобрался в работе указателей на С++. Но мне нужно из процесса игры прочесть и сохранить три координаты и в нужный момент по нажатию клавиши все это записать в память. pID процесса и все что еще необходимо я нашел и написал(из видео уроков и msdn), но только не могу написать само прочтение и записаь в память. Кому не сложно объяснить помогите пожалуйста. Исходники если надо, то я скину. Вот эти самые адреса из которых надо читать, сохранять и писать 0xB6F5F0 - Указатель игрока (CPed) (CPed+0x14) +0x30 = [dword] позиция по X-координате (CPed+0x14) +0x34 = [dword] позиция по Y-координате (CPed+0x14) +0x38 = [dword] позиция по Z-координате