Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

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

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

C++:
Expand Collapse Copy
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?
 
После прочтения поста, хочется задать только один вопрос, - ты знаешь как устроенна память, как работают указатели, структуры и тд?
 
По идее ничего не мешает сделать все сразу.
Тогда я получу другой результат(не значение золота), нужно именно читать память и добавлять к ней следующий оффсет. Но, я не понимаю почему так нужно делать
 
После прочтения поста, хочется задать только один вопрос, - ты знаешь как устроенна память, как работают указатели, структуры и тд?

Я знаю как работают указатели, возможно плохо знаю как работает память. Потому и задал вопрос чтобы мне подсказали как разобраться в этом вопросе. Я не понимаю почему нужно читать значение памяти, прежде чем добавлять смещение
 
Тогда я получу другой результат(не значение золота), нужно именно читать память и добавлять к ней следующий оффсет. Но, я не понимаю почему так нужно делать
Если ты знаешь, как работают указатели, то почему ты не можешь понять, почему ты так делаешь? Хорошо, если на пальцах:
1) У тебя есть оффсет до первого указателя, ты читаешь его, те читаешь адрес из него.
2) Ты прибавляешь к прочитанному адресу (из указателя) оффсет до нужных тебе данных (золота)
3) Читаешь данные по адресу, который ты получил в результате незаурядных операций, те получаешь значение золота.

Теперь ясно?
 
Последнее редактирование:
Если ты знаешь, как работают указатели, то почему ты не можешь понять, почему ты так делаешь? Хорошо, если на пальцах:
1) У тебя есть оффсет до первого указателя, ты читаешь его, те читаешь адрес из него.
2) Ты прибавляешь к прочитанному адресу (из указателя) оффсет до нужных тебе данных (золота)
3) Читаешь данные по адресу, который ты получил в результате незаурядных операций, те получаешь значение золота.

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

Что тогда 0x026E8D11, если это не указатель? Просто значение из которого нужно получить указатель?
 
C++:
Expand Collapse Copy
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){};
    }
}

Держи разберешься что к чему
 
Назад
Сверху Снизу