1. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.691
    Симпатии:
    796
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Первоисточник - Dedicated-Server.ru
    RePatcher
    Модуль писался специально для ReHLDS на замену Orpheu, okapi и т.п. Но работает также с HLDS и любыми другими библиотеками. Пока что это бета, так как модуль тестировался только программными тестами, покрывающими не все

    Функции и преимущества перед аллиедмодовскими:
    1. Работает с любыми библиотеками, загруженными в память процесса сервера
    2. Поддерживает символы как для windows, так и для linux
    3. Перехватывает любые fastcall/usercall функции
    4. Всего один общий конфиг. Все сигнатуры и поиски пишутся напрямую в исходники плагинов
    5. Код для всех хуков генерируется JIT'ом сразу после их добавления, что обеспечивает максимальную производительность
    6. Поддерживаются все основные опции, такие как замена аргументов, возвращаемого значения, блокировка вызова оригинальной функции и/или всех последующих хуков. В общем, как у фейкметы, только для любых функций какие зададите

    Если разберетесь как использовать и попробуете, будет здорово. Если нет, описание как чего напишу когда будет возможность. Поддержка на русском здесь, на английском чуть позже размещу на аленях. В остальном размещайте и обсуждайте где хотите, кроме кснета. Но пока бета лучше все здесь
    1. Поиск нужной библиотеки. Сначала нужно получить handle библиотеки, с которой собираетесь работать. Для этого вызовите функцию rp_get_library с параметром name равным названию файла библиотеки. Для движка можно указать просто "engine", а для мода "mod" или "gamedll"
    2. Поиск нужной функции. Проще всего найти экспортированные функции (rp_get_exported), либо те, для которых доступны символы (rp_get_symbol). В большинстве linux библиотек символы встроены по умолчанию, для windows символы берутся из файлов pdb. Поиск символов поддерживает как высокоуровневые названия, включающие в себя области видимости, так и декорированные. Если символа для нужной функции нет, можно найти её по сигнатуре памяти. Формат идентичен используемому в IDA, вида "55 8B EC 83 C4 ? E8 ? ? ? ? 51"
    3. Создание хука. Для создания хука используется rp_add_hook. Параметры:
    1. Адрес функции
    2. Заголовок функции. По нему модуль определяет, какие аргументы и как нужно передать в форвард, а также тип возвращаемого значения. Проще всего взять это описание из псевдокода в IDA. Пример: "signed int __usercall SV_PlayerRunThink@<eax>(int a1@<eax>, int a2, float a3, double a4)"
    3. Название public функции, которая будет вызываться хуком. true если хук должен вызывать до основной функции, иначе false
    4. Флаги хука. Подробнее ниже

    Система типов:
    Настройка типов производится в секции [types] конфига repatcher.ini. Каждое новое название типа пишется с новой строки, а справа от него через символ равно указывается базовый тип, которому он соответствует. Например, "bool = char". Имена не чувствительны к регистру. Символ ? в конце названия означает, что указано лишь начало, а окончание может быть произвольным. Repatcher поддерживает 13 базовых типов данных:
    [​IMG]
    Базовые типы не используются напрямую и не могут быть отредактированы. Вы обязательно должны добавить в конфиг пользовательские типы им соответствующие.
    Правила преобразований типов для передачи в плагины по приоритету:
    1. Если название аргумента содержит [n], то он трактуется как массив из n элементов. Элементы массивов никогда не конвертируются, они передаются как есть в указанном количестве. Учитывается только их размер
    2. Если тип аргумента/функции содержит *, то он трактуется как указатель. При наличии базового типа-указателя с соответствующим названием, производится конвертация значения в индекс/amxx-строку. Иначе значение указателя передается как обычное число. Если не хотите, чтобы указатель конвертировался, можно указать вместо него просто int, чтобы получить числовое значение адреса
    3. Среди базовых типов ищется тип с соответствующим названием. При нахождении производится ограничение значения согласно лимиту типа. Если типа с соответствующим названием не найдено, происходит ошибка
    [​IMG]

    Заголовки функций:
    Заголовок функции описывает её тип и аргументы. Пример: "int Host_Frame(float time, int iState, int *stateInfo)". Сколько аргументов укажете в заголовке, столько будет передано в плагин. При этом, к ним применяются правила преобразований типов из предыдущего раздела. Для __fastcall и __usercall функций также необходимо указать, в каких регистрах передаются аргументы. Это делается в том же формате, какой выводит IDA в псевдокоде. Пример:
    [​IMG]
    Выданный IDA заголовок можно сразу использовать, если вас устраивают автоматически определенные типы. Repatcher всегда определяет регистр возврата из типа функции, поэтому в заголовке его можно не указывать. В качестве регистров аргументов можно указать любой регистр общего назначения, st0 или один из xmm регистров. Регистры st1-st7, а также другие mm регистры не поддерживаются за ненадобностью. Ниже представлена таблица совместимости типов и регистров:
    [​IMG]
    Возможна ситуация, что IDA отображает больше аргументов, чем их есть на самом деле
    IDA: [​IMG]
    Исходник: [​IMG]
    Особенно это распространено в случае компилятора ICC. Для части функций он генерирует сразу 2 места вызова: обычный через стек (вверху) и fastcall, где первые аргументы передаются через регистры, а остальные через стек (внизу)
    [​IMG]
    Перехватывается всегда нижний вариант, так как он выполняется в обоих случаях. В нем аргументы передающиеся двумя способами дублируются. Самый простой вариант определить аргументы нижней функции это декомпилировать верхнюю и посмотреть, в каком порядке её аргументы передаются в нижнюю. Заголовок верхней функции должен быть идентичен тому, что в исходнике и обычно может быть просто скопирован. Если IDA жалуется на неизвестный тип, замените его на int или void*
    [​IMG]
    Запишем финальный заголовок нижней функции:
    [​IMG]
    Из дублирующихся аргументов нужно использовать тот, что объявлен раньше. На месте второго в большинстве случаев будет мусор. Стоит отметить, что был рассмотрен один из сложных случаев, который встречается не часто. Для большинства функций заголовок составляется проще

    Возможности форвардов:
    1. Управление вызовом оригинальной функции и других хуков. Делается путем возврата из форварда одного из 3 значений:
      RP_CONTINUE - продолжить вызывать хуки и оригинал
      RP_SUPERCEDE - прервать выполнение всех хуков и не вызывать оригинал
      RP_SUPERCEDE_MAIN - вызвать остальные хуки, но заблокировать оригинальную функцию
      Если функция не void, перед блокировкой её вызова необходимо установить свое возвращаемое значение
    2. Установка возвращаемого значения. Выполняется нативом rp_set_return с одним аргументом. Конвертация типов делается автоматически, если она требуется. Если этот натив вызывает несколько хуков, используется значение последнего. Также есть вариант rp_set_raw_return, который не делает конвертаций. Он может быть использован, чтобы установить NULL для указателя
    3. Получение возвращаемого значения. Делается нативом rp_get_return. Может быть вызвано в том числе и в pre хуке, но только если значение уже было установлено. Если нет, то только в post. Если значение было заменено, из post функции можно получить оригинальный возврат через rp_get_original_return
     

    Вложения:

    Последнее редактирование: 26.12.15
    Мясо, Spawner10, Fenix и 3 другим нравится это.
  2. VkriterT VIP user

    Регистрация:
    02.06.15
    Сообщения:
    428
    Симпатии:
    125
    Пол:
    Мужской
    Класно что рехлдс не забросили но зачем патчить то что можно отредактировать ? )
     
  3. Kaspera55 Guest

    VkriterT, пихать все в билд не очень то хорошо .
     
  4. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.691
    Симпатии:
    796
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Вы оба несете хрень. Этот метамод-плагин расширяет возможности для скриптеров, позволяя использовать функции движка, что соответственно дает возможность писать новые плагины
     
    Bloo нравится это.
  5. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.594
    Симпатии:
    4.169
    Пол:
    Мужской
    Phantom, это amxx модуль :D
    префикс _amxx_ как бэ намекает;)
     
  6. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.691
    Симпатии:
    796
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Фак, че то я автоматом написал метамод хД
     
  7. Ruslan18 Пользователь

    Регистрация:
    25.06.15
    Сообщения:
    28
    Симпатии:
    4
    А плагины маздана как?)МОжно убирать орфей и окапи?)
     
  8. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.691
    Симпатии:
    796
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Придется переписывать под RePatcher
     
  9. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.594
    Симпатии:
    4.169
    Пол:
    Мужской
    Phantom, а я.. уже запилил :D
     
  10. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.691
    Симпатии:
    796
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Ты уже написал? :D
    --- добавлено 15.07.15 ---
    Шустрый
     
  11. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.594
    Симпатии:
    4.169
    Пол:
    Мужской
    Phantom, че там пилить?
    Слишком все очевидно =)
    Под линуху правда. под винду лень сигнатуры искать :D
     
  12. kennybear Пользователь

    Регистрация:
    02.03.15
    Сообщения:
    215
    Симпатии:
    45
    Пол:
    Мужской
    neygomon, для античитов замутил?))
     
  13. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.691
    Симпатии:
    796
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    Да детектор он решил свой написать на этом репатчере
    --- добавлено 15.07.15 ---
    neygomon, ты его на сервер поставил?
     
    Последнее редактирование: 27.01.16
  14. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.594
    Симпатии:
    4.169
    Пол:
    Мужской
    Phantom, мне тестить лень :D
     
  15. ilnar Пользователь

    Регистрация:
    28.06.15
    Сообщения:
    47
    Симпатии:
    5
    Пол:
    Мужской
    давай на моем протестим
     
  16. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.594
    Симпатии:
    4.169
    Пол:
    Мужской
    ilnar, не актуально уже
     
    Астан нравится это.
  17. qpi3ik VIP user

    Регистрация:
    27.02.15
    Сообщения:
    325
    Симпатии:
    67
    Пол:
    Мужской
    VKcom:
    qpi3ik
    Skype:
    chilintanno1
    Данная тема актуальна?
    На последнем билде 638 не запустился.
     
  18. Phantom Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.691
    Симпатии:
    796
    Пол:
    Мужской
    Telegram:
    ph4nt0m
    qpi3ik, не актуально пока
     
  19. FakePlayer Пользователь

    Регистрация:
    10.08.15
    Сообщения:
    90
    Симпатии:
    34
    Пол:
    Мужской
    Не нужно ничего писать для бан-системы он не нужен вовсе.
     
  20. FakePlayer Пользователь

    Регистрация:
    10.08.15
    Сообщения:
    90
    Симпатии:
    34
    Пол:
    Мужской
    Скорее всего ты путаешь это с речекером. Тебе сюда ReHLDS - ReChecker (проверка файлов игрока)
     
    vesuvius нравится это.