- 2
- 1
Привет! Не буду тянуть кота за хвост и перейду сразу к сути
В samp.dll имеется функция, которая создает клиентские команды (адрес функции — 0x69000). Выглядит функция так:
Соответственно функция принимает название команды и хандлер для обработки этой команды, который принимает введенные игроком параметры и исполняет какой-либо код
Я вызываю эту функцию удаленно через CreateRemoteThread и прочие приблуды, функция вызывается и выполняется, команда создается, с этим никаких проблем нет, но есть проблема с хандлером, который нужно засунуть в качестве второго аргумента функции
Прошерстив интернет я выяснил, что засунуть хандлер в принципе возможно, но как это сделать и возможно ли это вообще в сампе — непонятно
В качестве хандела я пытаюсь засунуть шеллкод:
Затем я выделяю память для этого кода и записываю его в процесс, а также получаю адрес выделенной области, который передаю как хандлер:
Код успешно регистрирует клиентскую команду и при использовании ее в игре краша нет, но и хандлер ничего не выполняет, а служит обычной "заглушкой"
Мне нужно, чтобы хандлер вызывал функцию AddEntry (0x67460) в случае, если игрок не ввел ни одного параметра в команде, и функцию SendCommand (0x69190) (отправляет сразу команду в чат), если пользователь ввел какие-то параметры в команде
Я пробовал вызвать AddEntry следующим образом:
Но игра вызывает краш после ввода команды и попытки выполнить этот код. Хочу также подметить, что в ассемблере я не силен от слова совсем
Из всего вышенаписанного вытекает вопрос: реально ли вообще реализовать вызов функции AddCommand подобным образом и если да, то мне нужен пример того, как это можно правильно сделать с краткими объяснениями (ну или если есть желание, то с подробными, было бы вообще круто)
Все вышепоказанное я делал на C#, но примеры на C++ (если таковые имеются) также приму
Заранее спасибо :)
В 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++ (если таковые имеются) также приму
Заранее спасибо :)