HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 14.10.2024, 01:31
nonelike
Познающий
Регистрация: 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 ставит в ступор
 
Ответить с цитированием

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

Репутация: 163


По умолчанию

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

C++:





Код:
*
reinterpret_cast

(
this_ptr
)
=
15
;


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

  #3  
Старый 14.10.2024, 13:04
nonelike
Познающий
Регистрация: 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;
 
Ответить с цитированием

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


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

  #5  
Старый 14.10.2024, 23:50
nonelike
Познающий
Регистрация: 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 но дальше краша не ушел
 
Ответить с цитированием

  #6  
Старый 15.10.2024, 00:33
moreveal
Постоянный
Регистрация: 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, но это особо роли не сыграет
 
Ответить с цитированием

  #7  
Старый 15.10.2024, 00:34
nonelike
Познающий
Регистрация: 22.12.2018
Сообщений: 72
С нами: 3890632

Репутация: 63
По умолчанию

Цитата:
Сообщение от moreveal  

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

  #8  
Старый 15.10.2024, 01:07
moreveal
Постоянный
Регистрация: 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
 
Ответить с цитированием

  #9  
Старый 16.10.2024, 08:21
nonelike
Познающий
Регистрация: 22.12.2018
Сообщений: 72
С нами: 3890632

Репутация: 63
По умолчанию

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

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

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

  #10  
Старый 16.10.2024, 09:37
вайега52
Флудер
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.