![]() |
Привет! Не буду тянуть кота за хвост и перейду сразу к сути
В samp.dll имеется функция, которая создает клиентские команды (адрес функции — 0x69000). Выглядит функция так: AddCommand: Код:
voidСоответственно функция принимает название команды и хандлер для обработки этой команды, который принимает введенные игроком параметры и исполняет какой-либо код Я вызываю эту функцию удаленно через CreateRemoteThread и прочие приблуды, функция вызывается и выполняется, команда создается, с этим никаких проблем нет, но есть проблема с хандлером, который нужно засунуть в качестве второго аргумента функции Прошерстив интернет я выяснил, что засунуть хандлер в принципе возможно, но как это сделать и возможно ли это вообще в сампе — непонятно В качестве хандела я пытаюсь засунуть шеллкод: shellcode: Код:
byteЗатем я выделяю память для этого кода и записываю его в процесс, а также получаю адрес выделенной области, который передаю как хандлер: Запись в процесс: Код:
memoryAddressКод успешно регистрирует клиентскую команду и при использовании ее в игре краша нет, но и хандлер ничего не выполняет, а служит обычной "заглушкой" Мне нужно, чтобы хандлер вызывал функцию AddEntry (0x67460) в случае, если игрок не ввел ни одного параметра в команде, и функцию SendCommand (0x69190) (отправляет сразу команду в чат), если пользователь ввел какие-то параметры в команде Функция AddEntry: Код:
voidЯ пробовал вызвать AddEntry следующим образом: C#: Код:
byteНо игра вызывает краш после ввода команды и попытки выполнить этот код. Хочу также подметить, что в ассемблере я не силен от слова совсем Из всего вышенаписанного вытекает вопрос: реально ли вообще реализовать вызов функции AddCommand подобным образом и если да, то мне нужен пример того, как это можно правильно сделать с краткими объяснениями (ну или если есть желание, то с подробными, было бы вообще круто) Все вышепоказанное я делал на C#, но примеры на C++ (если таковые имеются) также приму Заранее спасибо :) |
на счёт C# не знаю вообще, но на C++ ты просто буквально передаешь функцию:
C++: Код:
voidЯ бы советовал поискать в интернете, возможно ли передать C#-пную функцию как аргумент C-шной (100% функция должна быть статической) И еще, не балуйся с потоками, так как самп не thread-safe |
Цитата:
|
Да, привет!
Ты всё понял верно, шаги у тебя правильные. На самом деле, нужно понять на каком моменте что-то ломается. Цитата:
Цитата:
C++: Код:
voidИ никто не мешает тебе в отдельной программе (не основной!) написать на C++ ту функцию, которая тебе нужна: C++: Код:
// создаёшь прототипы своих функций (я не знаю какие аргументы там)А дальше компилируешь это всё дело в x32. Можешь в коде где-то в Код:
main()[CODE] std::cout Only Bytes») и вставить в массив. Всю неприятную работу по созданию ASM кода выполнит компилятор. Если изначальные прототипы функций (не только твоей, но и тех, что ты вызываешь внутри) верны, то краша быть не должно. Цитата:
Чтобы получить адрес модуля Код:
samp.dllC++: Код:
DWORDИспользование: Код:
HMODULE SampDllБудут еще вопросы — пиши. |
Огромное спасибо за помощь, подсказка с плюсами и CE мне очень помогла, правда, я сделал немого иначе — написал хандлер с asm кодом для вызова определенных функций, скомпилировал все в dll, инжектнул в игру и получил тело всей функции уже в виде шеллкода, ну и соответственно на шарпе я выполнил все те действия, которые описывал выше, в конечном итоге это сработало
Еще раз огромное спасибо |
| Время: 16:14 |