Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
ArcheAge Опкоды
#31
MadHacker Написал:А я её не снимал. Мне она не мешает.
Здравствуйте,не могли бы вы выложить весь список опкодов? или распакованные dll x2game,x2common ,ну или ehsvc.dll тогда я бы прыгал от радости,пытался распаковать скриптом lcf at, скрипт глючит на iat,хотя от теры нормально распаковывал.Пишу бота,да и сегодня узнал что заблочили германию,буду писать так сказать на шару.
Ответ
#32
vigorian Написал:Здравствуйте,не могли бы вы выложить весь список опкодов?
...

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

А распаковкой я не занимаюсь. Оно само благополучно распаковывается при загрузке.
Ответ
#33
просто дамп делайте и колупайте
Ответ
#34
Кажется я приблизился к разгадке байта отвечающего за сжатие в пакете.
В честь этого события залиты C2W пакеты.
Ответ
#35
Спасибо, но интереснее было бы узнать про этот байт Smile До него еще руки не дошли.
hLaPEx, Evermore, hAuthD, L2on, ...
Ответ
#36
сначала убедюсь, что я прав Smile

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

Вобщем диспатчится всё тут (осторожно, код не причёсан), все совпадения считать случайными. Код из crynetwork.dll по базе 0x39501000.
[SRC="asm"]
.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
[/SRC]
Ответ
#38
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);
    }
Ответ
#39
xTz Написал: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
и дальше до конца тоже самое, отличия только в определенных местах
может это конечно списки одинаковых пакетов с разными данными
Ответ
#40
сжимаются несколько пакетов в один
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Исследование базы ArcheAge MadHacker 138 85,224 11-09-2023, 05:17 PM
Последний пост: ShannonAAEMU
  Archeage client 24.04.13 DancerS 6 6,598 07-03-2022, 08:08 AM
Последний пост: anthemis
  Эмулятор ArcheAge kronk 1 3,374 06-04-2021, 07:35 PM
Последний пост: anthemis
  Archeage 1.2 РУ клиент anthemis 1 3,086 04-29-2021, 08:52 PM
Последний пост: anthemis
  Собираю команду для создания сервера Archeage HaMeRoN 60 41,130 03-21-2021, 10:05 AM
Последний пост: anthemis
  Будем заниматься ArcheAge? Smiler 105 44,904 02-15-2021, 06:08 AM
Последний пост: anthemis
  [WTB] Archeage gamigo server files Sparkle 0 3,146 08-20-2020, 10:20 AM
Последний пост: Sparkle
  ArcheAge Pack Tool danonpw 9 20,582 09-11-2019, 09:56 AM
Последний пост: nikes
  archeage emu files Yanlongli 4 6,757 08-21-2018, 01:21 AM
Последний пост: JeyFrey
  Площадка продажи покупки игровых ценностей ArcheAge nbgr 0 3,354 08-18-2018, 10:35 PM
Последний пост: nbgr

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)