Как Detours по lua ходил, да что из этого вышло

22 Май
2012

Не так давно для интереса занялся разработкой dll’ки для хука функций одной забавной ММО — Runes of Magic, с неплохим lua-движком для разрабокти аддонов. Довольно долго я искал методы хука ф-ий клиента игры из инжектированной dll (опыта пока маловато будет-с), пока не нашел упоминание о Microsoft Detours в 1 из Блоговских статей, за что, кстати, автору персональное спасибо!

Тут, понятно, дело пошло как-то повеселее и вскоре я наслаждался первой хукнутой функцией. Вот тут-то и случился первый затык — появились thiscall — приблуды. Впрочем, пару часов — и решение найдено: www.2gather.in/?cat=17 («о опыт, сын ошибок трудный» (С)).
Радость, пафос и ликование — оно заработало! Все великолепно, все отлично, стабильно получаю нужный мне результат, все ок.
Через пару дней решил вернуться к коду и написать еще что-нибудь полезное. Выбор пал на хук lua ф-ии SendChatMessage — ага, самой банальной отправки сообщения.
И тут начался ступор — сколько я не искал что-нибудь по данной теме, так и не нашел. Печалька. Что поделать — пришлось немного поломать голову, покурить мануалы и написать — таки небольшой код для хука lua ф-ий при помощи творения MS Research на С++.
Сей код и небольшое описание выкладываю здесь. Надеюсь, кому-нибудь пригодится.

1) Ищем адрес ф-ии в клиенте. Это делается либо при помощи IDA Pro, либо при помощи милой Оленьки — Olly Dbg.
В принципе, от поиска любых других ф-ий поиск адреса lua ф-ии как-то не шибко отличается, при желании можно спокойно найти.
Предположим, что адрес SendChatMessage==0x791200. Что дальше?
А дальше-второй пункт!

2) Объявляем 2 ф-ии — оригинал и хук.

//Кодэ
typedef int (__cdecl *SendChat)(lua_State *L);
SendChat chat_Detour=(SendChat)0x791200;
int __cdecl chat_hook(lua_State *L);
//Кодэ кончается


3) Смотрим в игре-а сколько же параметров имеет ф-ия? Скажем, пусть их будет 2 — содержимое сообщения и тип чата(область/ПМ/мир)

4) Собственно, сам хук:
int __cdecl chat_hook(lua_State *L)
{
const char *arg1 = NULL;
size_t arg2Len = 0;
const char *arg2 = NULL;
size_t arg2Len2 = 0;

arg1 = luaL_checklstring(L, 1, &arg2Len);
arg2 = luaL_checklstring(L, 2, &arg2Len2);

FILE* pSendLogFile;
fopen_s(&pSendLogFile, "C:\\chat_hook.txt", "a");
fprintf(pSendLogFile,"%s,%s \n",arg1,arg2);
fclose(pSendLogFile);

return chat_Detour(L);
}


В принципе, это весь код, не считая DetourAttach(&(PVOID&)chat_Detour, chat_hook); в DllMain — но это уже ничем не отличается от обычного использования Detours.

Спасибо за внимание!
Adios y bueno suerte mi amigo!
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх