Просмотр полной версии : Откуда вызываются обработчики
HuntsMan
22.08.2011, 19:12
Разбирал один пакет, Client->Server направленности, хотел пошариться по месту где вызывается функция формирующая пакет, и тут столкнулся с проблемой: поиск по декомпилированному листингу ничего не дал кроме объявления и заполнения этой функции. Получается, что она тоже вызывается по хеш таблице, или как это там правильно называется, а вот как найти эту таблицу никто не в курсе?
Клиент 4.0.6а.
Chameleon
22.08.2011, 22:08
CMSG отправляющие функции должны вызываться прямым образом. Попробуй использовать xref в иде вместо поиска по декомпилу. Точнее сказать не могу, не зная про какой пакет речь.
HuntsMan
23.08.2011, 09:47
Смотре в иде, она вроде как в дереве указывает откуда функция вызывается, но для моей ничего подобного не увидел. Опкод CMSG_GUILD_ADD_RANK.
Chameleon
23.08.2011, 12:16
Не напрямую, но как я и говорил по xref находится.
Для билда 14333: CMSG_GUILD_ADD_RANK, номер 33888, хэндлер 6B96E0.
По xref находится только
.rdata:00B8F498 off_B8F498 dd offset sub_6B96E0
Смотришь xref к off_B8F498 и там 3 функции: что-то типа конструктора, деструктора и еще чего-то. По 2м из них через xref находится вызывающая функция sub_91B660 - обработчик LUA GuildControlAddRank.
HuntsMan
23.08.2011, 16:23
Спасибо, добрался я до нужного места :)
Теперь другой вопрос :) смотря на функцию int __thiscall sub_969F70(void *this, int a2) я как понял в первом аргументе идет адрес, дальше к примеру к этому адресу прибавляется 57 (CDataStore__PutInt8(a2, *((_BYTE *)v3 + 57));) ну и т.п. А теперь вопрос: от какого адреса нужно плясать? Я так понял нужно от адреса вызова функции sub_4ED020:
if ( FrameScript__IsString(a1, 1) )
{
if ( (unsigned int)dword_DFAF78 < 0xA )
{
v3 = FrameScript__ToLString(a1, 1, 0);
if ( v3 )
{
if ( *(_BYTE *)v3 )
{
sub_4ED020(v3, (unsigned int)&v6, 16, 64, 1);
v4 = ClntObjMgrGetActivePlayerObj();
if ( v4 )
{
sub_969F30((int)&v5, **((_DWORD **)v4 + 2), *(_DWORD *)(*((_DWORD *)v4 + 2) + 4), (int)&v6, dword_DFAF78);
ClientConnection__SendSpecialPacket((int)&v5);
sub_9699A0(&v5);
}
}
}
}
result = 0;
}
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot