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);
}
}
Но что-то работает не по плану, сервер крашится при попытке подключиться. Функция на которую подменяется оригинальный вызов - не вызывается, а значит - проблема в сохранении оригинального адреса и замене на другой. Возможно проблема с оффсетами, надеюсь на помощь. Благодарю.
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);
}
}
Но что-то работает не по плану, сервер крашится при попытке подключиться. Функция на которую подменяется оригинальный вызов - не вызывается, а значит - проблема в сохранении оригинального адреса и замене на другой. Возможно проблема с оффсетами, надеюсь на помощь. Благодарю.