//Функция которую хукуем(не пудж).
0A8E: 1@ = 0@ + 0x7A4F0 //void __thiscall CChatWindow__AddToChatWindowBuffer(CChatWindow *this, DWORD eType, char *szString, char *szNick, DWORD dwTextColor, DWORD dwChatColor)
//Создаем хук, его хендл записывается 2@, управление передается в @hook_proc, количество параметров 5 - из функции выше. В 0@ (@hook_proc) передается хендл хука.
0DB6: 2@ = create_hook from_addr 1@ to_label @hook_proc pop_count 5 var_to_set_hook 0
0DB7: plant_hook 2@ //Bomb has been planted
while true
wait 0
end
:hook_proc
0DB9: get_hook 0@ last_param_pntr_to 2@ //2@ Указатель на параметры с которыми вызывется функция в коде, 0@ - хендл хука(выше написано).
//Получаем параметры, из описания функции
//params[-1...-8] - содержат значения регистров, с которыми была вызвана функция, в порядке:
// -1 .. eax, ecx, edx, ebx, esp, ebp, esi, edi .. -8
//значение eax случайно, однако оно нужно для выставления результата функции
//params[0] - указывает на участок памяти, на который вернется управление (можно использовать для выяснения, из какой функции вызвалась данная)
//params[1...] - параметры вызываемой функции
0AB1: call @GetCallParam 2 params_pntr 2@ param_num -2 to 9@ //получаем ecx, т.е. структуру, для которой вызвалась данная функция (с) Могайка \\Тут я сам нихера не понял потому что нужно урок от могайки что передается в каждом регистре
0AB1: call @GetCallParam 2 params_pntr 2@ param_num 1 to 10@ //2@ указатель на параметры, param_num 1 номер параметра 1 - в данном случае DWORD eType, записываем значение параметра в 10@
0AB1: call @GetCallParam 2 params_pntr 2@ param_num 2 to 11@ //А тут параметр текст, точнее указатель на память в которой текст
0AB1: call @GetCallParam 2 params_pntr 2@ param_num 3 to 12@
0AB1: call @GetCallParam 2 params_pntr 2@ param_num 4 to 13@
0AB1: call @GetCallParam 2 params_pntr 2@ param_num 5 to 14@
0ACD: show_text_highpriority 11@ time 3000 //Тут выводится текст 11@ char *szString
0DB8: unplant_hook 0@ //Убираем хук чтоб он бесконечно не срабатывал, тк потом мы вызываем опять этот метод?
0AA6: call_method 1@ struct 9@ num_params 5 pop 0 params 14@ 13@ 12@ 11@ 10@ //вызываем 1@ = 0@ + 0x7A4F0 //void __thiscall CChatWindow__AddToChatWindowBuffer
//И тут я нихуя не понял, получается мы просто повторяем вызов, а не меняем параметры в предыдущем?
//Получается управление потом не переходит в оригинальную функцию? Мы просто заменяем вызов той функции на вызов своей, а не параметры?
0DB7: plant_hook 0@
0D98: callback_retn
:GetCallParam //0AB1: call @GetCallParam 2 params_pntr 1@ param_num 2 to 3@ //Тут рассчитывается ивозвращается нужный параметр
0012: 1@ *= 4
005A: 0@ += 1@
0A8D: 2@ = read_memory 0@ size 4 virtual_protect 1
0AB2: ret 1 2@