Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Разработка
Войти через OpenID

Разработка Раздел для совместной разработки/доработки программы

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 18.06.2010, 02:50   #1
Новичок
 
Аватар для ecl
 
Регистрация: 15.06.2010
Адрес: Москва
Сообщений: 11
Сказал Спасибо: 9
Имеет 1 спасибку в 1 сообщении
ecl пока неопределено
По умолчанию Решил написать PH на C#.

Начал сегодня этот длинный и нелегкий путь.
Собственно на данный момент имею перехваченые пакеты в виде
масивов byte[].
С дельфи дружиться как то плохо, в плане попыток разобрать исходный код PH.
На данный момент имею несколько вопросов.
1. Что означают первые 2 байта в каждом пакете, я сравнил то что я получаю и то что отображается в PH, в пакет хаке эти 2 байта вообще не отображаются. (Вопрос отпал, это длина пакета)
2.Подскажите как можно попроще освоить синтаксис дельфи для восприятия исходиков PH.(Гугл рулит)
3.Так и не смог найти на форуме описание работы PH в плане шифровки\дешифровки.(анализ дельфийского кода + пример от alexteam на C++) Синтаксис примера arrjj труден для восприятия.

К 3ему вопросу ,насколько я понимаю это функции дешифровки,шифровки и получения ключа для для этого.
Разобраться в этом алгоритме в силу незнания delphi пока не могу, дельфийцы прокоментите пожалуйста код чтобы можно было понять алгоритм работы крипта\декрипа.


Код:
procedure L2Xor.DecryptGP(var Data; var Size: Word); // Прототип процедуры
var //Объявление переменных
  k:integer; //объявление переменной типа Integer
  i,t:byte;  //объявление переменных типа byte
  pck:array[0..$FFFD] of Byte absolute Data; //объявление масива переменных типа Integer длинной $FFFD (65533 байт) и запись в него всего пакета.
begin
  i:=0; //зануление счетчика i
  for k:=0 to size-1 do //начало цикла по k до конца пакета (обработка каждого байта пакета)
    begin 
     t:=pck[k]; //Присваиваем значение текущего байта переменной t
     pck[k]:=t xor GKeyR[k and keyLen] xor i xor IfThen(isAion and(k>0),Byte(KeyConst2[k and 63])); // Текущему байту пакета присваиваем значение этогоже байта отксореного на GKeyR[k and keyLen](байт ключа шифрования под номером (k and keyLen)), ксорим полученый результат на i , далее еще раз ксор если клиет=Aion(Меня Aion не интересует, пишу для себя под интерлюд шифрация стандартная)
     i:=t; //Теперь устанавливаем i равным предыдущему байту, получается ксорим каждый последующий байт на GKeyR и потом еще на предыдущий байт.
    end;
  Inc(PCardinal(@GKeyR[keyLen-7])^,size); // Не используется пристандартной шифрации
  if isAion and(Size>0)then pck[0]:=(pck[0] xor $EE) - $AE; // и нафига это... //эт для айона
end;

// На данный момент не понято:
//GKeyR[k and keyLen] - ответ дан arrjj
//Inc(PCardinal(@GKeyR[keyLen-7])^,size); - не используется при стандартном шифровании

procedure L2Xor.EncryptGP(var Data; var Size: Word);
var
  i:integer;
  k:byte;
  pck:array[0..$FFFD] of Byte absolute Data;
begin
  if isAion and(Size>0)then pck[0]:=(pck[0] + $AE) xor $EE; // и нафига это...
  k:=0;
  for i:=0 to size-1 do begin
    pck[i]:=pck[i] xor GKeyS[i and keyLen] xor k xor IfThen(isAion and(i>0),Byte(KeyConst2[i and 63]));
    k:=pck[i];
  end;
  Inc(PCardinal(@GKeyS[keyLen-7])^,size);
end;
Буду благодарен за любую помощ.

Спасибо.

Последний раз редактировалось ecl, 18.06.2010 в 19:53.
ecl вне форума   Ответить с цитированием
Старый 18.06.2010, 10:27   #2
Новичок
 
Аватар для arrjj
 
Регистрация: 27.05.2010
Сообщений: 26
Сказал Спасибо: 1
Имеет 13 спасибок в 11 сообщенях
arrjj пока неопределено
По умолчанию

В синтаксисе делфи нет ничего сложного. З.Ы. могу кой-какие сорсы на с++ дать.
Цитата:
if isAion and(Size>0)then pck[0]:=(pck[0] + $AE) xor $EE; // и нафига это...
Шоб Аионский трафик норм пакетхаком хавался.

Инит ключа xor
Код:
            switch(inptype)
            {
            case 0x2E://InitCrypt
                {
                    if(!in.readC())
                        QMessageBox::information(NULL, "L2M Alfa:Omg",
                                                 "Wrong protocol version can be troubles :'(");
                    for(int x=0;x<8;x+=1)
                    {
                        inxorkey[x]=in.readC();
                        outxorkey[x]=inxorkey[x];
                    }
                    xorkeyaccepted=true;
                    out.writeC(0x2b);
                    l2m_mstr a;
                    l2m_uch tmp[28];
                    for(int x=0;x<28;x+=1)
                        tmp[x]=0;
                    for(int x=0;x<14;x+=1)
                        tmp[x*2]=ulogin[x];
                    a.fromuch(tmp,28);
                    a.killzero();
                    out.writeS(&a,true);
                    out.writeC(0x00);
                    out.writeD(playOK[1]);
                    out.writeD(playOK[0]);
                    out.writeD(loginOK[0]);
                    out.writeD(loginOK[1]);
                    out.writeD(0);
                    out.writeD(0);
                    out.writeD(0);
                    sendpacket();
                }
                break;
}
Расшифровка
Код:
void l2m_packets::unxorin()
{
    l2m_uch tr=0;
    l2m_uch tr2=0;
    for(int x=0;x<in.buf.length;x+=1)
    {
        tr2=in.buf.str[x];
        in.buf.str[x]=(tr2^inxorkey[x&15])^tr;
        tr=tr2;
    }
    l2m_uint old = inxorkey[8] &0xff;
    old |= (inxorkey[9] << 8) &0xff00;
    old |= (inxorkey[10] << 0x10) &0xff0000;
    old |= (inxorkey[11] << 0x18) &0xff000000;
    old+=in.buf.length;
    inxorkey[8] = old &0xff;
    inxorkey[9] = (old >> 8) &0xff;
    inxorkey[10] = (old >> 0x10) &0xff;
    inxorkey[11] = (old >> 0x18) &0xff;
}
Шифровка
Код:
void l2m_packets::xorout()
{
    l2m_uch tr=0;
    l2m_uch tr2=0;
    for(int x=0;x<out.buf.length;x+=1)
    {
        tr2=out.buf.str[x];
        tr=tr2^outxorkey[x&15]^tr;
        out.buf.str[x]=tr;
    }
    l2m_uint old = outxorkey[8] &0xff;
    old |= (outxorkey[9] << 8) &0xff00;
    old |= (outxorkey[10] << 16) &0xff0000;
    old |= (outxorkey[11] << 24) &0xff000000;
    old+=out.buf.length;
    outxorkey[8] = old &0xff;
    outxorkey[9] = (old >> 8) &0xff;
    outxorkey[10] = (old >> 16) &0xff;
    outxorkey[11] = (old >> 24) &0xff;
}
Имхо маешся фигнёй - зачем делать то что уже есть?
__________________
#define true false//счастливой отладки суки

Последний раз редактировалось arrjj, 18.06.2010 в 10:37.
arrjj вне форума   Ответить с цитированием
За это сообщение arrjj нажился спасибкой от:
Старый 18.06.2010, 12:08   #3
Местный
 
Аватар для Sherman
 
Регистрация: 24.04.2008
Сообщений: 364
Сказал Спасибо: 15
Имеет 116 спасибок в 83 сообщенях
Sherman пока неопределено
По умолчанию

Давно в школе стали преподавать сишарп?
Sherman вне форума   Ответить с цитированием
Старый 18.06.2010, 12:36   #4
Новичок
 
Аватар для ecl
 
Регистрация: 15.06.2010
Адрес: Москва
Сообщений: 11
Сказал Спасибо: 9
Имеет 1 спасибку в 1 сообщении
ecl пока неопределено
По умолчанию

Цитата:
Сообщение от arrjj Посмотреть сообщение
Имхо маешся фигнёй - зачем делать то что уже есть?
Ну во-первых у меня нет желания работать в среде делфи.
Во-вторых интересно понимать весь процесс, а не только его малую часть.

А вообще спасибо, но жду более подробных ответов.
ecl вне форума   Ответить с цитированием
Старый 18.06.2010, 12:40   #5
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

гугл.

с++ Код:
void DecryptGP(char* pck, int Size) {     char i=0,t;     for (int k=0 ; k<Size; k++) {         t=pck[k];         pck[k]=t ^ GKeyR[k & 7] ^ i;         i=t;     }     *(int*)GKeyR+=Size; } void EncryptGP(char* pck, int Size) {     pck[0]^=GKeyS[0];     for (int i=1; i<Size; i++) {         pck[i]^=GKeyS[i & 7] ^ pck[i-1];     }     *(int*)GKeyS+=Size; }
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 18.06.2010 в 12:43.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился спасибкой от:
Старый 18.06.2010, 12:53   #6
Новичок
 
Аватар для arrjj
 
Регистрация: 27.05.2010
Сообщений: 26
Сказал Спасибо: 1
Имеет 13 спасибок в 11 сообщенях
arrjj пока неопределено
По умолчанию

alexteam, это для С4 вроде

Вот хорошая статья, правда тож немного старовата.

Цитата:
Ну во-первых у меня нет желания работать в среде делфи.
Во-вторых интересно понимать весь процесс, а не только его малую часть.
Чтобы понимать процесс не надо читать чужие сорсы. Да и тебя никто не заставляет в делфи работать.
__________________
#define true false//счастливой отладки суки
arrjj вне форума   Ответить с цитированием
За это сообщение arrjj нажился спасибкой от:
Старый 18.06.2010, 12:58   #7
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

ц4 от не ц4 отличается только длинной ключа.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Старый 18.06.2010, 13:03   #8
Новичок
 
Аватар для arrjj
 
Регистрация: 27.05.2010
Сообщений: 26
Сказал Спасибо: 1
Имеет 13 спасибок в 11 сообщенях
arrjj пока неопределено
По умолчанию

alexteam, pck[k]=t ^ GKeyR[k & 7] ^ i; для ил и выше & 15(ключ длиннее) *(int*)GKeyR+=Size; для ил и выше *(int*)(GKeyR+8)+=size; - т.к. ключ меняется в другом месте.
Хотя в принципе ты прав.
__________________
#define true false//счастливой отладки суки
arrjj вне форума   Ответить с цитированием
Старый 18.06.2010, 13:33   #9
Новичок
 
Аватар для ecl
 
Регистрация: 15.06.2010
Адрес: Москва
Сообщений: 11
Сказал Спасибо: 9
Имеет 1 спасибку в 1 сообщении
ecl пока неопределено
По умолчанию

Цитата:
Сообщение от alexteam Посмотреть сообщение
гугл.

с++ Код:
void DecryptGP(char* pck, int Size) {     char i=0,t;     for (int k=0 ; k<Size; k++) {         t=pck[k];         pck[k]=t ^ GKeyR[k & 7] ^ i;         i=t;     }     *(int*)GKeyR+=Size; } void EncryptGP(char* pck, int Size) {     pck[0]^=GKeyS[0];     for (int i=1; i<Size; i++) {         pck[i]^=GKeyS[i & 7] ^ pck[i-1];     }     *(int*)GKeyS+=Size; }
Конечно гугл кудаж мне еще)
Я так туплю потому что C# по своей природе не работает напрямую с указателями.

Наверное по этому в голове каша... Разжуйте пожалуста что это такое

pck[k]=t ^ GKeyR[k & 7] ^ i; // ^это операция ксора а вот что это опять за злополучный GKeyR нигде не объявленый я не догоню

*(int*)GKeyR+=Size; // хз
ecl вне форума   Ответить с цитированием
Старый 18.06.2010, 13:42   #10
Новичок
 
Аватар для arrjj
 
Регистрация: 27.05.2010
Сообщений: 26
Сказал Спасибо: 1
Имеет 13 спасибок в 11 сообщенях
arrjj пока неопределено
По умолчанию

кеи - глобальные переменные типа char * (или char[16] как удобнее), объявляются со старта и равны
outxorkey[8] = 0xc8;
outxorkey[9] = 0x27;
outxorkey[10] = 0x93;
outxorkey[11] = 0x01;
outxorkey[12] = 0xa1;
outxorkey[13] = 0x6c;
outxorkey[14] = 0x31;
outxorkey[15] = 0x97;

Первые 8 байт считываются из пакета InitCrypt

*(int*)GKeyR+=Size; ==

unsigned int old = outxorkey[8] &0xff;
old |= (outxorkey[9] << 8) &0xff00;
old |= (outxorkey[10] << 16) &0xff0000;
old |= (outxorkey[11] << 24) &0xff000000;
old+=out.buf.length;
outxorkey[8] = old &0xff;
outxorkey[9] = (old >> 8) &0xff;
outxorkey[10] = (old >> 16) &0xff;
outxorkey[11] = (old >> 24) &0xff;

Цитата:
Я так туплю потому что C# по своей природе не работает напрямую с указателями.
Я тебе дал пример без указателей.
__________________
#define true false//счастливой отладки суки

Последний раз редактировалось arrjj, 19.06.2010 в 13:17.
arrjj вне форума   Ответить с цитированием
За это сообщение arrjj нажился спасибкой от:
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Разработка



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

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


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

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

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