Оффсет (ака смещение) это расстояние от базы (начала чего либо) до конкретного элемента. Допустим в слове "random" оффсетом до буквы "r" будет являться 0, а до буквы "m" - 5
В программировании при создании переменной выделяется память размером типа переменной
Допустим есть у нас такая структура:
struct object
{
int a;
int b;
int c;
};
содержит 3 значения с типом int, а размер int 4 байта, значит размер структуры (и в дальнейшем объекта) будет 3 * 4 = 12 байт
Теперь создаем объект, получаем его адрес, допустим 0x100, это наша база, от этого адреса лежат наши 12 байт, теперь можем получать значения по оффсету:
a = 0x100 + 0x0 = 0x100;
b = 0x100 + 0x4 = 0x104;
c = 0x100 + 0x8 = 0x108;
В играх все тоже самое, допустим игрок:
class Player
{
private:
char* nick;
int team;
int health;
int mana;
}
Игра создала этот объект по адресу 0x100, осталось найти оффсет до хп допустим
Первое значение char*, это адрес, и его размер 4 или 8 байт в зависимости от разрядности (x32/x64)
Остальные int 4 байта, получается размер структуры 4/8 + 4 + 4 + 4 = 16/20 байт, а оффсеты к значениям:
nick = 0x100 + 0x0 = 0x100;
team = 0x100 + 0x4/0x8 = 0x104/0x108;
health = 0x100 + 0x4/0x8 + 0x4 = 0x108/0x10C
каким хуем в общем то? int32 == int32 (int32_t) и никак иначе
int health = (int)(localPawn + 0x344);
health будет содержать адрес хп кастованный к инту, нужно разыменовывать:
int health = *(int*) (localPawn + 0x344);
А чем обусловлено то, что dwLocalPlayerPawn в client.dll является baseEntity?
реверсом