VDV Опубликовано 25 июня, 2013 Поделиться Опубликовано 25 июня, 2013 практиковался по видео уроку Кодера , а именно "реверсинг".------------------------------------------сам код:начал с простенького,отреверсил , скопировал класс c генератора РЕКЛАССА , класс простенький , состоящий только из одного параметра(для тренировки)class RecoilPlayer;class RecoilPlayer{public: __int32 Recoil; //0x0000char _0x0004[60];static RecoilPlayer* Singleton (int*address){return *(RecoilPlayer**)address;}};//Size=0x0040далее: CreateConsole(); DWORD Recoil_Eng = (DWORD)GetModuleHandle("Game.exe") + 0x13F135C; DWORD offsets[] = {0x50 , 0x138 , 0xC , 0x4 , 0x3C}; int* locPlayer = ReadPointer(Recoil_Eng, offsets ,5); RecoilPlayer* localPlayer = RecoilPlayer::Singleton(locPlayer); printf (" address = %X\n%X\n%d\n" , Recoil_Eng , locPlayer , localPlayer); localPlayer->Recoil = 100; в отладочной консоле все верно - Recoil_Eng - поинтер верный , locPlayer - адресс верный , localPlayer - значение адреса соответственно верное. При попытке localPlayer->Recoil = 100; - краш,не могу понять , в чем дело. ========================================================================== Я правильно понимаю , что мы создаём копию игрового класса и изменяем эту копию , а не сам адрес и поэтому при просмотре в СЕ сам адрес не будет изменен никак , а будет изменена только наша копия класса? Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 25 июня, 2013 Поделиться Опубликовано 25 июня, 2013 Не правильно.Мы изменяем уже существующий экземпляр класса в игре.Выведи в консоль себе адрес localPlayer->Recoil Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 25 июня, 2013 Автор Поделиться Опубликовано 25 июня, 2013 Не правильно.Мы изменяем уже существующий экземпляр класса в игре.Выведи в консоль себе адрес localPlayer->Recoilвывел - то есть не выводит , крашит.----------------------------------------------------Вопрос такой , а как сделать чтобы не было видно что мы что-то меняли , ну к примеру чтобы изменить отдачу , мы нопим нужную нам функцию , при этом изменяем байты , а как сделать чтобы , отдачу мы изменили , а байты на месте остались и типа мы нечего не изменяли , у тебя есть уроки об этом? и как это сделать ,в чем смысл? Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 25 июня, 2013 Поделиться Опубликовано 25 июня, 2013 , а как сделать чтобы , отдачу мы изменили , а байты на месте остались и типа мы нечего не изменялиДумаю никак, тока если сделать через поинтеры. Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 25 июня, 2013 Автор Поделиться Опубликовано 25 июня, 2013 Думаю никак, тока если сделать через поинтеры.каким образом , объясни пожалуйста на "пальцах" , создать указатель на указатель? Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 25 июня, 2013 Поделиться Опубликовано 25 июня, 2013 вывел - то есть не выводит , крашит.----------------------------------------------------Вопрос такой , а как сделать чтобы не было видно что мы что-то меняли , ну к примеру чтобы изменить отдачу , мы нопим нужную нам функцию , при этом изменяем байты , а как сделать чтобы , отдачу мы изменили , а байты на месте остались и типа мы нечего не изменяли , у тебя есть уроки об этом? и как это сделать ,в чем смысл?Очевидно же, попробуй передавать указатель на экземпляр класса, а не адрес экземпляра класса. Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 25 июня, 2013 Автор Поделиться Опубликовано 25 июня, 2013 Очевидно же, попробуй передавать указатель на экземпляр класса, а не адрес экземпляра класса.Я не понимаю что ты имеешь ввиду... в плане кода Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 25 июня, 2013 Поделиться Опубликовано 25 июня, 2013 Смотри ты делаешь переменную, просто со значением адреса класса, но адрес у неё другой.Тебе же надо сделать так, чтобы адрес этой переменной соответствовал адресу класса.Вот к примеру:// adress of class Player = 0x4000 (Player*);int** address = &Player; Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 26 июня, 2013 Автор Поделиться Опубликовано 26 июня, 2013 Смотри ты делаешь переменную, просто со значением адреса класса, но адрес у неё другой.Тебе же надо сделать так, чтобы адрес этой переменной соответствовал адресу класса.Вот к примеру:// adress of class Player = 0x4000 (Player*);int** address = &Player;Я туплю короче....Я понимаю так :когда я вызываю функциюlocalPlayer->Recoil=100;Я вызываю класс , в нем функцию возврата адреса и далее параметр класса "Recoil" , но адрес в "Recoil" получается не определен, и поэтому я пытаюсь писать в несуществующую область памяти? Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 26 июня, 2013 Поделиться Опубликовано 26 июня, 2013 Я туплю короче....Я понимаю так :когда я вызываю функциюlocalPlayer->Recoil=100;Я вызываю класс , в нем функцию возврата адреса и далее параметр класса "Recoil" , но адрес в "Recoil" получается не определен, и поэтому я пытаюсь писать в несуществующую область памяти?Поспешу разочаровать тебя, ты вызываешь не функцию, а ктулху походу (шучу ).Ты обращаешься к полю класса.В твоём же случае говорю тебе ещё раз, тебе нужно передавать ссылку на класс, а не переменную, которая хранит адрес класса. Ссылка на комментарий Поделиться на другие сайты Поделиться
VDV Опубликовано 27 июня, 2013 Автор Поделиться Опубликовано 27 июня, 2013 Поспешу разочаровать тебя, ты вызываешь не функцию, а ктулху походу (шучу ).Ты обращаешься к полю класса.В твоём же случае говорю тебе ещё раз, тебе нужно передавать ссылку на класс, а не переменную, которая хранит адрес класса.тему можно закрыть.вот так нужно было возвращать адресс ,если кому интересно, как и сказал кодер , "ссылку на класс", все работает , благодарность кодеру.return (RecoilPlayer*)address; Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения