Давно меня здесь не было, но как видите столкнулся с сервером на котором применяется данный вид защиты.
Внимание все изложенное ниже мои догадки, это не значит что все на самом деле происходит так как я описал.
Начнем с того что я решил напомнить себе про 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 а именно из этого фрагмента
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.
поделюсь своими догадками насчет лейма, видимо в шару попали исходники серверной части, а в клиентской научились перепрошивать ип. Потому как "Сейчас на любой сраной фришке стоит эта защита. Ничего сделать нельзя." и алгоритм шифрации на всех этих говно фришках одинаков, и поскольку берут откуда-то со стороны а не покупают у разработчика то обновления никто ставить не будет(имею ввиду эти говнофришки). Когда-то парился и определил что в клиентской части ип куда ломиться зашит в 2 файла GameGuard.des и Lineage2us.ini. Что алгоритм шифрации одинаков определил путем замены пакета KeyInit после которого начинается шифрация. L2.bin - обычный файл клиента, L2.exe - лоадер, который связывает L2.bin, GameGuard.des и Lineage2us.ini, поскольку не особо силен в программировании особенно на яве и ассемблере значимых успехов в обходе(дешифровке) лейма не добился. Так вот если в системс имеются эти 4 файла то 90%, что там лейм. Кстати пока встречал только на эпилогах.
поделюсь своими догадками насчет лейма, видимо в шару попали исходники серверной части, а в клиентской научились перепрошивать ип. Потому как "Сейчас на любой сраной фришке стоит эта защита. Ничего сделать нельзя." и алгоритм шифрации на всех этих говно фришках одинаков, и поскольку берут откуда-то со стороны а не покупают у разработчика то обновления никто ставить не будет(имею ввиду эти говнофришки). Когда-то парился и определил что в клиентской части ип куда ломиться зашит в 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
public static final int update(int crc32, byte[] bytes, int start, int size)
{
for (int i = 0; i < size; ++i)
crc32 = crc32 >>> 8 ^ table[((crc32 ^ bytes[(start + i)]) & 0xFF)];
return crc32;
}
public static final int done(int crc32)
{
return (crc32 ^ 0xFFFFFFFF);
}
}
Последний раз редактировалось antarius, 14.03.2011 в 01:02.
Причина: Добавлено сообщение