

Адреса и их значение
Есть cs 1.6, есть ida freeware,
DWORD base_addr = (DWORD)getmodulehandle("hw.dll");
while(true)
{
DWORD playerclass = *(DWORD*)(base_addr + 0x1234); (0x1234 Для примера)
DWORD health = *(DWORD*)(base_addr + 0x123); (0x123 для примера)
*(DWORD*)(playerclass + health) = 300;
}
у меня крашиться игра. Вопрос : почему? :) P.S. x86 release многобайтовая кодировка, .dll (крутиться в голове мысль что-то как-то сделать с rpm, wpm (Я начинающий) )
Корректный вопрос - а почему оно не должно крашиться?
DWORD playerclass = *(DWORD*)(base_addr + 0x1234); // Получили адрес хз чего, допустим какой-то структуры, разыменовали указатель, получили значение какого-то поля этой структуры (допустим даже, что там записан корректный адрес, для примера возьмем 200500, если же там лежит значение/смещение, то тоже не легче)
DWORD health = *(DWORD*)(base_addr + 0x123); // аналогично для health, опять же допустим что это 300500.
*(DWORD*)(playerclass + health) = 300; // И начинаем творить - складываем два адреса, получаем 501000, который явно отличается от допустимых адресов, которые кто-то распределил (200500 и 300500), после чего по этому недействительному адресу пытаемся записать 300, получаем access violation или другое исключение.
Если же складываем не адреса, а два смещения без указания базы, где расположен РЕАЛЬНЫЙ ЭКЗЕМПЛЯР структуры, (в которой предполагается искать playerclass, содержащий поле health, подсказка, он не в dll-ке лежит), то получаем околонулевой адрес, на котором тоже не может лежать ничего полезного и он уже гарантированно выдаст Access Violation.