Сообщений: 466
Тем: 10
Зарегистрирован: Dec 2012
Репутация:
398
Очень полезная програмка! :3
Хотел вот спросить, а как узнать вот эти значения:
Код: @IntConst(1)
public int tag;
public int id;
public int type;
public int category;
@Length(lengthType = LengthType.COMPACT)
public int[] unkIds;
public String name;
public String icon;
public String icon2;
public String desc;
public boolean unkBool;
@Unicode
public String cmd;
Сообщений: 856
Тем: 9
Зарегистрирован: Jul 2011
Репутация:
2,852
А чем ваша задумка отличается, скажем, от PathEditor'a VISTALL'a, кроме формата вывода данных?
Aka Stels
Сообщений: 1,912
Тем: 56
Зарегистрирован: Jan 2009
Репутация:
12,921
GooD Написал:Очень полезная програмка! :3
Хотел вот спросить, а как узнать вот эти значения:
Код: @IntConst(1)
public int tag;
public int id;
public int type;
public int category;
@Length(lengthType = LengthType.COMPACT)
public int[] unkIds;
public String name;
public String icon;
public String icon2;
public String desc;
public boolean unkBool;
@Unicode
public String cmd;
Руками - названия бывает можно узнать с Дампа Engine.dll. Но часто приходится все руками.
Автоматизированую систему разпознания я не видел
Сообщений: 9
Тем: 1
Зарегистрирован: Jun 2013
Было бы удобно редактировать файл weapongrp.dat с помощью вот такого xml вида-представления информации, я просто как раз сейчас хочу создать дуалы, но блин что у меня глаза плывут и все не получается через старый L2FileEditor.. можете сказать чем ваш продукт мог бы мне помочь?
Сообщений: 256
Тем: 13
Зарегистрирован: Jul 2012
Репутация:
285
kpiTik Написал:Было бы удобно редактировать файл weapongrp.dat с помощью вот такого xml вида-представления информации, я просто как раз сейчас хочу создать дуалы, но блин что у меня глаза плывут и все не получается через старый L2FileEditor.. можете сказать чем ваш продукт мог бы мне помочь?
значит глаз не набит на это дело :redlol:
Сообщений: 1,065
Тем: 20
Зарегистрирован: Mar 2010
Репутация:
3,855
да не, в том то и дело что файлы генерируемые обычным l2disasm достаточно неудобны в редактировании - случайно, не заметив, лишний таб где поставишь или удалишь и потом мучайся в попытках понять - где конкретно ошибку сделал...
вот для парсинга данных или автоматических замен данных в этих файлах по определенным критериям наоборот текущий формат достаточно удобен - загрузил в память к примеру в пхп файл в виде двухмерного массива и делай с ним что хочешь.
Сообщений: 466
Тем: 10
Зарегистрирован: Dec 2012
Репутация:
398
VISTALL Написал:Руками - названия бывает можно узнать с Дампа Engine.dll. Но часто приходится все руками.
Автоматизированую систему разпознания я не видел
Открыть спойлер
'?'А можно поподробней на счет руками? Чем читать, где примерно искать) Просто в клиенте мало рылся, в основном только в серверной части)
Сообщений: 227
Тем: 9
Зарегистрирован: Sep 2012
Репутация:
6,791
Доделал крипт(осталось разобраться с 20байтным концом).
Далее кому интересно про крипт.
Гугление привело меня на какой-то азиатский форум, на котором еще в далеком 2005 году было описано почти все шифрование. - Lineage2Ver1** - XOR
111 описан на том форуме, каждый байт xor'ится 0xAC.
C 120 пришлось посидеть какое-то время, там xor key берется последовательно из таблицы.
В 121 xor key равен младшему байту суммы кодов символов имени файла в нижнем регистре.
- Lineage2Ver21* - Blowfish
С ним никаких проблем не возникло, так как в l2j есть готовая реализация алгоритма + на том форуме были выложены ключи.
- Lineage2Ver41* - RSA+ZLIB
Так как Hint выложил алгоритм декодирования, то с этим тоже особых проблем не было, оставалось только найти ключи.
Как оказалось получить ключи - дело пары минут. Если открыть l2encdec в hex-редакторе, то найти их очень просто(если знаешь что ищешь).
6*rsa modulus
6*rsa private exponent
rsa public exponent(l2encdec)
xor 111(?)
blowfish 211
blowfish 212
Сообщений: 1,912
Тем: 56
Зарегистрирован: Jan 2009
Репутация:
12,921
GooD Написал:
Открыть спойлер
'?'А можно поподробней на счет руками? Чем читать, где примерно искать) Просто в клиенте мало рылся, в основном только в серверной части)
Вот например я разбрирал.
https://github.com/VISTALL/l2ce/blob/mas.../Test.java
Сообщений: 406
Тем: 10
Зарегистрирован: Jun 2008
Репутация:
2,862
07-08-2013, 04:03 PM
(Сообщение последний раз редактировалось: 07-08-2013, 05:27 PM Bacek.)
VISTALL Написал:Вот например я разбрирал.
https://github.com/VISTALL/l2ce/blob/mas.../Test.java
Для разбора почти не нужно напрягаться. ( типы данных есть в дампе ).
Наверно мало кто дамп смотрел
тык
PHP код: <?php
v63 = &v41;
v1 = 0;
v62 = 0;
*(_DWORD *)a1 = &off_206421D4;
v43 = a1 + 4;
*(_DWORD *)(a1 + 4) = 0;
*(_DWORD *)(a1 + 8) = 0;
*(_DWORD *)(a1 + 12) = 0;
v64 = 2;
*(_DWORD *)a1 = &off_20642224;
LOBYTE(v64) = 3;
v2 = sub_200A04F0(16);
v43 = v2;
LOBYTE(v64) = 4;
if ( v2 )
{
FString::FString(&v42, L"item_begin");
LOBYTE(v64) = 5;
v1 = 1;
v62 = 1;
v3 = sub_200ACA10(v2, (int)&v42, 99);
}
else
{
v3 = 0;
}
v64 = 6;
v61 = v3;
*(_DWORD *)(a1 + 16) = sub_20106E00(a1 + 4, (int)&v61);
v64 = 3;
if ( v1 & 1 )
{
v1 &= 0xFFFFFFFEu;
v62 = v1;
FString::_FString(&v42);
}
v4 = sub_200A04F0(16);
v43 = v4;
LOBYTE(v64) = 7;
if ( v4 )
{
FString::FString(&v42, L"object_id");
LOBYTE(v64) = 8;
v1 |= 2u;
v62 = v1;
v5 = sub_200ACA10(v4, (int)&v42, 100);
}
else
{
v5 = 0;
}
v64 = 9;
v60 = v5;
*(_DWORD *)(a1 + 20) = sub_20106E00(a1 + 4, (int)&v60);
v64 = 3;
if ( v1 & 2 )
{
v1 &= 0xFFFFFFFDu;
v62 = v1;
FString::_FString(&v42);
}
v6 = sub_200A04F0(16);
v43 = v6;
LOBYTE(v64) = 10;
if ( v6 )
{
FString::FString(&v42, L"pDefense");
LOBYTE(v64) = 11;
v1 |= 4u;
v62 = v1;
v7 = sub_200ACA10(v6, (int)&v42, 102);
}
else
{
v7 = 0;
}
v64 = 12;
v59 = v7;
*(_DWORD *)(a1 + 24) = sub_20106E00(a1 + 4, (int)&v59);
v64 = 3;
if ( v1 & 4 )
{
v1 &= 0xFFFFFFFBu;
v62 = v1;
FString::_FString(&v42);
}
v8 = sub_200A04F0(16);
v43 = v8;
LOBYTE(v64) = 13;
if ( v8 )
{
FString::FString(&v42, L"mDefense");
LOBYTE(v64) = 14;
v1 |= 8u;
v62 = v1;
v9 = sub_200ACA10(v8, (int)&v42, 102);
}
else
{
v9 = 0;
}
v64 = 15;
v58 = v9;
*(_DWORD *)(a1 + 28) = sub_20106E00(a1 + 4, (int)&v58);
v64 = 3;
if ( v1 & 8 )
{
v1 &= 0xFFFFFFF7u;
v62 = v1;
FString::_FString(&v42);
}
v10 = sub_200A04F0(16);
v43 = v10;
LOBYTE(v64) = 16;
if ( v10 )
{
FString::FString(&v42, L"pAttack");
LOBYTE(v64) = 17;
v1 |= 0x10u;
v62 = v1;
v11 = sub_200ACA10(v10, (int)&v42, 102);
}
else
{
v11 = 0;
}
v64 = 18;
v57 = v11;
*(_DWORD *)(a1 + 32) = sub_20106E00(a1 + 4, (int)&v57);
v64 = 3;
Если присмотреться то это и есть сборщик самой датки.
скажем
FString::FString(&v42, L"pAttack");
LOBYTE(v64) = 17;
v1 |= 0x10u;
v62 = v1;
v11 = sub_200ACA10(v10, (int)&v42, 102);
где pAttack параметр 102 тип ( float ).
99 начало строки
100 int
101 конец строки
102 float
115 String
109 цикл
Человек просто обязан ошибаться, раз другие учатся на его ошибках .......
|