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

  #1  
Старый 07.03.2024, 00:07
UnknownPerson
Новичок
Регистрация: 06.03.2024
Сообщений: 2
С нами: 1153155

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

Привет! Не буду тянуть кота за хвост и перейду сразу к сути

В samp.dll имеется функция, которая создает клиентские команды (адрес функции — 0x69000). Выглядит функция так:

AddCommand:





Код:
void
__thiscall CInput
::
AddCommand
(
CInput
*
this
,
const
char
*
szName
,
void
(
__cdecl
*
handler
)
(
const
char
*
)
)


Соответственно функция принимает название команды и хандлер для обработки этой команды, который принимает введенные игроком параметры и исполняет какой-либо код

Я вызываю эту функцию удаленно через CreateRemoteThread и прочие приблуды, функция вызывается и выполняется, команда создается, с этим никаких проблем нет, но есть проблема с хандлером, который нужно засунуть в качестве второго аргумента функции

Прошерстив интернет я выяснил, что засунуть хандлер в принципе возможно, но как это сделать и возможно ли это вообще в сампе — непонятно

В качестве хандела я пытаюсь засунуть шеллкод:

shellcode:





Код:
byte
[
]
asmBytes
=
new
byte
[
]
{
0x55
,
// push ebp
0x89
,
0xE5
,
// mov ebp, esp
0x89
,
0xEC
,
// mov esp, ebp
0x5D
,
// pop ebp
0xC3
// ret
}
;


Затем я выделяю память для этого кода и записываю его в процесс, а также получаю адрес выделенной области, который передаю как хандлер:

Запись в процесс:





Код:
memoryAddress
=
VirtualAllocEx
(
handle
,
IntPtr
.
Zero
,
asmBytes
.
Length
,
0x1000
,
0x40
)
;
WriteMemoryBytes
(
memoryAddress
,
asmBytes
)
;


Код успешно регистрирует клиентскую команду и при использовании ее в игре краша нет, но и хандлер ничего не выполняет, а служит обычной "заглушкой"

Мне нужно, чтобы хандлер вызывал функцию AddEntry (0x67460) в случае, если игрок не ввел ни одного параметра в команде, и функцию SendCommand (0x69190) (отправляет сразу команду в чат), если пользователь ввел какие-то параметры в команде

Функция AddEntry:





Код:
void
__thiscall CInput
::
AddCommand
(
CInput
*
this
,
const
char
*
szName
,
void
(
__cdecl
*
handler
)
(
const
char
*
)
)


Я пробовал вызвать AddEntry следующим образом:

C#:





Код:
byte
[
]
asmBytes
=
new
byte
[
]
{
0x55
,
// push ebp
0x89
,
0xE5
,
// mov ebp, esp
0x89
,
0xEC
,
// mov esp, ebp
0x68
,
0x00
,
0x00
,
0x00
,
0x00
,
// push CChatAddress (сюда вписывается samp.dll + 0x26E8C8)
0x6A
,
0x08
,
// push 0x8
0x68
,
0x74
,
0x65
,
0x78
,
0x74
,
// push "text"
0x68
,
0x00
,
0x00
,
0x00
,
0x00
,
// push 0x0 (empty string for szPrefix)
0x68
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
// push 0xFFFFFF (textColor)
0x68
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
// push 0xFFFFFF (prefixColor)
0xB9
,
0x00
,
0x00
,
0x00
,
0x00
,
// mov ecx, AddEntryFunctionAddress (сюда вписывается samp.dll + 0x67460)
0xFF
,
0xD1
,
// call ecx
0x5D
,
// pop ebp
0xC3
// ret
}
;


Но игра вызывает краш после ввода команды и попытки выполнить этот код. Хочу также подметить, что в ассемблере я не силен от слова совсем

Из всего вышенаписанного вытекает вопрос: реально ли вообще реализовать вызов функции AddCommand подобным образом и если да, то мне нужен пример того, как это можно правильно сделать с краткими объяснениями (ну или если есть желание, то с подробными, было бы вообще круто)

Все вышепоказанное я делал на C#, но примеры на C++ (если таковые имеются) также приму

Заранее спасибо
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT ™ © 2001- Antichat Kft.