Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   ArcheAge (https://forum.zone-game.info/forumdisplay.php?f=187)
-   -   ArcheAge Опкоды (https://forum.zone-game.info/showthread.php?t=29159)

vigorian 12.03.2014 18:57

Re: ArcheAge Опкоды
 
Цитата:

Сообщение от MadHacker (Сообщение 356251)
А я её не снимал. Мне она не мешает.

Здравствуйте,не могли бы вы выложить весь список опкодов? или распакованные dll x2game,x2common ,ну или ehsvc.dll тогда я бы прыгал от радости,пытался распаковать скриптом lcf at, скрипт глючит на iat,хотя от теры нормально распаковывал.Пишу бота,да и сегодня узнал что заблочили германию,буду писать так сказать на шару.

MadHacker 12.03.2014 21:05

Re: ArcheAge Опкоды
 
Цитата:

Сообщение от vigorian (Сообщение 356260)
Здравствуйте,не могли бы вы выложить весь список опкодов?
...

Цитата:

Сообщение от MadHacker (Сообщение 356249)
Список C2W пакетов выложу если в паблике появится больше информации о протоколе. Ну или ещё чего нибудь интересное.

А распаковкой я не занимаюсь. Оно само благополучно распаковывается при загрузке.

xTz 12.03.2014 22:31

Re: ArcheAge Опкоды
 
просто дамп делайте и колупайте

MadHacker 13.03.2014 15:35

Re: ArcheAge Опкоды
 
Кажется я приблизился к разгадке байта отвечающего за сжатие в пакете.
В честь этого события залиты C2W пакеты.

Hint 13.03.2014 18:00

Re: ArcheAge Опкоды
 
Спасибо, но интереснее было бы узнать про этот байт :) До него еще руки не дошли.

MadHacker 13.03.2014 18:51

Re: ArcheAge Опкоды
 
сначала убедюсь, что я прав :)

Добавлено через 1 час 15 минут
Мде. Под отладчиком оптимизм спал. Там что-то более сложное.

MadHacker 14.03.2014 23:40

Re: ArcheAge Опкоды
 
Ну чтож. Почти победа.
Остались незначительные детали, но тайна второго байта разгадана.
И так. World и proxy пакеты у нас имеют вид
DD 01 XX XX
0xDD - пока я не нашёл где оно используется. Точнее пока я возился со следующим байтом на стартовых пакетах коннекта это значение никем не использовалось. Надо смотреть в исходящих пакетах кто его пишет.
01 - Частично MHard был прав. Это фрагмент опкода. Он определяет глобальный тип пакета.
0x01 - W2C пакеты
0x02 - Proxy пакеты
Дальше веселее. Значения больше означают что в пакете есть сжатие. К сожалению все вызовы виртуальные и не имея в отладке такого пакета разобраться проблематично. там вообще много мутного происходит.
Ну и дальше опкод.

Вобщем диспатчится всё тут (осторожно, код не причёсан), все совпадения считать случайными. Код из crynetwork.dll по базе 0x39501000.
 
.text:3952E829 CompressByteDispath proc near           ; CODE XREF: ClientNub__dispath+62p
.text:3952E829                 mov     eax, offset sub_39548249
.text:3952E82E                 call    set_SEH
.text:3952E833                 mov     eax, 50014h
.text:3952E838                 call    sub_39545C30
.text:3952E83D                 push    ebx
.text:3952E83E                 mov     ebx, [ebp+8]
.text:3952E841                 push    esi
.text:3952E842                 push    edi
.text:3952E843                 mov     esi, edx
.text:3952E845                 mov     edi, ecx
.text:3952E847                 mov     ecx, [esi+14h]
.text:3952E84A                 test    ecx, ecx
.text:3952E84C                 jz      loc_3952E96D
.text:3952E852                 movzx   eax, byte ptr [ebx]
.text:3952E855                 mov     al, ds:byte_3956A7F0[eax] ;забыл посмотреть что там за таблица...
.text:3952E85B                 mov     [ebp+0Bh], al                   ;0x01 и 0x02 не меняются
.text:3952E85E                 lea     eax, [ebp-1Ch]
.text:3952E861                 call    sub_3951F44A
.text:3952E866                 and     dword ptr [ebp-4], 0
.text:3952E86A                 movzx   eax, byte ptr [ebp+0Bh]  ;отсюда идёт набор ifов на тип пакета.
.text:3952E86E                 dec     eax
.text:3952E86F                 jz      worldpck
.text:3952E875                 dec     eax
.text:3952E876                 jz      proxypck
.text:3952E87C                 dec     eax
.text:3952E87D                 jz      short __3
.text:3952E87F                 dec     eax
.text:3952E880                 jnz     __4             ; >4
.text:3952E886                 mov     dword ptr [ebp+8], 40000h ; ==4
.text:3952E88D                 cmp     edi, 3
.text:3952E890                 jnb     short loc_3952E89A
.text:3952E892                 push    eax
.text:3952E893                 push    offset aDecompressMpSi ; "decompress-mp-size"
.text:3952E898                 jmp     short decompress
.text:3952E89A ; ---------------------------------------------------------------------------
.text:3952E89A
.text:3952E89A loc_3952E89A:                           ; CODE XREF: CompressByteDispath+67j
.text:3952E89A                 movzx   eax, word ptr [ebx+1]
.text:3952E89E                 mov     [ebp-10h], eax
.text:3952E8A1                 lea     eax, [ebp+8]
.text:3952E8A4                 push    eax
.text:3952E8A5                 lea     eax, [ebp-50020h]
.text:3952E8AB                 push    eax
.text:3952E8AC                 add     ebx, 3
.text:3952E8AF                 add     edi, 0FFFFFFFDh
.text:3952E8B2                 push    ebx
.text:3952E8B3                 call    sub_3952DB09
.text:3952E8B8                 add     esp, 0Ch
.text:3952E8BB                 test    al, al
.text:3952E8BD                 jnz     short loc_3952E8C8
.text:3952E8BF                 push    0
.text:3952E8C1                 push    offset aDecompressMpBo ; "decompress-mp-body"
.text:3952E8C6                 jmp     short decompress
.text:3952E8C8 ; ---------------------------------------------------------------------------
.text:3952E8C8
.text:3952E8C8 loc_3952E8C8:                           ; CODE XREF: CompressByteDispath+94j
.text:3952E8C8                 push    dword ptr [ebp+8]
.text:3952E8CB                 mov     edi, [esi+14h]
.text:3952E8CE                 push    dword ptr [ebp-10h]
.text:3952E8D1                 lea     eax, [ebp-50020h]
.text:3952E8D7                 call    sub_3952AF74
.text:3952E8DC                 jmp     short __4
.text:3952E8DE ; ---------------------------------------------------------------------------
.text:3952E8DE
.text:3952E8DE __3:                                    ; CODE XREF: CompressByteDispath+54j
.text:3952E8DE                 mov     ecx, [esi+10h]
.text:3952E8E1                 lea     eax, [ebp+8]
.text:3952E8E4                 push    eax
.text:3952E8E5                 lea     eax, [ebp-10020h]
.text:3952E8EB                 push    eax
.text:3952E8EC                 inc     ebx
.text:3952E8ED                 lea     eax, [edi-1]
.text:3952E8F0                 push    ebx
.text:3952E8F1                 mov     dword ptr [ebp+8], 0FFFEh
.text:3952E8F8                 call    sub_3952DB5B
.text:3952E8FD                 add     esp, 0Ch
.text:3952E900                 test    al, al
.text:3952E902                 jnz     short loc_3952E916
.text:3952E904                 push    0
.text:3952E906                 push    offset aDecompressMv ; "decompress-mv"
.text:3952E90B
.text:3952E90B decompress:                             ; CODE XREF: CompressByteDispath+6Fj
.text:3952E90B                                         ; CompressByteDispath+9Dj
.text:3952E90B                 mov     eax, [esi]
.text:3952E90D                 push    0Dh
.text:3952E90F                 mov     ecx, esi
.text:3952E911                 call    dword ptr [eax+34h]
.text:3952E914                 jmp     short __4
.text:3952E916 ; ---------------------------------------------------------------------------
.text:3952E916
.text:3952E916 loc_3952E916:                           ; CODE XREF: CompressByteDispath+D9j
.text:3952E916                 mov     eax, [esi+14h]
.text:3952E919                 mov     ecx, [eax+2Ch]
.text:3952E91C                 mov     eax, [ecx]
.text:3952E91E                 call    dword ptr [eax+20h]
.text:3952E921                 mov     edx, [ebp+8]
.text:3952E924                 lea     eax, [ebp-10020h]
.text:3952E92A                 jmp     short loc_3952E953
.text:3952E92C ; ---------------------------------------------------------------------------
.text:3952E92C
.text:3952E92C proxypck:                               ; CODE XREF: CompressByteDispath+4Dj
.text:3952E92C                 push    dword ptr [esi+14h]
.text:3952E92F                 lea     ecx, [edi-1]
.text:3952E932                 lea     eax, [ebx+1]
.text:3952E935                 call    Proxy_pck_dispath  ;функция диспетчеризует прокси пакеты
.text:3952E93A                 jmp     short __4
.text:3952E93C ; ---------------------------------------------------------------------------
.text:3952E93C
.text:3952E93C worldpck:                               ; CODE XREF: CompressByteDispath+46j
.text:3952E93C                 lea     eax, [ebx+1]
.text:3952E93F                 movzx   ecx, word ptr [eax]
.text:3952E942                 test    ecx, ecx                      ;не ноль после подключения
.text:3952E944                 jnz     short loc_3952E950
.text:3952E946                 lea     ecx, [edi-1]
.text:3952E949                 call    EnterWorldResponeDispath ;Обработка пакета W2C 0x00;
.text:3952E94E                 jmp     short __4
.text:3952E950 ; ---------------------------------------------------------------------------
.text:3952E950
.text:3952E950 loc_3952E950:                           ; CODE XREF: CompressByteDispath+11Bj
.text:3952E950                 lea     edx, [edi-1]
.text:3952E953
.text:3952E953 loc_3952E953:                           ; CODE XREF: CompressByteDispath+101j
.text:3952E953                 mov     esi, [esi+14h]
.text:3952E956                 call    DispathW2C   ; диспетчеризация W2C пакетов
.text:3952E95B
.text:3952E95B __4:                                    ; CODE XREF: CompressByteDispath+57j
.text:3952E95B                                         ; CompressByteDispath+B3j ...
.text:3952E95B                 or      dword ptr [ebp-4], 0FFFFFFFFh
.text:3952E95F                 mov     eax, [ebp-1Ch]
.text:3952E962                 lea     ecx, [ebp-18h]
.text:3952E965                 and     eax, 0FFFFFFFCh
.text:3952E968                 push    ecx
.text:3952E969                 call    dword ptr [eax+4]
.text:3952E96C                 pop     ecx
.text:3952E96D
.text:3952E96D loc_3952E96D:                           ; CODE XREF: CompressByteDispath+23j
.text:3952E96D                 mov     ecx, [ebp-0Ch]
.text:3952E970                 pop     edi
.text:3952E971                 pop     esi
.text:3952E972                 mov     large fs:0, ecx
.text:3952E979                 pop     ebx
.text:3952E97A                 leave
.text:3952E97B                 retn    4
.text:3952E97B CompressByteDispath endp
 
Code: ASM

xTz 15.03.2014 09:07

Re: ArcheAge Опкоды
 
Java вариант

Код:

private static Inflater inflater3 = new Inflater(true);
    @Override
    public CryptResult decrypt(byte[] raw, packetDirection dir) {
        if (dir == packetDirection.serverPacket && raw[1] == (byte) 0x04) {
            Inflater inflater = new Inflater(true);
            int size = raw[2];
            byte[] potentialInit = Arrays.copyOfRange(raw, 4, raw.length);
            byte[] buffer = new byte[32768];
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(raw.length);
            outputStream.write(raw[0]);
            try {
                outputStream.write(new byte[]{1});
            } catch (IOException ex) {
                Logger.getLogger(ArcheageGameCBTCrypter.class.getName()).log(Level.SEVERE, null, ex);
            }
            int len = potentialInit.length;
            int off = 0;
            while (!inflater.finished()) {
                try {

                    if (inflater.needsInput()) {
                        int part;

                        if (len < 1) {
                            break;
                        }
                        //part = (len < 84 ? len : 84);
                        part = len;
                        inflater.setInput(potentialInit, off, part);
                        off += part;
                        len -= part;
                  }
                    int count = inflater.inflate(buffer);
                    outputStream.write(buffer, 0, count);
                } catch (DataFormatException ex) {
                    System.out.println("Packet decompression error: "+ex.getMessage());
                    return new CryptResult(raw, size);
                }
            }
            try {
                outputStream.close();
            } catch (IOException ex) {
            }
            System.out.println(size);
            return new CryptResult(outputStream.toByteArray(), size);
        }
        else if (dir == packetDirection.serverPacket && raw[1] == (byte) 0x03) {
            byte[] potentialInit = Arrays.copyOfRange(raw, 2, raw.length);
            byte[] buffer = new byte[32768];
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(raw.length);
            outputStream.write(raw[0]);
            try {
                outputStream.write(new byte[]{1});
            } catch (IOException ex) {
                Logger.getLogger(ArcheageGameCBTCrypter.class.getName()).log(Level.SEVERE, null, ex);
            }
            int len = potentialInit.length;
            int off = 0;
            while (!inflater3.finished()) {
                try {

                    if (inflater3.needsInput()) {
                        int part;

                        if (len < 1) {
                            break;
                        }
                        //part = (len < 84 ? len : 84);
                        part = len;
                        inflater3.setInput(potentialInit, off, part);
                        off += part;
                        len -= part;
                  }
                    int count = inflater3.inflate(buffer);
                    outputStream.write(buffer, 0, count);
                } catch (DataFormatException ex) {
                    System.out.println("Packet decompression error: "+ex.getMessage());
                    return new CryptResult(raw, 1);
                }
            }
            try {
                outputStream.close();
            } catch (IOException ex) {
            }
            return new CryptResult(outputStream.toByteArray(), 1);
        }
        return new CryptResult(raw, 1);
    }


Onax 15.03.2014 18:27

Re: ArcheAge Опкоды
 
Цитата:

Сообщение от xTz (Сообщение 356645)
Java вариант

в случае 0x4...кто такой size?
в одном пакете сжато несколько других чтоль?
ну взял пакет 1783 байт, распаковал до 5кб
взял 28 байт - а остальное куда?
после этого size не вижу ничего пригодного в распакованных данных
типа 00 00 52 BF 00 00, т.е ни намека на длину/опкод
но данные там реально есть т.е распаковано всё верно (видны utf8 строки типа "Пугало" и т.п)
//
дык тут похоже еще один формат
три разных пакета(S>C DD 04) разной длины в распакованном виде
http://s43.radikal.ru/i101/1403/e9/621d742e475c.png
и дальше до конца тоже самое, отличия только в определенных местах
может это конечно списки одинаковых пакетов с разными данными

xTz 15.03.2014 20:38

Re: ArcheAge Опкоды
 
сжимаются несколько пакетов в один


Текущее время: 08:56. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot