Показать сообщение отдельно

  #4  
Старый 14.10.2024, 13:32
moreveal
Постоянный
Регистрация: 01.08.2020
Сообщений: 988
С нами: 3043831

Репутация: 163


По умолчанию

Цитата:
Сообщение от 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
)
;
// И возвращаем защиту на место


лучше, конечно, накатить на всё это дело удобный интерфейс, чтобы не приходилось сталкиваться вновь
 
Ответить с цитированием