VDV Опубликовано 2 июля, 2013 Поделиться Опубликовано 2 июля, 2013 Делаю следующее:работаю с координатами:1. создал класс (для тренировки)class Coord;class Coord{public: float CoordX; //0x0000char _0x0004[60];static Coord* Singleton (int*address){return (Coord*)address;}};//Size=0x00402.Создал поток в котором производил махинации с координатами:void XP(){int* address = 0;int* CoordPlayerX = 0;if(fly==1){ DWORD old_protect = 0; DWORD PCoordX = (DWORD)GetModuleHandle("Game.exe") + 0x1235478;// поинтер верный DWORD offsetsX[] = {0x8 , 0x100 , 0x8, 0x740 , 0x70};//смещения тоже CoordPlayerX = ReadPointer(PCoordX, offsetsX ,5);//адресс прочитан верно , адресс динамический естественно Coord* PlayerX = Coord::Singleton(CoordPlayerX);// вот из-за этой штуки происходит краш , не сразу конечно , но через секунд 30 -120,не пойму почему IX = *(float*)address; VirtualProtect (address, 10 , PAGE_EXECUTE_READWRITE , &old_protect);//протекцию обнулил для прикола , толку 0 - все равно краш VirtualProtect (CoordPlayerX, 10 , PAGE_EXECUTE_READWRITE , &old_protect);// протекцию обнулил для прикола , толку 0 - все равно краш if (GetAsyncKeyState(VK_F1)) { PlayerX->CoordX = IX+FlySpeed;//запись происходит вроде-бы нормально } if (GetAsyncKeyState(VK_F2))//запись происходит вроде-бы нормально { PlayerX->CoordX = IX-FlySpeed; }}}все отлично работает , но есть одна ошибка,помогите разобраться в чем пожалуйста. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 3 июля, 2013 Поделиться Опубликовано 3 июля, 2013 Скорее всего CoordPlayerX принимает значение 0.Проверку делай - if (CoordPlayerX != NULL) Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 3 июля, 2013 Автор Поделиться Опубликовано 3 июля, 2013 Скорее всего CoordPlayerX принимает значение 0.Проверку делай - if (CoordPlayerX != NULL)спасибо тебе , а как можно сделать проверку на то - прочитался ли вообще адресCoordPlayerX = ReadPointer(PCoordX, offsetsX ,5);так правильно???if ( !ReadPointer) вернуть фолс или как правильнее будет? Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 3 июля, 2013 Поделиться Опубликовано 3 июля, 2013 Правильнее будет, так как я тебе прислал)if (CoordPlayerX != NULL && HIWORD(CoordPlayerX)) // так ещё лучше будет{ /// манипуляции с координатами} Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 3 июля, 2013 Автор Поделиться Опубликовано 3 июля, 2013 Правильнее будет, так как я тебе прислал)if (CoordPlayerX != NULL && HIWORD(CoordPlayerX)) // так ещё лучше будет{ /// манипуляции с координатами}благодарен сейчас попробуюсделал вот так :void XP(){float IX = 0;float IX1 = 0;int* address = 0;int* CoordPlayerX = 0;DWORD old_protect = 0;DWORD PCoordX = (DWORD)GetModuleHandle("Game.exe") + 0x1235478;DWORD offsetsX[] = {0x8 , 0x100 , 0x8, 0x740 , 0x70};if(fly==1){ CoordPlayerX = ReadPointer(PCoordX, offsetsX ,5); if(CoordPlayerX != NULL && HIWORD(CoordPlayerX))//Правильно я проверку вставил? VirtualProtect (CoordPlayerX, 10 , PAGE_EXECUTE_READWRITE , &old_protect); { Coord* PlayerX = Coord::Singleton(CoordPlayerX);// Краши уменьшились , но все равно остались IX = *(float*)address; if (GetAsyncKeyState(VK_F1)) { PlayerX->CoordX = IX+FlySpeed; } if (GetAsyncKeyState(VK_F2)) { PlayerX->CoordX = IX-FlySpeed; } }}}я так думаю , происходит вот что , когда вызывается класс а в нем функция возврата адресаCoord* PlayerX = Coord::Singleton(CoordPlayerX); , читается поинтер и находится адресс, так вот скорее всего ReadPointer(PCoordX, offsetsX ,5); - тут косяк или поинтер иногда не читается или доступа не хватает или я не знаю что ему надо вообще... Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 5 июля, 2013 Автор Поделиться Опубликовано 5 июля, 2013 тему можно закрыть - выход из ситуации нашел Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения