Вернуться   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:36   #3
Новичок
 
Аватар для ecl
 
Регистрация: 15.06.2010
Адрес: Москва
Сообщений: 11
Сказал Спасибо: 9
Имеет 1 спасибку в 1 сообщении
ecl пока неопределено
По умолчанию

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

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

00 01 66 14 00 00 0A 7D 00 00 C8 27 93 01 A1 6C 31 97 01 00 00 00 01 00 00 00 это инит ключ отловленый пакетхаком

Расшифровка его
Tèï: 0x00 (KeyInit)
Pàçìåð: 26+2
Âðåìÿ ïðèõîäà: 12:46:02:465
0002 c 01: 1 (0x01)
0003 q Key: 137481903150182
000B d d: 26421192 (0x019327C8)

не понятно почему в твоем коде обрабатывается case 0x2E:

Если не трудно прокометни пожалуйста свой код русским языком что деается и зачем

P.S. ушел читать про протокол L2 thx.

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

Давно в школе стали преподавать сишарп?
Sherman вне форума   Ответить с цитированием
Старый 18.06.2010, 12:40   #6
Рыцарь
 
Аватар для 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   #7
Новичок
 
Аватар для arrjj
 
Регистрация: 27.05.2010
Сообщений: 26
Сказал Спасибо: 1
Имеет 13 спасибок в 11 сообщенях
arrjj пока неопределено
По умолчанию

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

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

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

ц4 от не ц4 отличается только длинной ключа.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Старый 18.06.2010, 13:03   #10
Новичок
 
Аватар для 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 вне форума   Ответить с цитированием
Ответ

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



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

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


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

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

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