1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

Последнее сообщение от int 3

  1. int 3
  2. int 3
  3. int 3
  4. int 3
    Сообщение

    loko9988 R.I.P.

    Жаль Серёгу. Земля пухом
    Сообщение от: int 3, 20 апр 2022 в разделе: Общее
  5. int 3
  6. int 3
  7. int 3
  8. int 3
  9. int 3
    название темы надо бы расписать немного, а то такое не понятное Дополнил так еще вопрос, как с ней работать с сервисом glinkd , ведь там нет дебаг инфы, можно пример? Библиотека не избавляет от необходимости уметь реверсить. Чтобы её использовать, необходимо знать адрес и сигнатуру функции, которая хукается. С отладочной информацией всё просто — нашли функцию по имени, взяли адрес и сигнатуру, вытащили для удобства все типы и начали писать код. Если отладочной информации нет, то найти функцию — это лишь верхушка айсберга. Даже когда функция найдена, сигнатура восстановлена (хотя бы частично, с точностью до "эквивалентных" типов) и хук активирован, ты всё ещё не знаешь, что значат её аргументы. Так что хукать нужно в тот момент, когда ты понимаешь, что и зачем ты делаешь. Впрочем, можно хукать и случайные функции, логгировать их аргументы и таким образом анализировать поведение — это удобно.
    Сообщение от: int 3, 13 ноя 2020 в разделе: C/C++
  10. int 3
    rcmp — библиотека для хуков и работы с памятью Создана с целью упростить жизнь C++ разработчика, который пишет читы/библиотеки/моды/плагины. Для её использования нужно: Знать современный C++ и уметь на нём писать (хеллоу-ворлды и код на "C с классами" не считаются) Иметь опыт написания библиотек, которые внедряются в чужой процесс (через инжект, LD_PRELOAD или какую-либо другую технику) Причины создания библиотеки при наличии множества альтернатив подробно описаны в README. Если кратко — перемешивание ассемблера и C++ чревато багами, ухудшает качество кодовой базы и распыляет внимание разработчика, в то время как библиотека избавляет от низкоуровневой каши. Благодаря rcmp, за последние несколько лет я не написал ни строчки на ассемблере, что не может не радовать. На этом вступление окончено, перейдём к практике. Подключение к проекту Предполагая, что CMake проект вашей библиотеки my-cool-library уже создан и rcmp лежит в external/rcmp: add_subdirectory(external/rcmp) target_link_libraries(my-cool-library PRIVATE rcmp) Примеры использования Так как единственная полуживая игра на этом форуме - это PW, то и примеры будут по ней. В примерах используется ядро версии 1.5.5. С тем же успехом можно работать с любым другим сервисом или клиентской частью. Сами примеры немного надуманы, потому что серьезные вещи не реализуются в несколько строк кода, но суть уловить можно. Баг "d 174" заключается в том, что игрок отправляет на сервер пакет 174 с пустым телом, из-за чего ядро благополучно падает. Фикс элементарный: находим в ядре функцию DispatchCommand класса gplayer_imp. Её адрес - 0x0809472A Сигнатура - int(gplayer_imp*, int, const void*, size_t). Эта функция отвечает за приём клиентских пакетов. Пишем код для её перехвата: struct gplayer_imp; // forward declaration // Для хука необходимо указать адрес оригинальной функции, её сигнатуру и передать сам "хук" // Хук — это лямбда, которая имеет на один аргумент больше, чем оригинальная функция // Первый аргумент лямбды — `auto original` — указатель на оригинальную функцию rcmp::hook_function<0x0809472A, int(gplayer_imp*, int, const void*, size_t)>([](auto original, gplayer_imp* self, int cmd_type, const void* buf, size_t size) { // детектируем кривой пакет if (cmd_type == 174 && size < 6) { // можно просто залоггировать или даже забанить игрока за такую наглость // псевдокод логгирования: // logger().trace("Hacker alert! Player ID = {}", self->_parent->ID.id); // оригинальную функцию не вызываем, просто выходим return 0; } // можно также логгировать вообще все пакеты от игрока, почему бы и нет? (псевдокод) // logger().trace("id={}, packet={}, len={}", self->_parent->ID.id, cmd_type, size); // пакет валидный, вызываем оригинальную функцию return original(self, cmd_type, buf, size); }); Возьмём произвольный скилл и поменяем его время перезарядки. Сделаем его случайным. // Выбор пал на скилл с ID = 111 // Функция: GNET::Skill111Stub::GetCoolingtime // Адрес: 0x0897F4E6 // Сигнатура: int __cdecl GNET::Skill111Stub::GetCoolingtime(const GNET::Skill111Stub *const this, GNET::Skill *skill) // в сигнатурах можно заменить все указатели на указатели на void, если лень объявлять типы rcmp::hook_function<0x0897F4E6, int(const void*, void*)>([](auto...) { return rand() % 5000; // от нуля до пяти секунд }); // Функция: item::Use // Адрес: 0x080F6DA4 // Сигнатура: int __cdecl item::Use(item *const this, item::LOCATION l, int index, gactive_imp *obj, size_t count) // Пример продвинутый, но неполный, т.к. предполагается наличие объявленных ранее классов rcmp::hook_function<0x080F6DA4, int(item*, item::LOCATION, int, gactive_imp*, size_t)>([](auto original, item* self, item::LOCATION loc, int index, gactive_imp* obj, size_t count) { item_body* body = self->body; // предмета нет в ячейке, нечего использовать if (body == nullptr) return 0; // прописываем логику для "своих" предметов // предмет с id = 1000 будет телепортировать игрока в рандомную точку на высоте 50 if (body->_tid == 1000) { static_cast<gplayer_imp*>(obj)->LongJump(A3DVECTOR(rand() % 1000 - 500, 50, rand() % 1000 - 500)); return 1; // возвращаемое значение - сколько предметов было потрачено } // предмет с id = 2000 будет писать в 10-й канал чата от имени игрока, где он находится else if (body->_tid == 2000) { const A3DVECTOR& pos = obj->_parent->pos; char message[100]; std::sprintf(message, "I'm at: %f, %f, %f", pos.x, pos.y, pos.z); static_cast<gplayer_imp*>(obj)->Say(message, 10); return 0; // предмет не тратится при использовании, почему бы и нет? } // на этом моя фантазия кончилась, поэтому для остальных предметов никаких кастомных эффектов не будет return original(self, loc, index, obj, count); }); Из примеров видно, что можно перехватывать вообще любые функции, прописывать произвольную свою логику вместо оригинальной или в дополнение к ней. Всё ограничивается лишь фантазией разработчика. Напишите в комментариях, каких примеров не хватает — допишу. Ссылка на библиотеку: [IMG] Требования: C++17, Windows/Linux, x86/x86-64. P.S. "Боевой" пример использования библиотеки — Replay Mod для ныне популярной игры Among Us
    Автор темы: int 3, 13 ноя 2020, ответов - 8, в разделе: C/C++
  11. int 3
  12. int 3
  13. int 3
  14. int 3