Как работает этот код?

ARMOR

Модератор по раксампу
Автор темы
Модератор
4,937
6,738
Версия MoonLoader
.026-beta
Кароче. Возьмем к примеру такой код от Хероку который меняет цвет диалогов:
Lua:
function setDialogColor(l_up, r_up, l_low, r_bottom)
    local CDialog = memory.getuint32(getModuleHandle("samp.dll") + 0x21A0B8)
    local CDXUTDialog = memory.getuint32(CDialog + 0x1C)
    memory.setuint32(CDXUTDialog + 0x12A, l_up, true) -- Left corner
    memory.setuint32(CDXUTDialog + 0x12E, r_up, true) -- Right upper corner
    memory.setuint32(CDXUTDialog + 0x132, l_low, true) -- Lower left corner
    memory.setuint32(CDXUTDialog + 0x136, r_bottom, true) -- Right bottom corner
end
Меня интересуют эти 5 строчек
Lua:
local CDXUTDialog = memory.getuint32(CDialog + 0x1C)
memory.setuint32(CDXUTDialog + 0x12A, l_up, true) -- Left corner
memory.setuint32(CDXUTDialog + 0x12E, r_up, true) -- Right upper corner
memory.setuint32(CDXUTDialog + 0x132, l_low, true) -- Lower left corner
memory.setuint32(CDXUTDialog + 0x136, r_bottom, true) -- Right bottom corner
Каким способом он узнал какое значение нужно прибавлять к CDialog (0x1C), а потом и к CDXUTDialog? ( 0x12A, 0x12E, 0x132, 0x136 ) Тут порядок мне более мене понятен, т.к он прибавляет каждый раз на 4 байта больше значение, т.к цвета хранятся в 32 битном участке. Но один хуй как он узнал что цвет именно в 0x12A хранится?
 

RedHolms

Известный
Проверенный
619
366
Кароче. Возьмем к примеру такой код от Хероку который меняет цвет диалогов:
Lua:
function setDialogColor(l_up, r_up, l_low, r_bottom)
    local CDialog = memory.getuint32(getModuleHandle("samp.dll") + 0x21A0B8)
    local CDXUTDialog = memory.getuint32(CDialog + 0x1C)
    memory.setuint32(CDXUTDialog + 0x12A, l_up, true) -- Left corner
    memory.setuint32(CDXUTDialog + 0x12E, r_up, true) -- Right upper corner
    memory.setuint32(CDXUTDialog + 0x132, l_low, true) -- Lower left corner
    memory.setuint32(CDXUTDialog + 0x136, r_bottom, true) -- Right bottom corner
end
Меня интересуют эти 5 строчек
Lua:
local CDXUTDialog = memory.getuint32(CDialog + 0x1C)
memory.setuint32(CDXUTDialog + 0x12A, l_up, true) -- Left corner
memory.setuint32(CDXUTDialog + 0x12E, r_up, true) -- Right upper corner
memory.setuint32(CDXUTDialog + 0x132, l_low, true) -- Lower left corner
memory.setuint32(CDXUTDialog + 0x136, r_bottom, true) -- Right bottom corner
Каким способом он узнал какое значение нужно прибавлять к CDialog, а потом и к CDXUTDialog?
Смещение до переменной в классе


Из под C/C++ можно получить это таким способом:
C++:
#define GetMemberOffset(st, mb) ((uintptr_t)&(((st*)nullptr)->mb))

printf("Offset to CDialog::Member = %u\n", GetMemberOffset(CDialog, Member));
 
  • Нравится
Реакции: ARMOR