 |
|

14.10.2024, 01:31
|
|
Познающий
Регистрация: 22.12.2018
Сообщений: 72
С нами:
3890632
Репутация:
63
|
|
Код:
Код:
void* __fastcall CChat_CChat(void* this_ptr, void *edx, void* pDevice, void* pFontRenderer, const char* Source);
inline c_hook CChat_CChat_hook{};
void* __fastcall CChat_CChat(void* this_ptr, void* edx, void* pDevice, void* pFontRenderer, const char* Source) {
return CChat_CChat_hook.call_original(this_ptr, edx, pDevice, pFontRenderer, Source);
}
не могу сообразить как поменять значение в 14й строчке на нужное, этот this ставит в ступор
|
|
|

14.10.2024, 02:01
|
|
Постоянный
Регистрация: 01.08.2020
Сообщений: 988
С нами:
3043831
Репутация:
163
|
|
Открой список структур в IDA и посмотри из чего состоит CChat; обращение по указателю - это фактически разыменовывание адреса по смещению от начала структуры до нужного элемента, m_nPageSize является первым элементом структуры, поэтому тебе повезло - просто представь адрес this в виде 32-битного числа (тип dd в IDA) и поменяй его на нужное
C++:
Код:
*
reinterpret_cast
(
this_ptr
)
=
15
;
Но в твоем случае нужно, разумеется, патчить функцию, а не ставить хук, чтобы получить адрес на this, поскольку если ты сперва изменишь его, а потом вызовешь оригинал - оно ресетнется в 10
|
|
|

14.10.2024, 13:04
|
|
Познающий
Регистрация: 22.12.2018
Сообщений: 72
С нами:
3890632
Репутация:
63
|
|
Сообщение от moreveal
Открой список структур в IDA и посмотри из чего состоит CChat; обращение по указателю - это фактически разыменовывание адреса по смещению от начала структуры до нужного элемента, m_nPageSize является первым элементом структуры, поэтому тебе повезло - просто представь адрес this в виде 32-битного числа (тип dd в IDA) и поменяй его на нужное
C++:
Код:
*
reinterpret_cast
(
this_ptr
)
=
15
;
Но в твоем случае нужно, разумеется, патчить функцию, а не ставить хук, чтобы получить адрес на this, поскольку если ты сперва изменишь его, а потом вызовешь оригинал - оно ресетнется в 10
Код:
Код:
.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;
|
|
|

14.10.2024, 13:32
|
|
Постоянный
Регистрация: 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
)
;
// И возвращаем защиту на место
лучше, конечно, накатить на всё это дело удобный интерфейс, чтобы не приходилось сталкиваться вновь
|
|
|

14.10.2024, 23:50
|
|
Познающий
Регистрация: 22.12.2018
Сообщений: 72
С нами:
3890632
Репутация:
63
|
|
плюсы:
Код:
const
uintptr_t address_vehicle
=
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
(
0x0E40D
)
;
DWORD dwOldProtect_veh
;
VirtualProtect
(
(
LPVOID
)
address_vehicle
,
6
,
PAGE_EXECUTE_READWRITE
,
&
dwOldProtect_veh
)
;
*
reinterpret_cast
(
address_vehicle
)
=
20000
;
VirtualProtect
(
(
LPVOID
)
address_vehicle
,
6
,
dwOldProtect_veh
,
&
dwOldProtect_veh
)
;
попытался захавать твою инфу с объяснением, попытался че то сделать с

чтобы поменять 611 -> 20000 но дальше краша не ушел
|
|
|

15.10.2024, 00:33
|
|
Постоянный
Регистрация: 01.08.2020
Сообщений: 988
С нами:
3043831
Репутация:
163
|
|
Сообщение от nonelike
плюсы:
Код:
const
uintptr_t address_vehicle
=
reinterpret_cast
(
GetModuleHandleA
(
"samp.dll"
)
)
+
(
0x0E40D
)
;
DWORD dwOldProtect_veh
;
VirtualProtect
(
(
LPVOID
)
address_vehicle
,
6
,
PAGE_EXECUTE_READWRITE
,
&
dwOldProtect_veh
)
;
*
reinterpret_cast
(
address_vehicle
)
=
20000
;
VirtualProtect
(
(
LPVOID
)
address_vehicle
,
6
,
dwOldProtect_veh
,
&
dwOldProtect_veh
)
;
попытался захавать твою инфу с объяснением, попытался че то сделать с чтобы поменять 611 -> 20000 но дальше краша не ушел
ты меняешь значение 263, это "63 02 00 00" (числа хранятся в обратном порядке, поэтому так - с десяткой было попроще), адрес 0xE040D начинается с "3D 63 02 00", т.е ты инструкцию перезатрешь, а тебе нужно 1 байт отступить:
0x0E40D + 0x01 (0x0E40E)
ну и точно также снять защиту с 4 байт, а не с 6, но это особо роли не сыграет
|
|
|

15.10.2024, 00:34
|
|
Познающий
Регистрация: 22.12.2018
Сообщений: 72
С нами:
3890632
Репутация:
63
|
|
Сообщение от moreveal
ты меняешь значение 263, это "63 02 00 00", адрес 0xE040D - начинается с "3D 63 02 00", т.е ты инструкцию перезатрешь, а тебе нужно 1 байт отступить:
0x0E40D + 0x01 (0x0E40E), ну и точно также снять защиту с 4 байт, а не с 6, но это особо роли не сыграет
объясни про эти байты еще раз пж, я еще в прошлом топике не все понял, это пи дец какой-то, а то я не вдупляю че как и в дальнейшем сто по сто снова ниче не сделаю и откуда вообще взял 1 байт
|
|
|

15.10.2024, 01:07
|
|
Постоянный
Регистрация: 01.08.2020
Сообщений: 988
С нами:
3043831
Репутация:
163
|
|
Сообщение от nonelike
объясни про эти байты еще раз пж, я еще в прошлом топике не все понял, это пи дец какой-то, а то я не вдупляю че как и в дальнейшем сто по сто снова ниче не сделаю и откуда вообще взял 1 байт
IDA тебе показывает адрес: 0x0E40D, и показывает что по этому адресу (вплоть до следующего за ним) располагается такая инструкция:
C++:
Код:
.
text
:
1000E40
D
3
D
63
02
00
00
cmp eax
,
263
h
Числа представлены в порядке little-endian (от большего байта к меньшему), поэтому мы видим что после инструкции cmp (hex: 3D) следует 63 02 (263), если бы число занимало один байт инструкция была бы более понятна:
C++:
Код:
.
text
:
1000E40
D
3
D
02
00
00
00
cmp eax
,
2
ну или в случае с нулём:
C++:
Код:
.
text
:
1000E40
D
3
D
00
00
00
00
cmp eax
,
0
как видишь, 3D всегда остаётся - это инструкция cmp, беря в качестве адреса тот, что показывает тебе IDA (0E40D) - ты берешь адрес, ссылающийся на эту инструкцию, а не на число, которое ты хочешь поменять, поэтому мы и делаем отступ на 1 байт:
для совсем уж наглядности сделаю так:
C++:
Код:
.
text
:
1000E40
D
3
D cmp eax
.
text
:
1000E40
E
63
02
00
00
263
h
|
|
|

16.10.2024, 08:21
|
|
Познающий
Регистрация: 22.12.2018
Сообщений: 72
С нами:
3890632
Репутация:
63
|
|
после того как произвел смену с 611 -> 20000
после чего закинул пару машинок в gta.img и vehicles.ide
при спавне выбивает Warning(opcode 0x247): Exception 0xC0000005 at 0x40890A попытался посмотреть в иде по gta_sa по 0x40890A, но не увидел какой то логики и взаимосвязи с машинами
|
|
|

16.10.2024, 09:37
|
|
Флудер
Регистрация: 19.06.2022
Сообщений: 2,997
С нами:
2055431
Репутация:
3
|
|
Сообщение от nonelike
после того как произвел смену с 611 -> 20000
после чего закинул пару машинок в gta.img и vehicles.ide
при спавне выбивает Warning(opcode 0x247): Exception 0xC0000005 at 0x40890A попытался посмотреть в иде по gta_sa по 0x40890A, но не увидел какой то логики и взаимосвязи с машинами
Ты лимит аджастер настроил?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|