Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг > Шифрации серверов
Войти через OpenID

Шифрации серверов Здесь разбираемся с алгоритмами шифрации различных серверов

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 08.03.2011, 06:17   #1
Пользователь
 
Аватар для DzumoHu4
 
Регистрация: 28.06.2008
Сообщений: 73
Сказал Спасибо: 7
Имеет 24 спасибок в 16 сообщенях
DzumoHu4 пока неопределено
Хорошо LameGuard - шифрование.

Давно меня здесь не было, но как видите столкнулся с сервером на котором применяется данный вид защиты.

Внимание все изложенное ниже мои догадки, это не значит что все на самом деле происходит так как я описал.

Начнем с того что я решил напомнить себе про L2, поиграл, побегал, надоело решил "пошаманить" с "заточками"(спасибо NLObP ещё раз за твой труд) но увы, вместо знакомых пакетов увидел нечто что ввело меня в ступор... отвлекся.

Во первых если я верно понял то для сервера и клиента используются разные ключи.
l
Код:
package com.lameguard.crypt;
import com.lameguard.Config;
import com.lameguard.crypt.impl.L2C;
import com.lameguard.crypt.impl.L2S;
import com.lameguard.crypt.impl.VMPC;


public class GameCrypt
{

    public GameCrypt()
    {
        isEnabled = false;
        isProtected = true;
    }

    public void setProtected(boolean state)
    {
        isProtected = state;
    }

    public void setKey(byte key[])
    {
        if(isProtected)
        {
            c = new VMPC();
            c.setup(key, Config.LAMEGUARD_CLIENT_CRYPT_IV);
            s = ((LameCrypt) (Config.LAMEGUARD_USE_DEFAULT_ENCODER ? ((LameCrypt) (new L2S())) : ((LameCrypt) (new VMPC()))));
            s.setup(key, Config.LAMEGUARD_SERVER_CRYPT_IV);
        } else
        {
            c = new L2C();
            c.setup(key, null);
            s = new L2S();
            s.setup(key, null);
        }
    }

    public void decrypt(byte raw[], int offset, int size)
    {
        if(isEnabled)
            c.crypt(raw, offset, size);
    }

    public void encrypt(byte raw[], int offset, int size)
    {
        if(isEnabled)
            s.crypt(raw, offset, size);
        else
            isEnabled = true;
    }

    private LameCrypt c;
    private LameCrypt s;
    private boolean isEnabled;
    private boolean isProtected;
}
Отсюда видно что если Администратор задал ключи в конфиге то их используют, иначе используется упрошенная схема шифрования
Дальше;
Код:
package com.lameguard.crypt.impl;

import com.lameguard.crypt.LameCrypt;

public class VMPC
    implements LameCrypt
{

    public VMPC()
    {
        n = 0;
        P = new byte[256];
        s = 0;
    }

    public void setup(byte key[], byte iv[])
    {
        s = 0;
        for(int i = 0; i < 256; i++)
            P[i] = (byte)(i & 0xff);

        for(int m = 0; m < 768; m++)
        {
            s = P[s + P[m & 0xff] + key[m % 64] & 0xff];
            byte temp = P[m & 0xff];
            P[m & 0xff] = P[s & 0xff];
            P[s & 0xff] = temp;
        }

        for(int m = 0; m < 768; m++)
        {
            s = P[s + P[m & 0xff] + iv[m % 64] & 0xff];
            byte temp = P[m & 0xff];
            P[m & 0xff] = P[s & 0xff];
            P[s & 0xff] = temp;
        }

        for(int m = 0; m < 768; m++)
        {
            s = P[s + P[m & 0xff] + key[m % 64] & 0xff];
            byte temp = P[m & 0xff];
            P[m & 0xff] = P[s & 0xff];
            P[s & 0xff] = temp;
        }

        n = 0;
    }

    public void crypt(byte raw[], int offset, int size)
    {
        for(int i = 0; i < size; i++)
        {
            s = P[s + P[n & 0xff] & 0xff];
            byte z = P[P[P[s & 0xff] & 0xff] + 1 & 0xff];
            byte temp = P[n & 0xff];
            P[n & 0xff] = P[s & 0xff];
            P[s & 0xff] = temp;
            n = (byte)(n + 1 & 0xff);
            raw[offset + i] = (byte)(raw[offset + i] ^ z);
        }

    }

    private byte n;
    private byte P[];
    private byte s;
}
Затрудняюсь описать операции так как не силен в яве но по видимому этот фрагмент кода генерирует ключ(поправьте если не прав) из lameguard.Config а именно из этого фрагмента
Код:
    
            byte key[] = attrs.getValue("Client-Key").getBytes();
            byte tmp[] = new byte[32];
            System.arraycopy(key, 0, tmp, 0, 32);
            LAMEGUARD_CLIENT_CRYPT_KEY = LameKey.expandKey(tmp, 32);
            System.arraycopy(key, 32, tmp, 0, 32);
            LAMEGUARD_CLIENT_CRYPT_IV = LameKey.expandKey(tmp, 32);
            key = attrs.getValue("Server-Key").getBytes();
            System.arraycopy(key, 0, tmp, 0, 32);
            LAMEGUARD_SERVER_CRYPT_KEY = LameKey.expandKey(tmp, 32);
            System.arraycopy(key, 32, tmp, 0, 32);
            LAMEGUARD_SERVER_CRYPT_IV = LameKey.expandKey(tmp, 32);
который в свою очередь расширяется по алгоритму из этого фрагмента LameKey.expandKey....
DzumoHu4 вне форума   Ответить с цитированием
За это сообщение DzumoHu4 нажился спасибкой от:
Старый 08.03.2011, 06:18   #2
Пользователь
 
Аватар для DzumoHu4
 
Регистрация: 28.06.2008
Сообщений: 73
Сказал Спасибо: 7
Имеет 24 спасибок в 16 сообщенях
DzumoHu4 пока неопределено
По умолчанию

....
Код:
package com.lameguard.crypt;


public class LameKey
{

    public LameKey()
    {
    }

    public static byte[] expandKey(byte key[], int size)
    {
        byte P[] = new byte[64];
        for(int i = 0; i < 64; i++)
            P[i] = key[i % size];

        for(int i = 0; i < 256; i++)
        {
            byte t = P[i % 64];
            byte m = (byte)(MGBOX[MGBOX[t & 0xff] & 0xff] & 0xff ^ TKBOX[TKBOX[i] & 0xff] & 0xff);
            P[i % 64] = TKBOX[m & 0xff];
        }

        return P;
    }

    private static final byte TKBOX[] = {
        -112, 22, 124, -93, 68, -116, -19, -125, -4, 101, 
        -62, 5, 70, 25, 29, 81, 65, -86, 79, -69, 
        2, 97, -108, -11, -84, -56, 17, 7, 31, 52, 
        -34, -41, -110, -60, 57, -5, -6, -24, 98, -100, 
        23, 4, -74, -37, 1, 6, -2, -14, -77, 12, 
        -7, 3, -29, -17, -75, 49, 44, -78, 94, 21, 
        0, 35, -18, 83, 9, -42, 60, 93, 54, 20, 
        -49, 114, 106, -82, 113, -90, 86, -124, -73, -81, 
        90, 121, 115, 125, 47, 24, -28, 73, 56, -31, 
        8, 71, 122, 58, -33, 108, -111, 102, -118, -103, 
        -122, 88, 28, -76, 67, -115, -67, 78, 36, 117, 
        -8, -25, -97, 107, -91, -50, -53, -52, 111, -114, 
        -58, -128, 84, -98, 63, 74, 10, 41, -32, 126, 
        69, -68, 11, -119, -44, -39, -107, -40, 85, -87, 
        61, 91, -1, 50, -72, -117, 15, 55, -51, 43, 
        87, 105, 120, -88, 116, 80, -48, -123, -127, -105, 
        -22, 76, 109, 19, -46, -30, 112, 16, -10, 45, 
        -63, -47, 123, -106, 27, 38, 104, -70, -79, 18, 
        -99, -16, -85, -23, 30, -66, 48, -89, -61, -113, 
        -12, 51, -95, -15, 32, -9, 62, -38, 14, -45, 
        -80, 66, 100, 103, -104, -27, -43, 110, -83, -26, 
        -101, 46, -120, -54, 37, 42, 13, 75, 82, -109, 
        26, -94, -57, -64, 119, 53, 39, -13, -121, 33, 
        72, -126, -65, -36, -71, 118, -35, 92, 96, 89, 
        64, 34, -20, -96, 77, 40, 127, -21, 59, -55, 
        -102, 95, -3, 99, -59, -92
    };
    private static final byte MGBOX[] = {
        -14, -108, 90, 75, 15, 115, -38, -37, -125, 29, 
        -77, 9, -4, 54, -72, 70, 65, -44, -48, 85, 
        -13, -121, 118, -102, 40, 53, 113, -5, -9, 28, 
        3, 125, 21, -124, 10, 67, -6, -98, 96, -105, 
        -104, 126, -93, 82, -47, 41, -91, 89, -59, 122, 
        47, 37, -31, 59, 56, 12, -112, -58, -39, -10, 
        -40, -49, 22, -107, 33, -89, 109, 31, 88, 81, 
        72, 42, -66, -85, -15, 93, -101, -7, -128, -19, 
        -27, -90, -11, 111, 49, -70, 121, 79, -123, -127, 
        -79, 35, -28, 114, -22, 44, -54, 107, 106, 30, 
        92, 4, -43, -82, -78, -26, -61, 57, 77, 95, 
        58, 69, -76, 103, -56, 78, 26, -92, 48, -32, 
        -52, 16, -67, 51, -50, -73, -29, 52, -60, -118, 
        -1, -80, 63, 2, 124, -36, -65, 8, -33, -115, 
        -3, 108, -21, 18, 110, 36, -51, 46, -103, 94, 
        20, -114, 80, 127, -86, 19, -119, -113, 68, -25, 
        -120, -71, 32, 38, -95, -57, 5, 7, 105, -17, 
        -34, -81, 24, -74, -35, 100, 1, -46, -94, 43, 
        13, 17, -87, 11, -69, -62, -126, -63, -64, -23, 
        -97, 27, -18, -53, 84, 0, -106, -83, 39, 116, 
        91, 104, 14, -24, -42, 34, -88, -84, 62, 61, 
        -2, 112, 23, 119, 73, 6, -122, 55, -99, -41, 
        83, 99, 60, 87, 45, 120, -55, 117, -117, 98, 
        123, -8, 76, -16, -30, 64, -96, -109, -75, 25, 
        101, -110, 86, 50, 71, -12, 74, -100, -116, -68, 
        66, -20, -45, 102, -111, 97
    };

}
если же GameCrypt не используется то шифрование проходит по этим алгоритмам(могу ошибаться)
Клиент
Код:
package com.lameguard.crypt.impl;

import com.lameguard.crypt.LameCrypt;

public class L2C
    implements LameCrypt
{

    public L2C()
    {
        key = new byte[16];
    }

    public void setup(byte key[], byte iv[])
    {
        System.arraycopy(key, 0, this.key, 0, 16);
    }

    public void crypt(byte raw[], int offset, int size)
    {
        int temp = 0;
        int temp2 = 0;
        for(int i = 0; i < size; i++)
        {
            temp2 = raw[offset + i] & 0xff;
            raw[offset + i] = (byte)(temp2 ^ key[i & 0xf] ^ temp);
            temp = temp2;
        }

        int old = key[8] & 0xff;
        old |= key[9] << 8 & 0xff00;
        old |= key[10] << 16 & 0xff0000;
        old |= key[11] << 24 & 0xff000000;
        old += size;
        key[8] = (byte)(old & 0xff);
        key[9] = (byte)(old >> 8 & 0xff);
        key[10] = (byte)(old >> 16 & 0xff);
        key[11] = (byte)(old >> 24 & 0xff);
    }

    private byte key[];
}
...
DzumoHu4 вне форума   Ответить с цитированием
Старый 08.03.2011, 06:18   #3
Пользователь
 
Аватар для DzumoHu4
 
Регистрация: 28.06.2008
Сообщений: 73
Сказал Спасибо: 7
Имеет 24 спасибок в 16 сообщенях
DzumoHu4 пока неопределено
По умолчанию

Сервер
Код:
package com.lameguard.crypt.impl;

import com.lameguard.crypt.LameCrypt;

public class L2S
    implements LameCrypt
{

    public L2S()
    {
        key = new byte[16];
    }

    public void setup(byte key[], byte iv[])
    {
        System.arraycopy(key, 0, this.key, 0, 16);
    }

    public void crypt(byte raw[], int offset, int size)
    {
        int temp = 0;
        for(int i = 0; i < size; i++)
        {
            int temp2 = raw[offset + i] & 0xff;
            temp = temp2 ^ key[i & 0xf] ^ temp;
            raw[offset + i] = (byte)temp;
        }

        int old = key[8] & 0xff;
        old |= key[9] << 8 & 0xff00;
        old |= key[10] << 16 & 0xff0000;
        old |= key[11] << 24 & 0xff000000;
        old += size;
        key[8] = (byte)(old & 0xff);
        key[9] = (byte)(old >> 8 & 0xff);
        key[10] = (byte)(old >> 16 & 0xff);
        key[11] = (byte)(old >> 24 & 0xff);
    }

    private byte key[];
}
Ключи задаются отдельно для Сервера и Клиента;
После этого числовые ключи помещаются в байт массив, которые "расширяются функцией LameCrypt.expandKey.
Дальше затрудняюсь описать так как плохо понимаю яву но предполагаю следующее.
c.setup(ключ.Начальный,Расширенная версия) - клиент
s.setup(ключ.Начальный,Расширенная версия) - сервер
Расшифровка пакетов от клиента выполняется функцией из VMPC()
Код:
 public void crypt(byte raw[], int offset, int size)
    {
        for(int i = 0; i < size; i++)
        {
            s = P[s + P[n & 0xff] & 0xff];
            byte z = P[P[P[s & 0xff] & 0xff] + 1 & 0xff];
            byte temp = P[n & 0xff];
            P[n & 0xff] = P[s & 0xff];
            P[s & 0xff] = temp;
            n = (byte)(n + 1 & 0xff);
            raw[offset + i] = (byte)(raw[offset + i] ^ z);
        }

    }
В которой задается размер, смещение....
Пока все может будут новые мысли.Буду писать сюда.(и вам рекомендую)
Как определить что сервер под защитой LameGuard
l2.bin как процесс клиента
папки на сайте с апдейтером(lame/updater.exe например)
нестандартные порты(хотя тут могут быть варианты)
Каждый пакет отличается от предидущего чуть больше чем полностью.(хотя тут тоже могут быть варианты)
В общем товарищи развиваем

Если вы решили что я написал херню(я яву плохо знаю о чем писал выше) уважайте чувства автора бишь меня, "помягше" как говорил Аркадий Райкин.

Последний раз редактировалось DzumoHu4, 08.03.2011 в 06:23.
DzumoHu4 вне форума   Ответить с цитированием
Старый 08.03.2011, 10:00   #4
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

это всё конечно здорово, но... смена алгоритма, апдейтер качает обновление -> тихюй
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 08.03.2011, 13:31   #5
Местный
 
Регистрация: 27.01.2009
Сообщений: 154
Сказал Спасибо: 23
Имеет 26 спасибок в 19 сообщенях
guplen пока неопределено
По умолчанию

Сейчас на любой сраной фришке стоит эта защита. Ничего сделать нельзя.
supernewbie, довай уже, обходи эту зашиту. Тебя в какойто теме учили это делать
guplen вне форума   Ответить с цитированием
Старый 09.03.2011, 11:14   #6
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

именно эта - только на этих двух

сниферить могу на всех, кроме как раз этих двух, отправлять сложнее :\

Добавлено через 4 минуты
щас разберусь с 411 и 606 и мб примусь за пх клаб

Добавлено через 11 минут
так, нашел где безобразие.. абазнался

Добавлено через 20 часов 38 минут
я понял...
__________________
Начало.

Последний раз редактировалось supernewbie, 09.03.2011 в 11:14. Причина: Добавлено сообщение
supernewbie вне форума   Ответить с цитированием
Старый 10.03.2011, 12:38   #7
Новичок
 
Регистрация: 09.03.2011
Сообщений: 22
Сказал Спасибо: 0
Имеет 3 спасибок в 3 сообщенях
antarius пока неопределено
По умолчанию

тоесть там сначало идет пакет от клиента к серверу потом уже его дешифрует что ли?

Добавлено через 20 часов 8 минут
Понел щас сижу в файле енжине.длл смарю его

Последний раз редактировалось antarius, 10.03.2011 в 12:38. Причина: Добавлено сообщение
antarius вне форума   Ответить с цитированием
Старый 13.03.2011, 02:47   #8
Новичок
 
Регистрация: 13.03.2011
Сообщений: 1
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
Tonigop пока неопределено
По умолчанию

вы все поняли это канеш харашо нооо
яб тоже хател понять напишыте его )))
Tonigop вне форума   Ответить с цитированием
Старый 13.03.2011, 12:31   #9
Пользователь
 
Регистрация: 04.11.2009
Сообщений: 44
Сказал Спасибо: 57
Имеет 3 спасибок в 2 сообщенях
vahes пока неопределено
По умолчанию

поделюсь своими догадками насчет лейма, видимо в шару попали исходники серверной части, а в клиентской научились перепрошивать ип. Потому как "Сейчас на любой сраной фришке стоит эта защита. Ничего сделать нельзя." и алгоритм шифрации на всех этих говно фришках одинаков, и поскольку берут откуда-то со стороны а не покупают у разработчика то обновления никто ставить не будет(имею ввиду эти говнофришки). Когда-то парился и определил что в клиентской части ип куда ломиться зашит в 2 файла GameGuard.des и Lineage2us.ini. Что алгоритм шифрации одинаков определил путем замены пакета KeyInit после которого начинается шифрация. L2.bin - обычный файл клиента, L2.exe - лоадер, который связывает L2.bin, GameGuard.des и Lineage2us.ini, поскольку не особо силен в программировании особенно на яве и ассемблере значимых успехов в обходе(дешифровке) лейма не добился. Так вот если в системс имеются эти 4 файла то 90%, что там лейм. Кстати пока встречал только на эпилогах.
vahes вне форума   Ответить с цитированием
Старый 14.03.2011, 01:02   #10
Новичок
 
Регистрация: 09.03.2011
Сообщений: 22
Сказал Спасибо: 0
Имеет 3 спасибок в 3 сообщенях
antarius пока неопределено
По умолчанию

Цитата:
Сообщение от vahes Посмотреть сообщение
поделюсь своими догадками насчет лейма, видимо в шару попали исходники серверной части, а в клиентской научились перепрошивать ип. Потому как "Сейчас на любой сраной фришке стоит эта защита. Ничего сделать нельзя." и алгоритм шифрации на всех этих говно фришках одинаков, и поскольку берут откуда-то со стороны а не покупают у разработчика то обновления никто ставить не будет(имею ввиду эти говнофришки). Когда-то парился и определил что в клиентской части ип куда ломиться зашит в 2 файла GameGuard.des и Lineage2us.ini. Что алгоритм шифрации одинаков определил путем замены пакета KeyInit после которого начинается шифрация. L2.bin - обычный файл клиента, L2.exe - лоадер, который связывает L2.bin, GameGuard.des и Lineage2us.ini, поскольку не особо силен в программировании особенно на яве и ассемблере значимых успехов в обходе(дешифровке) лейма не добился. Так вот если в системс имеются эти 4 файла то 90%, что там лейм. Кстати пока встречал только на эпилогах.
стоит 10 вмз со стороны купить лейму щас 415 лейма стоит почти везде а 606 там привязка по сайту у них...
что касается перепривязки ещё там завязан dsetup.dll всё зашифровоно Themida если что пробуй....

Добавлено через 8 часов 48 минут
//Важнаая инфа точнее вопрос что такое CRC32

PHP код:
package com.lameguard.utils;

public class 
CRC32
{
  public static final 
int[] table = { 01996959894, -301047508, -17274425021246341371886057615, -379345611, -16375752612492682742044508324, -522852066, -17477894321629419952125561021, -407360249, -18665232474985365481789927666, -205950648, -20679060824505488611843258603, -187386543, -20832896573258839901684777152, -43845254, -19730406603356334871661365465, -99664541, -19288519799970730961281953886, -715111964, -157027905410068881451258607687, -770865667, -15260248539010977221119000684, -608450090, -13969015688530444511172266101, -589951537, -14123506316517679801373503546, -925412992, -10768626985655072531454621731, -809855591, -11955309936712669741594198024, -972236366, -13246194847958355271483230225, -1050600021, -1234817731199414619231158534, -1731059524, -2712493661907459465112637215, -1614814043, -3905402372013776290251722036, -1777751922, -5191372562137656763141376813, -1855689577, -4296959991802195444476864866, -2056965928, -2284584181812370925453092731, -2113342271, -1835160731706088902314042704, -1950435094, -549497641658658271366619977, -1932296973, -699728911303535960984961486, -1547960204, -72592975812561708171037604311, -1529756563, -7408873011131014506879679996, -1385723834, -6311954401141124467855842277, -1442165665, -5863186471342533948654459306, -1106571248, -9219521221466479909544179635, -1184443383, -8324452811591671054702138776, -1328506846, -9421678841504918807783551873, -1212326853, -1061524307, -306674912, -1698712650623170681957810842, -355121351, -1647151185814709971943803523, -480048366, -18053704922252744302053790376, -468791541, -18280612831678167432097651377, -267414716, -20294769105034440721762050814, -144550051, -21408379414265222251852507879, -19653770, -19826493762827536261742555852, -105259153, -19000893513979177631622183637, -690576408, -15801007389537297321340076626, -776247311, -149760629710688283811219638859, -670225446, -13582921489061854621090812512, -547295293, -14695876278293291351181335161, -882789492, -11341324546280854081382605366, -871598187, -11568888295705622331426400815, -977650754, -12962336887332399541555261956, -1026031705, -12446066717524594031541320221, -1687895376, -328994266196992297240735498, -1677130071, -351390145191308787783908371, -1782625662, -4912266042075208622213261112, -1831694693, -4389770112094854071198958881, -2032938284, -2377066861759359992534414190, -2118248755, -1556381811873836001414664567, -2012718362, -157669281711684554285281116, -1889165569, -1277505511634467795376229701, -1609899400, -6869598901308918612956543938, -1486412191, -79900903312316363011047427035, -1362007478, -6402634601088359270936918000, -1447252397, -5581294671202900863817233897, -1111625188, -8937301661404277552615818150, -1160759803, -8415460931423857449601450431, -1285129682, -10002568401567103746711928724, -1274298825, -10225872311510334235755167117 };
  public static final 
int INIT = -1;

  public static final 
int update(int crc32byte[] bytesint startint size)
  {
    for (
int i 0size; ++i)
      
crc32 crc32 >>> table[((crc32 bytes[(start i)]) & 0xFF)];

    return 
crc32;
  }

  public static final 
int done(int crc32)
  {
    return (
crc32 0xFFFFFFFF);
  }


Последний раз редактировалось antarius, 14.03.2011 в 01:02. Причина: Добавлено сообщение
antarius вне форума   Ответить с цитированием
За это сообщение antarius нажился спасибкой от:
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг > Шифрации серверов



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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 22:02.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!