Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 04.10.2011, 13:21   #1
Пользователь
 
Регистрация: 08.05.2008
Сообщений: 61
Сказал Спасибо: 0
Имеет 21 спасибок в 12 сообщенях
Hint пока неопределено
По умолчанию Самостоятельное декодирование dat без l2encdec

Скрипт, который декодирует файлы клиента (RSA и gzip). Аналог l2encdec.
В интернете описания алгоритма не нашел, поэтому пришлось разбираться самому (плюс искать ключи). Ставил хуки на gmpz_powm и gmpz_export в libgmp-3, смотрел что передает и получает l2encdec.

Если бы люди не зажимали информацию (тогда, когда это не бьет по карману), то все бы мы тратили намного меньше времени впустую.

О чем я говорю:
http://www.l2wh.com/forum/showthread.php?t=1903
Нельзя было просто скопировать ключи?) Теперь мы должны искать бинарник за 24-01-2008. И речь ведь не о исходниках l2encdec.

PHP код:
<?php

/**
 * L2 file decoder (4 october 2011).
 * @author Hint aka Ilya
 */

function decode($filename$original true)
{
  
$file = @file_get_contents($filename);
  if (!
$file) return false;
  if (
strlen($file) < 28 128) return false;
  
$head mb_convert_encoding(substr($file028), 'UTF-8''UTF-16LE');
  if (
$head != 'Lineage2Ver413') return false;
  
  
$blocks intval((strlen($file) - 28) / 128);
  if (
$blocks 1) return false;
  
  
$size $blocks 128;

  
$file substr($file28$size);
  
  if (
$original)
  {
    
$s base64_decode('l985hHLd9zfvCgzRfo0XLw/vFmGjiorh1ugpvBxuTDz8GSkt2p75AXXkbnOUoYhQtkF9A75u6idNPtHd5bXXvecswKC3HQNghlVjOIF5OgLJpn2e8rRet8CNS+MpCDzkUOaPeGe2dJMU1AUR0JvFdEVRuqhqidw4Ej3BZo/XLYM=');
    
$key gmp_init('0x' bin2hex($s));
    
$exp gmp_init('0x35');
  }
  else
  {
    
$s base64_decode('dbTW3lwBZUQGihrPElhp9D0uCfxVuLHiiVVtr5uHV2NVk0RiiLNlPaHOkch7saXBjxYyNJXFXX1ywIkKg/ab/R/ZQ06xwC8+Rnnt+kMwkxkHASnCZ8hWBNh7tluuIF3jcHrx0hCIgau1Z8Oz0GmuZ8OkxqOqk9JkE9TGYJSuIDk=');
    
$key gmp_init('0x' bin2hex($s));
    
$exp gmp_init('0x1d');
  }
  
  
$data '';
  for (
$i 0$i $blocks; ++$i)
  {
    
$block substr($file$i 128128);
    
$res gmp_powm('0x' bin2hex($block), $exp$key);
    if (!
is_resource($res)) return false;
    
$hex gmp_strval($res16);
    if (
strlen($hex) != 250) return false;
    
$s pack('H*' $hex);
    
    
$size ord($s[0]);
    if (
$size strlen($s) - 1) return false;
    
    if (
$size != 0x7c)
    {
      
$p strlen($s) - $size;
      while (
$p && $s[$p 1] != "\0") --$p;
      
$s substr($s$p$size);
    }
    else
    {
      
$s substr($s, -$size);
    }    
    
$data .= $s;
  }

  
$a unpack('L'$data);
  if (!
is_array($a) || !isset($a[1])) return false;
  
  
$size intval($a[1]);
  
$data substr($data4);
  
$result gzuncompress($data);
  if (
strlen($result) != $size) return false;
  
  return 
$result;
}

// Example
$s decode('l2.ini'true);
if (
$s === false) die('Error!');
file_put_contents('dec-l2.ini'$s);
?>

Последний раз редактировалось Hint, 04.10.2011 в 13:22. Причина: Добавлено сообщение
Hint вне форума   Ответить с цитированием
За это сообщение Hint нажился 2 спасибками от:
Старый 04.10.2011, 15:23   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Hint, ну тыб тут спросил, я бы выложил сорци своего недоделанного аналога l2encdec, и кстати для его написания мне публично доступной инфы из инета вполне хватило

вот мой модуль для шифрования:
delphi Код:
unit l2CryptRSA; interface procedure DecodeRSA(var data; const size: Integer); procedure EncodeRSA(var data; const size: Integer); function DecryptStr413(const data: string): string; implementation uses   ZLibEx; const   bufLen = 128; type   mpz_t = record     mp_alloc,     mp_size: Integer;     mp_d:    Pointer;   end;   TRSABlocks = array[0..0] of array[1..bufLen] of Byte; const   //priv. exponent (d)   priv_key: array[0..127] of Char =       #$65#$DE#$C1#$81#$50#$95#$1E#$C9#$3E#$22#$DB#$C7#$16#$B8#$2D#$6F+       #$FC#$E2#$46#$F7#$53#$85#$A2#$5C#$FE#$5D#$AD#$18#$76#$95#$A1#$31+       #$B6#$C1#$93#$D4#$CB#$62#$15#$8C#$9A#$DA#$6D#$3A#$25#$A7#$43#$4E+       #$F0#$C2#$14#$1C#$3D#$FE#$C6#$63#$82#$1F#$54#$AE#$D9#$43#$10#$83+       #$4D#$B3#$77#$0A#$E1#$2F#$35#$D7#$9D#$90#$F0#$72#$F2#$0B#$DD#$4C+       #$12#$5F#$1D#$9D#$64#$D2#$43#$66#$B8#$32#$7F#$A2#$FC#$F8#$07#$6A+       #$4C#$50#$5B#$40#$C4#$E6#$D3#$38#$78#$1D#$29#$00#$E4#$76#$97#$71+       #$1E#$84#$8E#$3C#$06#$75#$5C#$14#$86#$70#$D4#$98#$D7#$C2#$B4#$30;   e: mpz_t = (mp_alloc: 32; mp_size: 32; mp_d: @priv_key[0]);   //modulo (n)   modulo: array[0..127] of Char =       #$39#$20#$AE#$94#$60#$C6#$D4#$13#$64#$D2#$93#$AA#$A3#$C6#$A4#$C3+       #$67#$AE#$69#$D0#$B3#$C3#$67#$B5#$AB#$81#$88#$10#$D2#$F1#$7A#$70+       #$E3#$5D#$20#$AE#$5B#$B6#$7B#$D8#$04#$56#$C8#$67#$C2#$29#$01#$07+       #$19#$93#$30#$43#$FA#$ED#$79#$46#$3E#$2F#$C0#$B1#$4E#$43#$D9#$1F+       #$FD#$9B#$F6#$83#$0A#$89#$C0#$72#$7D#$5D#$C5#$95#$34#$32#$16#$8F+       #$C1#$A5#$B1#$7B#$C8#$91#$CE#$A1#$3D#$65#$B3#$88#$62#$44#$93#$55+       #$63#$57#$87#$9B#$AF#$6D#$55#$89#$E2#$B1#$B8#$55#$FC#$09#$2E#$3D+       #$F4#$69#$58#$12#$CF#$1A#$8A#$06#$44#$65#$01#$5C#$DE#$D6#$B4#$75;   m: mpz_t = (mp_alloc: 32; mp_size: 32; mp_d: @modulo[0]);   //pub. exponent (e)   pub_key = $1d;   gmpdll = 'libgmp-3.dll'; procedure mpz_init(var Dest: mpz_t); cdecl;   external gmpdll name '__gmpz_init'; procedure mpz_clear(var Dest: mpz_t); cdecl;   external gmpdll name '__gmpz_clear'; procedure mpz_powm(var Dest: mpz_t; const Base, Exponent, Modulus: mpz_t); cdecl;   external gmpdll name '__gmpz_powm'; procedure mpz_powm_ui(var Dest: mpz_t; var Base: mpz_t; Exponent: Cardinal;   const Modulus: mpz_t); cdecl;   external gmpdll name '__gmpz_powm_ui'; procedure mpz_import(var rop: mpz_t; count, order, size, endian,   nails: Cardinal; const op); cdecl;   external gmpdll name '__gmpz_import'; procedure mpz_export(var rop, count; order, size, endian,   nails: Cardinal; const op: mpz_t); cdecl;   external gmpdll name '__gmpz_export'; var   r,d: mpz_t; procedure RSA_BlockDec(var data); var   count: Cardinal; begin   mpz_import(d,bufLen,1,1,0,0,data);   mpz_powm_ui(r,d,$1d,m);   count:=32;   mpz_export(data,count,1,4,1,0,r); end; procedure RSA_BlockEnc(var data); var   count: Cardinal; begin   mpz_import(d,bufLen,1,1,0,0,data);   mpz_powm(r,d,e,m);   count:=32;   mpz_export(data,count,1,4,1,0,r); end; procedure DecodeRSA(var data; const size: Integer); var   i: Integer;   dt: TRSABlocks absolute data; begin   for i:=0 to size div bufLen - 1 do RSA_BlockDec(dt[i]); end; procedure EncodeRSA(var data; const size: Integer); var   i: Integer;   dt: TRSABlocks absolute data; begin   for i:=0 to size div bufLen - 1 do RSA_BlockEnc(dt[i]); end; function UnPack(const data; const size: Integer): string; var   i,k: Integer;   dt: TRSABlocks absolute data; begin   Result:='';   for i:=0 to size div bufLen - 1 do begin     k:=Length(Result);     SetLength(Result,k+dt[i][3]);     Move(dt[i][(128-dt[i][3])and $7C],Result[k+1],dt[i][3]);   end; end; function Pack(const data: string): string; var   i,k: Integer; begin  { TODO : create Pack function } end; function Decompress(const data: string): string; begin   Result:=ZDecompressStr(data); end; function DecryptStr413(const data: string): string; begin   Result:=data;   DecodeRSA(Result[1],Length(Result));   Result:=Copy(UnPack(Result[1],Length(Result)),5,Length(Result));   Result:=Decompress(Result); end; initialization   mpz_init(d);   mpz_init(r); finalization   mpz_clear(d);   mpz_clear(r); end.

Добавлено через 3 минуты
Цитата:
Сообщение от xkor Посмотреть сообщение
и кстати для его написания мне публично доступной инфы из инета вполне хватило
а хотя не, вру, ключи я извлекал из l2encdec запустив на отладку через ollydbg
__________________
Я здесь практически не появляюсь!, Skype - ikskor

Последний раз редактировалось xkor, 04.10.2011 в 15:23. Причина: Добавлено сообщение
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился 2 спасибками от:
Старый 04.10.2011, 15:44   #3
Пользователь
 
Регистрация: 08.05.2008
Сообщений: 61
Сказал Спасибо: 0
Имеет 21 спасибок в 12 сообщенях
Hint пока неопределено
По умолчанию

Зато теперь есть общедоступная реализация на php и delphi :)

В интернете подробной информации нет. Про RSA понятно по l2encdec (вывод процесса распаковки). Сжатие - логично, потому что размер файла меньше (плюс DStuff написал про использование zlib у себя в USAGE). То, что сначала сжимают, а потом шифруют через RSA - тоже понятно (иначе бы ничего не сжималось :) Заголовок и CRC видно в hex-редакторе (размер остального кратен 128, что намекает на RSA и размер ключа и блоков).
Так что единственное темное пятно - ключи, а вот их нигде нет :)

Кстати, твой вариант не всегда будет работать, потому что в последнем блоке, который неполный, данные могут быть смещены (не знаю почему и зачем). Из-за этого пришлось добавить костыль:
PHP код:
    if ($size != 0x7c
    { 
      
$p strlen($s) - $size
      while (
$p && $s[$p 1] != "\0") --$p
      
$s substr($s$p$size); 
    } 
    else 
    { 
      
$s substr($s, -$size); 
    } 
Добавлено через 3 минуты
Честно говоря, копался в этом больше из-за любопытства, а не по необходимости. Началось с разбора нового 'itemname-*.dat' (l2disasm уже не помогает, поэтому пришлось писать свою программу), а потом захотелось разобраться и с l2encdec.

Последний раз редактировалось Hint, 04.10.2011 в 15:46. Причина: Добавлено сообщение
Hint вне форума   Ответить с цитированием
Старый 04.10.2011, 23:16   #4
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Цитата:
Сообщение от Hint Посмотреть сообщение
Кстати, твой вариант не всегда будет работать, потому что в последнем блоке, который неполный, данные могут быть смещены (не знаю почему и зачем). Из-за этого пришлось добавить костыль:
я уже плохо помню (писал тот код года два назад), но по моему функция UnPack эту проблему решает
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 05.10.2011, 00:02   #5
Местный
 
Аватар для Pinko
 
Регистрация: 31.05.2011
Сообщений: 130
Сказал Спасибо: 287
Имеет 23 спасибок в 22 сообщенях
Pinko пока неопределено
По умолчанию

ребята давайте жить дружно !!!!!!!!!!!
сделайте прогу
мне надо для декодирование dat
спасибо !
Pinko вне форума   Ответить с цитированием
Старый 05.10.2011, 09:48   #6
Местный
 
Аватар для goodvin1709
 
Регистрация: 13.02.2011
Сообщений: 506
Сказал Спасибо: 121
Имеет 100 спасибок в 83 сообщенях
goodvin1709 пока неопределено
По умолчанию

Pinko, тебе же дали модули сунь их в Delphi 7 и делай декодирование Но по исходкинку вроде 413 кодировки?
__________________
---------------------------__--------__-----
---____- ___--____--- ___/'- /__ ___-(__)-____
--/-___-/-__-\/-__--\ /-__--'/--|-/--//---//--__--\
-/-/_/ -/-/_/--/-/_/--/-/_/--/|--|/--'//---//--/-/--/
-\___-/\____/\____/\____/-|____//__'//_'/-/__/
/_-__/

Последний раз редактировалось goodvin1709, 05.10.2011 в 09:51.
goodvin1709 вне форума   Ответить с цитированием
Старый 05.10.2011, 10:43   #7
Местный
 
Аватар для Pinko
 
Регистрация: 31.05.2011
Сообщений: 130
Сказал Спасибо: 287
Имеет 23 спасибок в 22 сообщенях
Pinko пока неопределено
По умолчанию

goodvin1709,
НЕ УМЕЮ !!!
Pinko вне форума   Ответить с цитированием
Старый 05.10.2011, 17:42   #8
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию

Цитата:
Сообщение от Pinko Посмотреть сообщение
ребята давайте жить дружно !!!!!!!!!!!
сделайте прогу
мне надо для декодирование dat
спасибо !
НАДО !!!!!!!!!!!!!!!!!
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
TAMBIK вне форума   Ответить с цитированием
Старый 28.10.2011, 11:12   #9
Пользователь
 
Аватар для Be3geBJIa3
 
Регистрация: 23.01.2008
Сообщений: 93
Сказал Спасибо: 31
Имеет 65 спасибок в 23 сообщенях
Be3geBJIa3 пока неопределено
По умолчанию

Пишу редактор файлов (dat,ini,int,thm) для новых хроник пока еще нет правильных ddf структур файлов, приходится разбирать в ручную. Может у кого есть чем поделиться и объединить усилия, так как много времени уходит на это.
Разбираю ItemName-ru.dat, и так понимаю аналогов функций в ddf нету.
Be3geBJIa3 вне форума   Ответить с цитированием
Старый 28.10.2011, 14:17   #10
Пользователь
 
Регистрация: 08.05.2008
Сообщений: 61
Сказал Спасибо: 0
Имеет 21 спасибок в 12 сообщенях
Hint пока неопределено
По умолчанию

Цитата:
Сообщение от Be3geBJIa3 Посмотреть сообщение
Пишу редактор файлов (dat,ini,int,thm) для новых хроник пока еще нет правильных ddf структур файлов, приходится разбирать в ручную. Может у кого есть чем поделиться и объединить усилия, так как много времени уходит на это.
Разбираю ItemName-ru.dat, и так понимаю аналогов функций в ddf нету.
Да, l2disasm устарел. Можно обойтись ENBBY, но это ужасные костыли (и не работает, если число элементов в массиве увеличивается). Нужные новые сложные элементы, похожие на MAT, MTX. Да и вообще, таблица (текстовый файл с табуляциями) уже не подходит, нужен вывод в более сложном формате (например, xml). Лично я, когда начала работать с GoD, написал свой l2disasm и не жалею.

Ущербный DDF для ItemName, который на некоторых файлах работать не будет, если в них встречаются длинные многомерные массивы (не работал на PTS клиенте L2.ru из-за того, что в "кривом" описании одного предмета был массив из 50+ элементов):
Код:
FS = "\t"; 
HEADER = 1; 
RECCNT = OFF; 
MTXCNT_OUT = 1; 
MATCNT_OUT = 1; 
ORD_IGNORE = 0; 
{ 
   UINT id;
   UNICODE name; 
   UNICODE add_name; 
   ASCF description; 
   INT popup;
   UINT supercnt0;
   UINT count_1;ENBBY = [(supercnt0:-1,1)];ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UINT item_list_1[count_1];ENBBY = [(supercnt0:-1,1)];ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UINT count_2;ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UCHAR item_list_2[count_2];ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UCHAR item_list_2[count_2];ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UCHAR item_list_2[count_2];ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UCHAR item_list_2[count_2];ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UINT count_3;ENBBY = [(supercnt0:-1,3)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UINT item_list_3[count_3];ENBBY = [(supercnt0:-1,3)];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UINT count_4;ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UINT item_list_4[count_4];ENBBY = [(supercnt0:-4,4)];ENBBY = [(supercnt0:-8,8)];
   UINT count_5;ENBBY = [(supercnt0:-1,5)];ENBBY = [(supercnt0:-2,6)];ENBBY = [(supercnt0:-8,8)];
   UINT item_list_5[count_5];ENBBY = [(supercnt0:-1,5)];ENBBY = [(supercnt0:-2,6)];ENBBY = [(supercnt0:-8,8)];
   UINT count_6;ENBBY = [(supercnt0:-2,6)];ENBBY = [(supercnt0:-8,8)];
   UINT item_list_6[count_6];ENBBY = [(supercnt0:-2,6)];ENBBY = [(supercnt0:-8,8)];
   UINT count_7;ENBBY = [(supercnt0:-1,7)];ENBBY = [(supercnt0:-8,8)];
   UINT item_list_7[count_7];ENBBY = [(supercnt0:-1,7)];ENBBY = [(supercnt0:-8,8)];
   UINT count_8;ENBBY = [(supercnt0:-8,8)];
   UINT item_list_8[count_8];ENBBY = [(supercnt0:-8,8)];
   UINT count_9;ENBBY = [(supercnt0:-1,9)];ENBBY = [(supercnt0:-6,10)];ENBBY = [(supercnt0:-4,12)];
   UINT item_list_9[count_9];ENBBY = [(supercnt0:-1,9)];ENBBY = [(supercnt0:-6,10)];ENBBY = [(supercnt0:-4,12)];
   UINT count_10;ENBBY = [(supercnt0:-6,10)];ENBBY = [(supercnt0:-4,12)];
   UINT item_list_10[count_10];ENBBY = [(supercnt0:-6,10)];ENBBY = [(supercnt0:-4,12)];
   UINT cnt0;
   UCHAR cnt0_empty;ENBBY = [(cnt0,0)];
   ASCF set_bonus_desc[cnt0];
   UINT supercnt1;
   UINT extra_count;ENBBY = [(supercnt1:-1,1)];
   UINT extra_item_list[extra_count];ENBBY = [(supercnt1:-1,1)];
   UINT cnt1;
   ASCF set_extra_desc;
   FILLER unk1{6};
   UCHAR unk2;ENBBY = [(cnt0:-1,1)];ENBBY = [(supercnt0:-1,1)];ENBBY = [(supercnt0:-2,2)];ENBBY = [(supercnt0:-4,4)];
   UCHAR unk3;ENBBY = [(cnt1:-1,1)];ENBBY = [(supercnt1:-1,1)];ENBBY = [(supercnt1:-2,2)];ENBBY = [(supercnt1:-4,4)];
   UINT special_enchant_amount;
   ASCF special_enchant_desc;
   UINT unk4; 
}
Hint вне форума   Ответить с цитированием
За это сообщение Hint нажился 2 спасибками от:
Ответ

  CoderX :: Forums > Основные форумы > Программинг



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

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


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

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

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