[AHK] Хук на вывод сообщений сервера в чат

index

Известный
Автор темы
125
82
Хочу поставить хук на вывод сообщений сервера в чат для их фильтрации в дальнейшем.
При добавлении сообщения вызывается функа по адресу 0x67BE0 (для samp 0.3dl), назовем ее ADDTOCHATWND_1 (они рядом расположены, addtochatwnd на 0x80 раньше идёт). Она принимает 2 параметра:
1 - (скорее всего) указатель на stChatInfo (не суть)
2 - указатель на строку, которую нужно вывести
Код хука следующий:
AutoHotKey:
#include AHK-HOOK-API.ahk
#Persistent
;~ global FUNC_SAMP_ADDTOCHATWND := 0x67B60
global FUNC_SAMP_ADDTOCHATWND_1 := 0x67BE0 ; 0.3DL
Sleep 3000
global dwSAMP := GetModuleHandle("samp.dll")
if (!dwSAMP)
{
    MsgBox, Не найден адрес samp.dll
    ExitApp
}
global addChatMessage1Hook := new Hook(0, dwSAMP + FUNC_SAMP_ADDTOCHATWND_1, "Hook_addChatMessage_1")
Hook_addChatMessage_1(dwChatInfo, wText)
{
    FileAppend, % StrGet(wText) "`n", chat.log

    addChatMessage1Hook.setStatus(false)
    DllCall(addChatMessage1Hook.ProcAddr, "Ptr", dwChatInfo, "Ptr", wText)
    addChatMessage1Hook.setStatus(true)
}
FileAppend нормально записывает строку чата в файл, но снятие хука с последующим вызовом оригинальной функи не приводят к появлению сообщений в чате (то есть, в файл строки пишутся, но на экран в чате не выводятся). В чем может быть проблема?
 
Последнее редактирование:

index

Известный
Автор темы
125
82
мб он не дописал все параметры функи? (цвета, префиксы)
AutoHotKey:
Hook_addChatMessage_1(dwChatInfo, clr, wText)
IDA про 2 аргумента говорит, с этим всё ок

Эта thiscall функция, а DllCall умеет вызывать только cdecl, stdcall. Поэтому вызвать придется через asm код, в SAMP UDF, пример такого есть.
Вики говорит, что при thiscall очистку стека выполняет вызывающая функция, но в ADDTOCHATWND_1 это делает последняя инструкция
Код:
samp.dll+67C33 - C2 0800               - ret 0008
Я что-то понял не так?)
 

#Rin

Известный
Всефорумный модератор
1,214
1,043
Вики говорит, что при thiscall очистку стека выполняет вызывающая функция, но в ADDTOCHATWND_1 это делает последняя инструкция
samp.dll+67C33 - C2 0800 - ret 0008Выделить кодNone
Я что-то понял не так?)
В thiscall первым аргументом передается указатель на базовый объект, и этот указатель должен находиться в регистре процессора eax.
Поэтому в ахк, надо выделить память, и записать туда инструкции
Код:
mov eax, dwChatInfo
push pszText
call addChatMessageAddr

мб он не дописал все параметры функи? (цвета, префиксы)
В CChat есть базовая функция добавления сообщения в чат, а есть пару оберток вокруг нее, которые уже сами определяют цвет, префикс...
 
  • Нравится
Реакции: Kvisk и index