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

Краш при записи c++/VS 2012


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

практиковался по видео уроку Кодера , а именно "реверсинг".

------------------------------------------

сам код:

начал с простенького,отреверсил , скопировал класс c генератора РЕКЛАССА , класс простенький , состоящий только из одного параметра(для тренировки)

class RecoilPlayer;

class RecoilPlayer
{
public:
__int32 Recoil; //0x0000
char _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;

- краш,не могу понять , в чем дело.

==========================================================================

Я правильно понимаю , что мы создаём копию игрового класса и изменяем эту копию , а не сам адрес и поэтому при просмотре в СЕ сам адрес не будет изменен никак , а будет изменена только наша копия класса?

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

Не правильно.

Мы изменяем уже существующий экземпляр класса в игре.

Выведи в консоль себе адрес localPlayer->Recoil

вывел - то есть не выводит , крашит.

----------------------------------------------------

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

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

, а как сделать чтобы , отдачу мы изменили , а байты на месте остались и типа мы нечего не изменяли

Думаю никак, тока если сделать через поинтеры.

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

Думаю никак, тока если сделать через поинтеры.

каким образом , объясни пожалуйста на "пальцах" , создать указатель на указатель?

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

вывел - то есть не выводит , крашит.

----------------------------------------------------

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

Очевидно же, попробуй передавать указатель на экземпляр класса, а не адрес экземпляра класса.

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

Очевидно же, попробуй передавать указатель на экземпляр класса, а не адрес экземпляра класса.

Я не понимаю что ты имеешь ввиду... в плане кода

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

Смотри ты делаешь переменную, просто со значением адреса класса, но адрес у неё другой.

Тебе же надо сделать так, чтобы адрес этой переменной соответствовал адресу класса.

Вот к примеру:


// adress of class Player = 0x4000 (Player*);
int** address = &Player;

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

Смотри ты делаешь переменную, просто со значением адреса класса, но адрес у неё другой.

Тебе же надо сделать так, чтобы адрес этой переменной соответствовал адресу класса.

Вот к примеру:


// adress of class Player = 0x4000 (Player*);
int** address = &Player;

Я туплю короче....

Я понимаю так :

когда я вызываю функцию

localPlayer->Recoil=100;

Я вызываю класс , в нем функцию возврата адреса и далее параметр класса "Recoil" , но адрес в "Recoil" получается не определен, и поэтому я пытаюсь писать в несуществующую область памяти?

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

Я туплю короче....

Я понимаю так :

когда я вызываю функцию

localPlayer->Recoil=100;

Я вызываю класс , в нем функцию возврата адреса и далее параметр класса "Recoil" , но адрес в "Recoil" получается не определен, и поэтому я пытаюсь писать в несуществующую область памяти?

Поспешу разочаровать тебя, ты вызываешь не функцию, а ктулху походу (шучу :-D ).

Ты обращаешься к полю класса.

В твоём же случае говорю тебе ещё раз, тебе нужно передавать ссылку на класс, а не переменную, которая хранит адрес класса.

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

Поспешу разочаровать тебя, ты вызываешь не функцию, а ктулху походу (шучу :-D ).

Ты обращаешься к полю класса.

В твоём же случае говорю тебе ещё раз, тебе нужно передавать ссылку на класс, а не переменную, которая хранит адрес класса.

тему можно закрыть.

вот так нужно было возвращать адресс ,если кому интересно, как и сказал кодер , "ссылку на класс", все работает , благодарность кодеру.

return (RecoilPlayer*)address;

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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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