Просмотр полной версии : Поиск функции SendPacket в l2
Здравствуйте!
Пытаюсь найти адрес функции SendPacket в клиенте l2, для того, чтобы потом ее похукать, но вот незадача, она скрыта и ее нет в таблице экспорта, может где-нибудь это уже разжевано? Интересует только автоматический, не ручной поиск.
Может у кого-нибудь есть сигнатуры этой функции, чтобы потом искать по памяти? Код я сам могу написать, интересуют чисто сигнатуры.
Или может у кого-нибудь есть список адресов смещений этой функции от engine.dll?
Я знаю l2ph тоже как то ищет, можете тыкнуть лицом в код, где он это делает?
Спасибо
Добавлено через 41 минуту
SendPacket необходим чтобы в одном пакете немного модифицировать
supernewbie
19.07.2014, 22:24
Hippeys, глянь код экспортируемых функций которые вызывают сенд пакет
Hippeys, глянь код экспортируемых функций которые вызывают сенд пакет
А какие экспортируемые функции вызывают SendPacket?
supernewbie
20.07.2014, 08:07
Hippeys, большинство методов класса UNetworkHandler
.text:203D5530 ; Exported entry 8363. ?RequestItemList@UNetworkHandler@@UAEHXZ
.text:203D5530
.text:203D5530 ; =============== S U B R O U T I N E =======================================
.text:203D5530
.text:203D5530
.text:203D5530 ; public: virtual int __thiscall UNetworkHandler::RequestItemList(void)
.text:203D5530 public ?RequestItemList@UNetworkHandler@@UAEHXZ
.text:203D5530 ?RequestItemList@UNetworkHandler@@UAEHXZ proc near
.text:203D5530 mov eax, [ecx+48h]
.text:203D5533 mov ecx, [eax]
.text:203D5535 mov edx, [ecx+6Ch] ; в edx адрес SendPacket
.text:203D5538 push 14h
.text:203D553A push offset unk_20507FEC
.text:203D553F push eax
.text:203D5540 call edx
.text:203D5542 mov eax, ds:?GNetworkLog@@3PAVFOutputDevice@@A ; FOutputDevice * GNetworkLog
.text:203D5547 mov ecx, [eax]
.text:203D5549 push offset aSendItemlist ; "(Send)ItemList"
.text:203D554E push ecx
.text:203D554F call ds:?Logf@FOutputDevice@@QAAXPB_WZZ ; FOutputDevice::Logf(wchar_t const *,...)
.text:203D5555 add esp, 14h
.text:203D5558 mov eax, 1
.text:203D555D retn
.text:203D555D ?RequestItemList@UNetworkHandler@@UAEHXZ endp
.text:203D555D
.text:203D555D ; ---------------------------------------------------------------------------
Hippeys, большинство методов класса UNetworkHandler
.text:203D5530 ; Exported entry 8363. ?RequestItemList@UNetworkHandler@@UAEHXZ
.text:203D5530
.text:203D5530 ; =============== S U B R O U T I N E =======================================
.text:203D5530
.text:203D5530
.text:203D5530 ; public: virtual int __thiscall UNetworkHandler::RequestItemList(void)
.text:203D5530 public ?RequestItemList@UNetworkHandler@@UAEHXZ
.text:203D5530 ?RequestItemList@UNetworkHandler@@UAEHXZ proc near
.text:203D5530 mov eax, [ecx+48h]
.text:203D5533 mov ecx, [eax]
.text:203D5535 mov edx, [ecx+6Ch] ; в edx адрес SendPacket
.text:203D5538 push 14h
.text:203D553A push offset unk_20507FEC
.text:203D553F push eax
.text:203D5540 call edx
.text:203D5542 mov eax, ds:?GNetworkLog@@3PAVFOutputDevice@@A ; FOutputDevice * GNetworkLog
.text:203D5547 mov ecx, [eax]
.text:203D5549 push offset aSendItemlist ; "(Send)ItemList"
.text:203D554E push ecx
.text:203D554F call ds:?Logf@FOutputDevice@@QAAXPB_WZZ ; FOutputDevice::Logf(wchar_t const *,...)
.text:203D5555 add esp, 14h
.text:203D5558 mov eax, 1
.text:203D555D retn
.text:203D555D ?RequestItemList@UNetworkHandler@@UAEHXZ endp
.text:203D555D
.text:203D555D ; ---------------------------------------------------------------------------
Огромное спасибо, а скажи пожалуйста, этот указатель на функции SendPacket всегда на этом месте в этой функции? То есть можно ли написать поиск SendPacket автоматический, на разных версиях engine.dll?
Добавлено через 18 минут
supernewbie, У меня эта функция выглядит вот так:
___:203D5430 ; public: virtual int __thiscall UNetworkHandler::RequestItemList(void)
___:203D5430 public ?RequestItemList@UNetworkHandler@@UAEHXZ
___:203D5430 ?RequestItemList@UNetworkHandler@@UAEHXZ proc near
___:203D5430 fisubr dword ptr [eax-75h]
___:203D5433 mov dword ptr [edi-6Dh], 5F9A690h
___:203D543A stosd
___:203D543B pop esi
___:203D543C daa
___:203D543D pop ecx
___:203D543E
___:203D543E loc_203D543E: ; CODE XREF: UNetworkHandler::RequestTrade(int)+B0j
___:203D543E arpl [edx+6EE0DB56h], bx
___:203D5444 jnb short loc_203D5497
___:203D5446 arpl di, ax
___:203D5448 pop edi
___:203D5449 mov dh, 1Fh
___:203D544B sti
___:203D544C loopne loc_203D5457
___:203D544E nop
___:203D544F fisub dword ptr [edi]
___:203D5451 cdq
___:203D5452 rcr edx, cl
___:203D5454 daa
___:203D5455 stosb
___:203D5456 pop es
___:203D5457
___:203D5457 loc_203D5457: ; CODE XREF: UNetworkHandler::RequestItemList(void)+1Cj
___:203D5457 push ecx
___:203D5458 movaps xmm0, oword ptr [ebx+4Ah]
___:203D545C push edi
___:203D545D jmp short loc_203D546E
___:203D545D ?RequestItemList@UNetworkHandler@@UAEHXZ endp
Клиент High Five
supernewbie
20.07.2014, 18:35
Hippeys, твоя функция запакована
алгоритм поиска сенд пакета на любой клиент без веток написать не получится, некоторые клиенты сильно отличаются друг от друга
Hippeys, твоя функция запакована
алгоритм поиска сенд пакета на любой клиент без веток написать не получится, некоторые клиенты сильно отличаются друг от друга
А как распаковать? Я вначале подумал, что при загрузке в процесс оно распаковывается, подрубаюсь дебагерром, но тут ошибка вылетает, что, мол, дебаггер врублен. Есть где-нибудь гайд по распаковке?
supernewbie
23.07.2014, 10:50
Hippeys, можно инжектнуть свою длл в процесс и снять дамп функции
supernewbie, я так понимаю, что необходимо перехватывать UNetworkHandler::RequestItemList?
У меня код этой функции такой же как у вас:
.data:0x00000000 8b4148 mov eax,DWORD PTR [ecx+0x48]
.data:0x00000003 8b08 mov ecx,DWORD PTR [eax]
.data:0x00000005 8b516c mov edx,DWORD PTR [ecx+0x6c] <--- адрес SendPacket
.data:0x00000008 6a14 push 0x14
.data:0x0000000a 6814905020 push 0x20509014
.data:0x0000000f 50 push eax
.data:0x00000010 ffd2 call edx
.data:0x00000012 a124e44820 mov eax,ds:0x2048e424
.data:0x00000017 8b08 mov ecx,DWORD PTR [eax]
.data:0x00000019 68dcae5120 push 0x2051aedc
.data:0x0000001e 51 push ecx
.data:0x0000001f e87c85c7f4 call func_f4c785a0
.data:0x00000024 90 nop
.data:0x00000025 83c414 add esp,0x14
.data:0x00000028 b801000000 mov eax,0x1
.data:0x0000002d c3 ret
Я так понимаю смещение 0x6c, получается адрес так?
LPVOID fnOrigUNetworkHandler = ::GetProcAddress(LoadLibrary("engine.dll"), "?RequestItemList@UNetworkHandler@@UAEHXZ");
LPVOID fnOrigSendPacket_EngineDLL = (LPVOID)((ULONG_PTR)fnOrigUNetworkHandler+0x6c);
Так он берется? fnOrigSendPacket_EngineDLL правильный получается? Хукаю по этому адресу но ничего не идет, ни одного вызова
supernewbie
23.07.2014, 19:59
Hippeys, UNetworkHandler::RequestItemList имеет соглашение вызова thiscall - в ecx лежит указатель на this, в коде
.data:0x00000000 8b4148 mov eax,DWORD PTR [ecx+0x48]
.data:0x00000003 8b08 mov ecx,DWORD PTR [eax]
.data:0x00000005 8b516c mov edx,DWORD PTR [ecx+0x6c] <--- адрес SendPacket
в ecx указатель на инстанс UNetworkHandler, затем тремя инструкциями вычисляешь адрес сенд пакета при условии подстановки в ecx инстанса UNetworkHandler
Hippeys, UNetworkHandler::RequestItemList имеет соглашение вызова thiscall - в ecx лежит указатель на this, в коде
.data:0x00000000 8b4148 mov eax,DWORD PTR [ecx+0x48]
.data:0x00000003 8b08 mov ecx,DWORD PTR [eax]
.data:0x00000005 8b516c mov edx,DWORD PTR [ecx+0x6c] <--- адрес SendPacket
в ecx указатель на инстанс UNetworkHandler, затем тремя инструкциями вычисляешь адрес сенд пакета при условии подстановки в ecx инстанса UNetworkHandler
Спасибо, скажи пожалуйста какой адрес у тебя получается у функции SendPacket(у меня тот же код функции RequestItemList поэтому и адрес должен быть тот по идее)? У меня получается 0ABE16EC почему-то
Добавлено через 1 минуту
а, не, вроде разобрался, получилось 0x20522AD8
Добавлено через 20 часов 35 минут
подскажите, как функция SendPacket выглядит пожалуйста
Сори за некропостинг, но всёже мож кому понадобится:
unsigned int GetSendPacketAddress(void)
{
HMODULE hEngine = LoadLibraryA("engine.dll");
unsigned int dwUNetHandler = (unsigned int)GetProcAddress(hEngine, "??_7UNetworkHandler@@6BUObject@@@");
return *(unsigned int*)(dwUNetHandler - 0x1c);
}
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot