C++ Вопрос Про смещения и чтение памяти

Начинающий
Статус
Оффлайн
Регистрация
11 Дек 2022
Сообщения
4
Реакции[?]
0
Поинты[?]
0
Есть код:

C++:
DWORD gold_value = 0;
DWORD bytes_read = 0;

ReadProcessMemory(game_process, (void*)0x026E8D11, &gold_value, 4, &bytes_read); 


gold_value += 0xA20;

ReadProcessMemory(game_process, (void*)gold_value, &gold_value, 4, &bytes_read);


gold_value += 4;
Вопрос: зачем читать каждый раз память до и после добавления смещения? Почему просто нельзя добавить (0x026E8D11 + 0xA20 + 0x4), и полученный адрес прочитать и получить значение Gold?
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
После прочтения поста, хочется задать только один вопрос, - ты знаешь как устроенна память, как работают указатели, структуры и тд?
 
Начинающий
Статус
Оффлайн
Регистрация
11 Дек 2022
Сообщения
4
Реакции[?]
0
Поинты[?]
0
По идее ничего не мешает сделать все сразу.
Тогда я получу другой результат(не значение золота), нужно именно читать память и добавлять к ней следующий оффсет. Но, я не понимаю почему так нужно делать
 
Начинающий
Статус
Оффлайн
Регистрация
11 Дек 2022
Сообщения
4
Реакции[?]
0
Поинты[?]
0
После прочтения поста, хочется задать только один вопрос, - ты знаешь как устроенна память, как работают указатели, структуры и тд?
Я знаю как работают указатели, возможно плохо знаю как работает память. Потому и задал вопрос чтобы мне подсказали как разобраться в этом вопросе. Я не понимаю почему нужно читать значение памяти, прежде чем добавлять смещение
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
Тогда я получу другой результат(не значение золота), нужно именно читать память и добавлять к ней следующий оффсет. Но, я не понимаю почему так нужно делать
Если ты знаешь, как работают указатели, то почему ты не можешь понять, почему ты так делаешь? Хорошо, если на пальцах:
1) У тебя есть оффсет до первого указателя, ты читаешь его, те читаешь адрес из него.
2) Ты прибавляешь к прочитанному адресу (из указателя) оффсет до нужных тебе данных (золота)
3) Читаешь данные по адресу, который ты получил в результате незаурядных операций, те получаешь значение золота.

Теперь ясно?
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
11 Дек 2022
Сообщения
4
Реакции[?]
0
Поинты[?]
0
Если ты знаешь, как работают указатели, то почему ты не можешь понять, почему ты так делаешь? Хорошо, если на пальцах:
1) У тебя есть оффсет до первого указателя, ты читаешь его, те читаешь адрес из него.
2) Ты прибавляешь к прочитанному адресу (из указателя) оффсет до нужных тебе данных (золота)
3) Читаешь данные по адресу, который ты получил в результате незаурядных операций, те получаешь значение золота.

Теперь ясно?
Мне не понятно зачем читать память , а после чего добавлять оффсет. Читая адрес 0x026E8D11 , какие данные я получаю? Почему если я добавлю просто память(0x026E8D11) + оффсеты( не читая память каждый раз), то получу вообще другое значение?

Что тогда 0x026E8D11, если это не указатель? Просто значение из которого нужно получить указатель?
 
EAC Demolisher
Пользователь
Статус
Оффлайн
Регистрация
17 Апр 2020
Сообщения
62
Реакции[?]
52
Поинты[?]
0
C++:
void MemoryHack()
{
        for(;;Sleep(5))
    {
        __try
        {
            DWORD Bullets = (DWORD)GetModuleHandleA("webplayer_win.dll") + 0x006D4944;// Прописываем наш базовый адресс - "mono-1-vc.dll"+001F32A0
            DWORD Bullets_1 = *(DWORD*)(Bullets);
            DWORD Bullets_2 = *(DWORD*)(Bullets_1 + 0xe0);
            DWORD Bullets_3 = *(DWORD*)(Bullets_2 + 0x174);
            DWORD Bullets_4 = *(DWORD*)(Bullets_3 + 0x8);
            DWORD Bullets_5 = *(DWORD*)(Bullets_4 + 0xe0);
            DWORD Bullets_Adress = Bullets_5 + 0x3fb;//Bullets_Adress - это наш статичный адрес по указателю.

            if(Items.BulletsHack == 1)//Здесь прописываем нашу функцию. Не забываем прописать функцию.
              {
            HANDLE CurrentP = GetCurrentProcess();
            DWORD BulletsON = Bullets;
            BYTE PATCH[12] = { 0x87, 0x69, 0x01, 0x00, 0x00, 0x90, 0x90, 0x90, 0x90, 0x90, 0xF3, 0x0F };//Нопаем. Это мы делаем ноп 90 это FF
            WriteProcessMemory(CurrentP , (PBYTE)BulletsON, &PATCH, 12, 0);
              }
             else
              {
            HANDLE CurrentP = GetCurrentProcess();
            DWORD BulletsOFF = Bullets;
            BYTE PATCH[12] = { 0x87, 0x69, 0x01, 0x00, 0x00, 0xF3, 0x0F, 0x10, 0x46, 0x44, 0xF3, 0x0F };//Оригинальные байты. Это наши оригинальные байты, их три штуки
            WriteProcessMemory(CurrentP , (PBYTE)BulletsOFF, &PATCH, 12, 0);                    
              }

         }
        __except(EXCEPTION_EXECUTE_HANDLER){};
    }
}
Держи разберешься что к чему
 
Сверху Снизу