Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Batya_Montes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    163
    Репутация:
    13 ±

    SDK Callbacks Hooks

    Привет. Нигде не нашел информации по прямому хуку каллбеков сампа из таблицы. Только SAMPGDK и хуки на подобии invoke метода. Решил попытаться сделать сам, но что-то пошло не так. Делал по примеру с хуками нативок.
    1. AMX_NATIVE original_OnPlayerConnect;
    2. cell AMX_NATIVE_CALL hooked_OnPlayerConnect(AMX* amx, cell* params)
    3. {
    4. logprintf(" ON PLAYER CONNECT called!");
    5.  
    6. // logprintf("%d | %d", params[0], params[1]);
    7.  
    8.  
    9. return original_OnPlayerConnect(amx, params);
    10. }
    11.  
    12. AMX_HEADER* hdr = (AMX_HEADER*)amx->base;
    13. AMX_FUNCSTUB* func;
    14. for (int idx = 0, num = NUMENTRIES(hdr, publics, natives); idx != num; ++idx)
    15. {
    16. func = GETENTRY(hdr, publics, idx);
    17.  
    18. // logprintf("founded callback = %s", GETENTRYNAME(hdr, func));
    19.  
    20. if (!strcmp("OnPlayerConnect", GETENTRYNAME(hdr, func)))
    21. {
    22. logprintf("fname = %s | %x | %x", GETENTRYNAME(hdr, func), func, func->address);
    23.  
    24.  
    25. original_OnPlayerConnect = (AMX_NATIVE)func->address;
    26.  
    27.  
    28. func->address = (ucell)hooked_OnPlayerConnect;
    29. logprintf("hooked onplayerconnect | %x", original_OnPlayerConnect);
    30.  
    31. }
    32. }

    Но что-то работает не по плану, сервер крашится при попытке подключиться. Функция на которую подменяется оригинальный вызов - не вызывается, а значит - проблема в сохранении оригинального адреса и замене на другой. Возможно проблема с оффсетами, надеюсь на помощь. Благодарю.
    0x

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Таблицы нативных и public-функций устроены по разному. Нативные функции можно подменить/перехватить, перезаписав адрес в таблице, в то время как в таблице public-функций записаны не физические, а виртуальные адреса функций в секции кода скрипта, и указывают эти адреса не на нативный код, а на байткод AMX. Чтобы перехватить коллбэк из плагина, нужно сначала сделать перехват в прилагающемся к плагину инклуде, из которого уже и вызывать нативную функцию в плагине.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для Batya_Montes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    163
    Репутация:
    13 ±
    Спасибо за ответ, значит будет старым дедовским методом хукать ;)
    Можно закрывать.
    0x

  4. #4
    Аватар для Batya_Montes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    163
    Репутация:
    13 ±
    Хотя постойте, если SAMPGDK предоставляет каллбеки для использования, то он их никак не получит ведь без хуков, а значит есть способ получения физического адреса из виртуального и подмена параметров?
    0x

  5. #5
    Аватар для vvw
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    45
    Репутация:
    9 ±
    Цитата Сообщение от Batya_Montes Посмотреть сообщение
    Хотя постойте, если SAMPGDK предоставляет каллбеки для использования, то он их никак не получит ведь без хуков, а значит есть способ получения физического адреса из виртуального и подмена параметров?
    Там используется фейковый amx, через который и вызываются колбеки.

  6. Пользователь сказал cпасибо:
    oukibt (23.05.2021)
  7. #6
    Аватар для Batya_Montes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.02.2017
    Адрес
    0x
    Сообщений
    163
    Репутация:
    13 ±
    Цитата Сообщение от vvw Посмотреть сообщение
    Там используется фейковый amx, через который и вызываются колбеки.
    Понятно, спасибо, можно закрывать.
    0x

 

 

Информация о теме

Пользователи, просматривающие эту тему

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

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •