PDA

Просмотр полной версии : [Вопрос] SDK Callbacks Hooks



Batya_Montes
25.08.2019, 19:36
Привет. Нигде не нашел информации по прямому хуку каллбеков сампа из таблицы. Только SAMPGDK и хуки на подобии invoke метода. Решил попытаться сделать сам, но что-то пошло не так. Делал по примеру с хуками нативок.

AMX_NATIVE original_OnPlayerConnect;
cell AMX_NATIVE_CALL hooked_OnPlayerConnect(AMX* amx, cell* params)
{
logprintf(" ON PLAYER CONNECT called!");

// logprintf("%d | %d", params[0], params[1]);


return original_OnPlayerConnect(amx, params);
}

AMX_HEADER* hdr = (AMX_HEADER*)amx->base;
AMX_FUNCSTUB* func;
for (int idx = 0, num = NUMENTRIES(hdr, publics, natives); idx != num; ++idx)
{
func = GETENTRY(hdr, publics, idx);

// logprintf("founded callback = %s", GETENTRYNAME(hdr, func));

if (!strcmp("OnPlayerConnect", GETENTRYNAME(hdr, func)))
{
logprintf("fname = %s | %x | %x", GETENTRYNAME(hdr, func), func, func->address);


original_OnPlayerConnect = (AMX_NATIVE)func->address;


func->address = (ucell)hooked_OnPlayerConnect;
logprintf("hooked onplayerconnect | %x", original_OnPlayerConnect);

}
}

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

Daniel_Cortez
25.08.2019, 20:35
Таблицы нативных и public-функций устроены по разному. Нативные функции можно подменить/перехватить, перезаписав адрес в таблице, в то время как в таблице public-функций записаны не физические, а виртуальные адреса функций в секции кода скрипта, и указывают эти адреса не на нативный код, а на байткод AMX. Чтобы перехватить коллбэк из плагина, нужно сначала сделать перехват в прилагающемся к плагину инклуде, из которого уже и вызывать нативную функцию в плагине.

Batya_Montes
25.08.2019, 22:30
Спасибо за ответ, значит будет старым дедовским методом хукать ;)
Можно закрывать.

Batya_Montes
26.08.2019, 10:24
Хотя постойте, если SAMPGDK предоставляет каллбеки для использования, то он их никак не получит ведь без хуков, а значит есть способ получения физического адреса из виртуального и подмена параметров?

vvw
27.08.2019, 01:35
Хотя постойте, если SAMPGDK предоставляет каллбеки для использования, то он их никак не получит ведь без хуков, а значит есть способ получения физического адреса из виртуального и подмена параметров?

Там используется фейковый amx, через который и вызываются колбеки.

Batya_Montes
27.08.2019, 08:27
Там используется фейковый amx, через который и вызываются колбеки.

Понятно, спасибо, можно закрывать.