Перейти к содержанию
Авторизация  
neverend

Разбор дизассемблерного кода

Рекомендуемые сообщения

Здравствуйте, уважаемые форумчане.

Решил заморочиться и разобрать одну игрушку (Lineage 2) "по-кусочкам".
Если быть точнее, то меня интересует сетевая сторона клиента: хочу понять, как именно формируются пакеты на отправку/прием и, собственно, как же они отправляются серверу.
Для этих задач мною был скачан IDA Pro и прогнаны через него некоторые файлы клиента...Методом простого поиска, я нашел функции с похожим названием "SendPacket, ReciewePacket"...Но вот что в них там происходит, я не имею понятия...Точнее я понимаю операторы языка ассемблер, но вот хоть убей не въезжаю в смысл всего этого.

Небольшая предыстория: в самом начале, я просто хотел понять принцип шифрования пакетов (и последующий их разбор) и использовал wireshark для этих целей, но, как оказалось, одним wireshark'ом тут не обойтись, ибо гадание на кофейной гуще не приблизило меня к алгоритму шифрования пакетов smile3.gif. Начал копать глубже и спустился до самых низов вот.

В этом посте выложу диззасемблированный код функции 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...