ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   не понимаю как хукнуть (https://forum.antichat.xyz/showthread.php?t=1522483)

nonelike 14.10.2024 01:31

https://forum.antichat.xyz/attachments/28548946/

Код:





Код:

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 ставит в ступор

moreveal 14.10.2024 02:01

Открой список структур в IDA и посмотри из чего состоит CChat; обращение по указателю - это фактически разыменовывание адреса по смещению от начала структуры до нужного элемента, m_nPageSize является первым элементом структуры, поэтому тебе повезло - просто представь адрес this в виде 32-битного числа (тип dd в IDA) и поменяй его на нужное

C++:





Код:

*
reinterpret_cast

(
this_ptr
)
=
15
;



Но в твоем случае нужно, разумеется, патчить функцию, а не ставить хук, чтобы получить адрес на this, поскольку если ты сперва изменишь его, а потом вызовешь оригинал - оно ресетнется в 10

nonelike 14.10.2024 13:04

Цитата:

Сообщение от 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;


moreveal 14.10.2024 13:32

Цитата:

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



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

nonelike 14.10.2024 23:50

плюсы:





Код:

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
)
;



попытался захавать твою инфу с объяснением, попытался че то сделать с
https://forum.antichat.xyz/attachments/28549305/
чтобы поменять 611 -> 20000 но дальше краша не ушел

moreveal 15.10.2024 00:33

Цитата:

Сообщение от 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, но это особо роли не сыграет

nonelike 15.10.2024 00:34

Цитата:

Сообщение от moreveal

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

объясни про эти байты еще раз пж, я еще в прошлом топике не все понял, это пи дец какой-то, а то я не вдупляю че как и в дальнейшем сто по сто снова ниче не сделаю и откуда вообще взял 1 байт

moreveal 15.10.2024 01:07

Цитата:

Сообщение от 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


nonelike 16.10.2024 08:21

после того как произвел смену с 611 -> 20000

после чего закинул пару машинок в gta.img и vehicles.ide

при спавне выбивает Warning(opcode 0x247): Exception 0xC0000005 at 0x40890A попытался посмотреть в иде по gta_sa по 0x40890A, но не увидел какой то логики и взаимосвязи с машинами

вайега52 16.10.2024 09:37

Цитата:

Сообщение от nonelike

после того как произвел смену с 611 -> 20000
после чего закинул пару машинок в gta.img и vehicles.ide
при спавне выбивает Warning(opcode 0x247): Exception 0xC0000005 at 0x40890A попытался посмотреть в иде по gta_sa по 0x40890A, но не увидел какой то логики и взаимосвязи с машинами

Ты лимит аджастер настроил?


Время: 01:16