neverend 0 Опубликовано 20 марта, 2017 Здравствуйте, уважаемые форумчане.Решил заморочиться и разобрать одну игрушку (Lineage 2) "по-кусочкам".Если быть точнее, то меня интересует сетевая сторона клиента: хочу понять, как именно формируются пакеты на отправку/прием и, собственно, как же они отправляются серверу.Для этих задач мною был скачан IDA Pro и прогнаны через него некоторые файлы клиента...Методом простого поиска, я нашел функции с похожим названием "SendPacket, ReciewePacket"...Но вот что в них там происходит, я не имею понятия...Точнее я понимаю операторы языка ассемблер, но вот хоть убей не въезжаю в смысл всего этого.Небольшая предыстория: в самом начале, я просто хотел понять принцип шифрования пакетов (и последующий их разбор) и использовал wireshark для этих целей, но, как оказалось, одним wireshark'ом тут не обойтись, ибо гадание на кофейной гуще не приблизило меня к алгоритму шифрования пакетов . Начал копать глубже и спустился до самых низов вот.В этом посте выложу диззасемблированный код функции PostSend (отмечу, что так же есть функции с таким названием, как PreSend, PostSendMap, но мне почему-то кажется, что сама отправка идет из этой функции и я хочу по принципу "реверс инжинеринга" исходить от конечной точки отправки к тому самому необходимому мне формированию пакета).Так же добавлю, что копаясь еще в wireshark'е я уже научился отлавливать нужный мне пакет: например, отправка сообщения в чат, и так же нашел именно эту функцию в диззасемблированном коде (кстати, дизасемблировал я файл engine.dll).Выше было много вводной части, теперь вопрос по существу: как именно мне понять (если быть честнее, то ткнуть носом), где происходит та самая отправка пакета на указанный ip адресс и где(как) происходит формирование пакета, возможно его шифрование и прочие связанные с этим вещи). А еще, хотелось бы узнать, как из одной dll-ки вызывается другая (на примере дизассемблированного кода)Буду рад любым ответам по-существу. .text:10763000 ; =============== S U B R O U T I N E =======================================.text:10763000.text:10763000 ; Attributes: bp-based frame.text:10763000.text:10763000 ; void __thiscall UNetConnection::PostSend(UNetConnection *__hidden this).text:10763000 ?PostSend@UNetConnection@@QAEXXZ_0 proc near.text:10763000 ; CODE XREF: UNetConnection::PostSend(void)j.text:10763000.text:10763000 var_10 = dword ptr -10h.text:10763000 var_C = dword ptr -0Ch.text:10763000 var_4 = dword ptr -4.text:10763000.text:10763000 push ebp.text:10763001 mov ebp, esp.text:10763003 push 0FFFFFFFFh.text:10763005 push offset ?PostSend@UNetConnection@@QAEXXZ_0_SEH.text:1076300A mov eax, large fs:0.text:10763010 push eax.text:10763011 mov large fs:0, esp.text:10763018 sub esp, 0Ch.text:1076301B push ebx.text:1076301C push esi.text:1076301D push edi.text:1076301E mov [ebp+var_10], esp.text:10763021 mov esi, ecx.text:10763023 mov [ebp+var_4], 0.text:1076302A lea edi, [esi+254h].text:10763030 mov ecx, edi.text:10763032 mov ebx, ds:?GetNumBits@FBitWriter@@QAEHXZ ; FBitWriter::GetNumBits(void).text:10763038 call ebx ; FBitWriter::GetNumBits(void) ; FBitWriter::GetNumBits(void).text:1076303A mov ecx, [esi+0C8h].text:10763040 add ecx, ecx.text:10763042 add ecx, ecx.text:10763044 add ecx, ecx.text:10763046 cmp eax, ecx.text:10763048 jle short loc_10763062.text:1076304A push 26Eh.text:1076304F push offset a_Unconn_cpp ; ".\\UnConn.cpp".text:10763054 push offset aOut_getnumbi_0 ; "Out.GetNumBits()<=MaxPacket*8".text:10763059 call ds:?appFailAssert@@YAXPBD0H@Z ; appFailAssert(char const *,char const *,int).text:1076305F add esp, 0Ch.text:10763062.text:10763062 loc_10763062: ; CODE XREF: UNetConnection::PostSend(void)+48j.text:10763062 mov ecx, edi.text:10763064 call ebx ; FBitWriter::GetNumBits(void) ; FBitWriter::GetNumBits(void).text:10763066 mov edx, [esi+0C8h].text:1076306C add edx, edx.text:1076306E add edx, edx.text:10763070 add edx, edx.text:10763072 cmp eax, edx.text:10763074 jnz short loc_10763082.text:10763076 mov eax, [esi].text:10763078 mov ecx, esi.text:1076307A mov edx, [eax+84h].text:10763080 call edx.text:10763082.text:10763082 loc_10763082: ; CODE XREF: UNetConnection::PostSend(void)+74j.text:10763082 mov [ebp+var_4], 0FFFFFFFFh.text:10763089 mov ecx, [ebp+var_C].text:1076308C mov large fs:0, ecx.text:10763093 pop edi.text:10763094 pop esi.text:10763095 pop ebx.text:10763096 mov esp, ebp.text:10763098 pop ebp.text:10763099 retn.text:10763099 ?PostSend@UNetConnection@@QAEXXZ_0 endp P.S. на всякий случай, выложу сюда псевдокод, сгенеренный все тем-же IDA void __thiscall UNetConnection::PostSend(UNetConnection *this) { UNetConnection *v1; // esi@1 FBitWriter *v2; // edi@1 int v3; // [sp+0h] [bp-24h]@1 int *v4; // [sp+14h] [bp-10h]@1 int v5; // [sp+20h] [bp-4h]@1 v4 = &v3; v1 = this; v5 = 0; v2 = (UNetConnection *)((char *)this + 596); if ( FBitWriter::GetNumBits((UNetConnection *)((char *)this + 596)) > 8 * *((_DWORD *)this + 50) ) appFailAssert("Out.GetNumBits()<=MaxPacket*8", ".\\UnConn.cpp", 622); if ( FBitWriter::GetNumBits(v2) == 8 * *((_DWORD *)v1 + 50) ) (*(void (__thiscall **)(UNetConnection *))(*(_DWORD *)v1 + 132))(v1);} P.P.S. на всякий случай, так же прикреплю ссылку на исходный и дизассемблированный файлы. http://rgho.st/92QyYRsvK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты