Сообщение от
nonelike
Код:
Код:
.text:10067C05 56 push esi
.text:10067C6F C7 06 0A 00 mov dword ptr [esi], 0Ah
esi я так понимаю будет как this? пробовал разные варианты, крашит
к примеру
Код:
Код:
int* esi = reinterpret_cast(0x67C05);
*esi = 15;
сними протект, замени 0a на нужное число и верни протект опять (адрес желательно искать по сигнатуре, чтобы работало на всех версиях сампа)
твоя ошибка в том, что ты не снимаешь протект + используешь абсолютный адрес, хотя длл, очевидно, встраивается в исполняемый процесс, получая свой сегмент памяти, поэтому адреса смещаются каждый запуск игры; использование абсолютных адресов возможно только для самой GTA, т.к. её адреса всегда будут начинаться с 0x400000
также в листинге мы видим адрес инструкции mov, а нам нужно поменять число 10 (0x0A), поэтому впоследствии к 0x67C6F нужно будет прибавить ещё 2:
.text:10067C6F C7 06 0A 00 00 00 mov dword ptr [esi], 10
зная, что по этому адресу располагается 32-битное число (как видишь, в листинге это 0A 00 00 00) - т.е. 4 байта под число, их мы и можем свободно использовать, вот как это может выглядеть в коде:
C++:
Код:
const
uintptr_t address
=
reinterpret_cast
(
GetModuleHandle
(
"samp.dll"
)
)
+
(
0x67C6F
+
2
)
;
// SAMP R3
DWORD dwOldProtect
;
VirtualProtect
(
(
LPVOID
)
address
,
4
,
PAGE_EXECUTE_READWRITE
,
&
dwOldProtect
)
;
// Снимаем защиту на запись (4 - размер нашего региона памяти в байтах)
*
reinterpret_cast
(
address
)
=
15
;
// Теперь можем менять число
VirtualProtect
(
(
LPVOID
)
address
,
4
,
dwOldProtect
,
nullptr
)
;
// И возвращаем защиту на место
лучше, конечно, накатить на всё это дело удобный интерфейс, чтобы не приходилось сталкиваться вновь