PDA

Просмотр полной версии : Поиск функции SendPacket в l2


Hippeys
19.07.2014, 20:40
Здравствуйте!

Пытаюсь найти адрес функции SendPacket в клиенте l2, для того, чтобы потом ее похукать, но вот незадача, она скрыта и ее нет в таблице экспорта, может где-нибудь это уже разжевано? Интересует только автоматический, не ручной поиск.

Может у кого-нибудь есть сигнатуры этой функции, чтобы потом искать по памяти? Код я сам могу написать, интересуют чисто сигнатуры.
Или может у кого-нибудь есть список адресов смещений этой функции от engine.dll?

Я знаю l2ph тоже как то ищет, можете тыкнуть лицом в код, где он это делает?

Спасибо

Добавлено через 41 минуту
SendPacket необходим чтобы в одном пакете немного модифицировать

supernewbie
19.07.2014, 22:24
Hippeys, глянь код экспортируемых функций которые вызывают сенд пакет

Hippeys
20.07.2014, 00:30
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
20.07.2014, 15:40
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
22.07.2014, 22:56
Hippeys, твоя функция запакована
алгоритм поиска сенд пакета на любой клиент без веток написать не получится, некоторые клиенты сильно отличаются друг от друга

А как распаковать? Я вначале подумал, что при загрузке в процесс оно распаковывается, подрубаюсь дебагерром, но тут ошибка вылетает, что, мол, дебаггер врублен. Есть где-нибудь гайд по распаковке?

supernewbie
23.07.2014, 10:50
Hippeys, можно инжектнуть свою длл в процесс и снять дамп функции

Hippeys
23.07.2014, 19:08
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
24.07.2014, 20:09
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 выглядит пожалуйста

user713
08.04.2015, 18:32
Сори за некропостинг, но всёже мож кому понадобится:
unsigned int GetSendPacketAddress(void)
{
HMODULE hEngine = LoadLibraryA("engine.dll");
unsigned int dwUNetHandler = (unsigned int)GetProcAddress(hEngine, "??_7UNetworkHandler@@6BUObject@@@");
return *(unsigned int*)(dwUNetHandler - 0x1c);
}