PDA

Просмотр полной версии : l2phx & kamael


PRO
18.01.2008, 20:02
Будет ли совместимость? Там видимо поменялся алгоритм шифрования пакетов.. Может кто уже сделал newxor.dll для камаэль?) Поделитесь пожалуйста)

PRO
21.01.2008, 19:11
Сравнение сырцов интерлюд и камаэль ява-серверов показал что ключ и алгоритм шифрования не менялись)

http://www.l2jserver.com/svn/branches/L ... eygen.java (http://www.l2jserver.com/svn/branches/L2_GameServer_it/java/net/sf/l2j/gameserver/network/BlowFishKeygen.java)
http://www.l2jserver.com/svn/trunk/L2_G ... eygen.java (http://www.l2jserver.com/svn/trunk/L2_GameServer_T1/java/net/sf/l2j/gameserver/network/BlowFishKeygen.java)

Может, баг в самом пакетхаке?

xkor
21.01.2008, 23:51
Сравнение сырцов интерлюд и камаэль ява-серверов показал что ключ и алгоритм шифрования не менялись)

http://www.l2jserver.com/svn/branches/L (http://www.l2jserver.com/svn/branches/L) ... eygen.java
http://www.l2jserver.com/svn/trunk/L2_G (http://www.l2jserver.com/svn/trunk/L2_G) ... eygen.java

Может, баг в самом пакетхаке?
вопрос на засыпку, а нафиг ты сравнивал алгоритмы блоуфиша который тока на логин сервере используется?)
ЗЫ а проблема возможно в длинне пакета с ключём, но думаю всётаки немного они алгоритм сменили...

Добавлено спустя 13 минут 51 секунду:
такс, глянул счас лог камаэля, шифровачка том собсно старая, НО похоже что ID пакетов изменены %)

Добавлено спустя 14 минут 14 секунд:
сорци явы подтвердили изменение Id некоторых пакетов

22.01.2008, 00:56
А CryptInit в шифруется чем то?
т.к. у меня в камаэлях крипт инит приходит
00 01 02 03 04 05 06 07
15 00 2E 01 03 AB 8E 12 05 13 B6 18 01 00 00 00 09 00 00 00 00
15 00 2E 01 84 89 E9 35 21 9E 92 4E 01 00 00 00 09 00 00 00 00
15 00 2E 01 56 F0 6B FC DC 40 07 B9 01 00 00 00 09 00 00 00 00
00 01 02 03 04 05 06 07 08 09 0a 0b
т.е. судя по виду не зашифровано и ключ с 5го по 12й байт?

xkor
22.01.2008, 02:38
вобщем выложел пакетхак с поддержкой камаеля), тестируйте...

15.02.2008, 23:14
2 xkor
вот кусок декомпиленого кода из l2j kamael

пакет RequestBuyItem
private static final String m_C__1F_REQUESTBUYITEM = "[C] 1F RequestBuyItem";

в каком месте тут ИД изменен?

16.02.2008, 04:42
А в каком месте тут вообще ИД? Это строка для отображения в лог, можно написать:
private static final String m_C__1F_REQUESTBUYITEM ='Васек купил картошку', и ИДшник от этого не изменицца :D

xkor
16.02.2008, 12:29
во во, ид смотри в начале функции writeImpl, например вот protected final void writeImpl()
{
writeC(0x01);

writeD(_objectId);
...тут ИД - 01

16.02.2008, 23:42
чуваки, я походу совсем ниче не вижу, ткните меня носом где тут ИД пакета записан?
кстати l2phx, присваивает этому пакету ИД= 40.


package net.sf.l2j.gameserver.clientpackets;

import java.nio.ByteBuffer;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.TradeController;
import net.sf.l2j.gameserver.cache.HtmCache;
import net.sf.l2j.gameserver.datatables.ItemTable;
import net.sf.l2j.gameserver.datatables.MerchantPriceConf igTable;
import net.sf.l2j.gameserver.model.L2TradeList;
import net.sf.l2j.gameserver.model.PcInventory;
import net.sf.l2j.gameserver.model.actor.instance.*;
import net.sf.l2j.gameserver.model.entity.Castle;
import net.sf.l2j.gameserver.network.L2GameClient;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.serverpackets.*;
import net.sf.l2j.gameserver.templates.L2Item;
import net.sf.l2j.gameserver.util.Util;

// Referenced classes of package net.sf.l2j.gameserver.clientpackets:
// L2GameClientPacket

public final class RequestBuyItem extends L2GameClientPacket
{

private static final String m_C__1F_REQUESTBUYITEM = "[C] 1F RequestBuyItem";
private static Logger m_log = Logger._getLoggerStringLogger(net/sf/l2j/gameserver/clientpackets/RequestBuyItem.getName());
private int m_listId;
private int m_count;
private int m_items[];

public RequestBuyItem()
{
}

protected void _readImplvV()
{
m_listId = _readDvI();
m_count = _readDvI();
if(m_count * 2 < 0 || m_count * 8 > m_buf._remainingvI() || m_count > Config.m_MAX_ITEM_IN_PACKETI)
m_count = 0;
m_items = new int[m_count * 2];
for(int i = 0; i < m_count; i++)
{
int itemId = _readDvI();
m_items[i * 2 + 0] = itemId;
long cnt = _readDvI();
if(cnt > 0x7fffffffL || cnt < 0L)
{
m_count = 0;
m_items = null;
return;
}
m_items[i * 2 + 1] = (int)cnt;
}

}

protected void _runImplvV()
{
L2PcInstance player = ((L2GameClient)_getClientvMMOClient())._getActiveC harvL2PcInstance();
if(player == null)
return;
if(!Config.m_ALT_GAME_KARMA_PLAYER_CAN_SHOPZ && player._getKarmavI() > 0)
return;
net.sf.l2j.gameserver.model.L2Object target = player._getTargetvL2Object();
if(!player._isGMvZ() && (target == null || !(target instanceof L2MerchantInstance) && !(target instanceof L2FishermanInstance) && !(target instanceof L2MercManagerInstance) && !(target instanceof L2ClanHallManagerInstance) && !(target instanceof L2CastleChamberlainInstance) || !player._isInsideRadiusL2ObjectZZZ(target, 150, false, false)))
return;
boolean ok = true;
String htmlFolder = "";
if(target != null)
{
if(target instanceof L2FishermanInstance)
htmlFolder = "fisherman";
else
if(target instanceof L2MerchantInstance)
htmlFolder = "merchant";
else
ok = false;
} else
{
ok = false;
}
L2MerchantInstance merchant = null;
if(ok)
merchant = (L2MerchantInstance)target;
else
if(!ok && !player._isGMvZ())
{
player._sendMessageStringV("Invalid Target: Seller must be targetted");
return;
}
L2TradeList list = null;
if(merchant != null)
{
List lists = TradeController.getInstance()._getBuyListByNpcIdIL ist(merchant._getNpcIdvI());
if(!player._isGMvZ())
{
if(lists == null)
{
Util._handleIllegalPlayerActionL2PcInstanceV(playe r, (new StringBuilder()).append("Warning!! Character ").append(player.getName()).append(" of account ").append(player._getAccountNamevString()).append (" sent a false BuyList list_id.").toString(), Config.m_DEFAULT_PUNISHI);
return;
}
Iterator i$ = lists._iteratorvIterator();
do
{
if(!i$._hasNextvZ())
break;
L2TradeList tradeList = (L2TradeList)i$._nextvObject();
if(tradeList._getListIdvI() == m_listId)
list = tradeList;
} while(true);
} else
{
list = TradeController.getInstance()._getBuyListIL2TradeL ist(m_listId);
}
} else
{
list = TradeController.getInstance()._getBuyListIL2TradeL ist(m_listId);
}
if(list == null)
{
Util._handleIllegalPlayerActionL2PcInstanceV(playe r, (new StringBuilder()).append("Warning!! Character ").append(player.getName()).append(" of account ").append(player._getAccountNamevString()).append (" sent a false BuyList list_id.").toString(), Config.m_DEFAULT_PUNISHI);
return;
}
m_listId = list._getListIdvI();
if(m_count < 1)
{
_sendPacketL2GameServerPacketV(new ActionFailed());
return;
}
double castleTaxRate = 0.0D;
double baseTaxRate = 0.0D;
if(merchant != null)
{
castleTaxRate = merchant._getMpcvMerchantPriceConfigTable$Merchant PriceConfig()._getCastleTaxRatevD();
baseTaxRate = merchant._getMpcvMerchantPriceConfigTable$Merchant PriceConfig()._getBaseTaxRatevD();
}
long subTotal = 0L;
int castleTax = 0;
int baseTax = 0;
long slots = 0L;
long weight = 0L;
for(int i = 0; i < m_count; i++)
{
int itemId = m_items[i * 2 + 0];
int count = m_items[i * 2 + 1];
int price = -1;
net.sf.l2j.gameserver.model.L2TradeList.L2TradeIte m tradeItem = list._getItemByIdIL2TradeList$L2TradeItem(itemId);
if(tradeItem == null)
{
Util._handleIllegalPlayerActionL2PcInstanceV(playe r, (new StringBuilder()).append("Warning!! Character ").append(player.getName()).append(" of account ").append(player._getAccountNamevString()).append (" sent a false BuyList list_id.").toString(), Config.m_DEFAULT_PUNISHI);
return;
}
L2Item template = ItemTable.getInstance()._getTemplateIL2Item(itemId );
if(template == null)
continue;
if(count > 0x7fffffff || !template._isStackablevZ() && count > 1)
{
Util._handleIllegalPlayerActionL2PcInstanceV(playe r, (new StringBuilder()).append("Warning!! Character ").append(player.getName()).append(" of account ").append(player._getAccountNamevString()).append (" tried to purchase invalid quantity of items at the same time.").toString(), Config.m_DEFAULT_PUNISHI);
SystemMessage sm = new SystemMessage(SystemMessageId.m_YOU_HAVE_EXCEEDED_ QUANTITY_THAT_CAN_BE_INPUTTEDSystemMessageId);
_sendPacketL2GameServerPacketV(sm);
sm = null;
return;
}
price = list._getPriceForItemIdII(itemId);
if(itemId >= 3960 && itemId <= 4026)
price = (int)((float)price * Config.m_RATE_SIEGE_GUARDS_PRICEF);
if(price < 0)
{
m_log._warningStringV("ERROR, no price found .. wrong buylist ??");
_sendPacketL2GameServerPacketV(new ActionFailed());
return;
}
if(price == 0 && !player._isGMvZ() && Config.m_ONLY_GM_ITEMS_FREEZ)
{
player._sendMessageStringV("Ohh Cheat dont work? You have a problem now!");
Util._handleIllegalPlayerActionL2PcInstanceV(playe r, (new StringBuilder()).append("Warning!! Character ").append(player.getName()).append(" of account ").append(player._getAccountNamevString()).append (" tried buy item for 0 adena.").toString(), Config.m_DEFAULT_PUNISHI);
return;
}
if(tradeItem._hasLimitedStockvZ() && count > tradeItem._getCurrentCountvI())
return;
subTotal += (long)count * (long)price;
castleTax = (int)((double)subTotal * castleTaxRate);
baseTax = (int)((double)subTotal * baseTaxRate);
if(subTotal + (long)castleTax + (long)baseTax > 0x7fffffffL)
{
Util._handleIllegalPlayerActionL2PcInstanceV(playe r, (new StringBuilder()).append("Warning!! Character ").append(player.getName()).append(" of account ").append(player._getAccountNamevString()).append (" tried to purchase over ").append(0x7fffffff).append(" adena worth of goods.").toString(), Config.m_DEFAULT_PUNISHI);
return;
}
weight += (long)count * (long)template._getWeightvI();
if(!template._isStackablevZ())
{
slots += count;
continue;
}
if(player._getInventoryvPcInventory()._getItemByIt emIdIL2ItemInstance(itemId) == null)
slots++;
}

if(weight > 0x7fffffffL || weight < 0L || !player._getInventoryvPcInventory()._validateWeigh tIZ((int)weight))
{
_sendPacketL2GameServerPacketV(new SystemMessage(SystemMessageId.m_WEIGHT_LIMIT_EXCEE DEDSystemMessageId));
return;
}
if(slots > 0x7fffffffL || slots < 0L || !player._getInventoryvPcInventory()._validateCapac ityIZ((int)slots))
{
_sendPacketL2GameServerPacketV(new SystemMessage(SystemMessageId.m_SLOTS_FULLSystemMe ssageId));
return;
}
if(subTotal < 0L || !player._reduceAdenaStringL2ObjectvZ("Buy", (int)(subTotal + (long)baseTax + (long)castleTax), player._getLastFolkNPCvL2FolkInstance(), false))
{
_sendPacketL2GameServerPacketV(new SystemMessage(SystemMessageId.m_YOU_NOT_ENOUGH_ADE NASystemMessageId));
return;
}
for(int i = 0; i < m_count; i++)
{
int itemId = m_items[i * 2 + 0];
int count = m_items[i * 2 + 1];
if(count < 0)
count = 0;
net.sf.l2j.gameserver.model.L2TradeList.L2TradeIte m tradeItem = list._getItemByIdIL2TradeList$L2TradeItem(itemId);
if(tradeItem == null)
{
Util._handleIllegalPlayerActionL2PcInstanceV(playe r, (new StringBuilder()).append("Warning!! Character ").append(player.getName()).append(" of account ").append(player._getAccountNamevString()).append (" sent a false BuyList list_id.").toString(), Config.m_DEFAULT_PUNISHI);
continue;
}
if(tradeItem._hasLimitedStockvZ())
{
if(tradeItem._decreaseCountIZ(count))
player._getInventoryvPcInventory()._addItemStringI L2PcInstanceL2ItemInstance("Buy", itemId, count, player, merchant);
} else
{
player._getInventoryvPcInventory()._addItemStringI L2PcInstanceL2ItemInstance("Buy", itemId, count, player, merchant);
}
}

if(merchant != null)
{
merchant._getCastlevCastle()._addToTreasuryIV(cast leTax);
String html = HtmCache.getInstance()._getHtmStringString((new StringBuilder()).append("data/html/").append(htmlFolder).append("/").append(merchant._getNpcIdvI()).append("-bought.htm").toString());
if(html != null)
{
NpcHtmlMessage boughtMsg = new NpcHtmlMessage(merchant._getObjectIdvI());
boughtMsg._setHtmlStringV(html._replaceAllStringSt ring("%objectId%", String.valueOf(merchant._getObjectIdvI())));
player._sendPacketL2GameServerPacketV(boughtMsg);
}
}
StatusUpdate su = new StatusUpdate(player._getObjectIdvI());
su._addAttributeIIV(14, player._getCurrentLoadvI());
player._sendPacketL2GameServerPacketV(su);
player._sendPacketL2GameServerPacketV(new ItemList(player, true));
}

public String getType()
{
return "[C] 1F RequestBuyItem";
}

}

xkor
16.02.2008, 23:59
с пакетами от клиента сложнее.., надо искать файл в котором они принимаются, дешифруются и уже по ИД распределяются между такими модулями...
я его чтот ненашел)

17.02.2008, 01:07
а вообще в камаэле так же как интерлюдии пакет с бловфиш ключем приходит в пакете Init?

17.02.2008, 18:40
Пишу непосредственно разработчику этой софтины, прога очень удобная для снифа пакетов с оффа использовал вплоть до Interlude. Но в камаеле сменили ID всех пакетов и ко всему прочему старые версии некорректно работали с Kamae'ем. Но вот вышли 3.1.9 и 3.2.0 за что автору большое спасибо. Эти версии l2phx стали нормально работать с KamaeL'ем, но вот с разборкой пакетов что-то не очень.
Записал видеоролик где наглядно показан пакет (часть пакета), естественно я начал добавлять все пакеты с софтину вручную но столкнулся с тем что программка некорректно разбирает пакет (в основном из за этого я l2phx и использовал :) ):
_http://dump.ru/files/o/o289545162/ - не вирус, зазипованный avi ролик.

За основу брал пакет:
0B - пакет в KamaeL'е (0x0b CharSelected SdSddddddddddffdQddddddddddd)
0B=CharSelected: s(name)d(charId)s(title)d(sissionId)d(clanId)d(0x0 0 xz)d(sex)d(race)d(classId)....
s - name
d - charId
s - title
d - sessionId
d - clanId
d - 0x00 неразу не менялся за время снифа с оффа
d - sex
d - race
d - classID
.....
итд
sd разбирает корректно, на 2й s он некорректно разбирает пакет
Возможно я что-то не так делаю... Да вродебы никогда не возникало подобных проблем на предыдущих версиях l2phx. Независимо от ответа заранее спс за ваш труд.

xkor
17.02.2008, 21:14
у тя на видео пакетхак 3.1.9, у него был недочет в разборе пакетов с текстом, в 3.2.0 вроде исправил...

17.02.2008, 21:29
Еслиб еще l2phx 3.2.0 не вылетал =) Да и как-то сомнительно он всеравно 2ю s распознает длина в 2 байта :-\ незнаю незнаю. В делфи вообще 0 :cry:

18.02.2008, 15:42
D001=RequestManorList прописал в Packets.ini дамми пакет, но его l2phx не понимает пишет unknown. Пробовал D0:01 и D0 01.

YuLaw
22.02.2008, 00:21
xkor, могу дать файл с ИД и структурой всех пакетов Камаэля, составлял сам с нуля, так что ошибки минимальны, вот только тебе придется немного переписать свою програмулину, т.к. у меня немного подругому разбор пакетов идет.
стучи в асю.

Добавлено спустя 23 часа 36 минут 40 секунд:
по просьбам хотящих, выкладываю
Структура пакетов камаэль (http://dump.ru/files/o/o723185223/)
описание типов прилагается в файле

24.02.2008, 00:11
На самом деле софтина не пашет с камаэлем, то что происходит это не есть пашет....
Давайте общими усилиями поправим это. У меня есть ID всего шмота, оружия, рас, предметов если кому нужно и если это поможет. Пакеты не коректно принемаются в 3.2.0, а от клиента к серверу игнорируются сервером, стандартные скрипты не работают, хотел проверить скрипт на двери, не понимается сервером. Проверял на серваке группы редлайн(рэбит). Через раз софтина вообще критом вышибается. Как я понял из прочитанного здесь и в просторах сети изменились пакеты, ID тоже поменялись. Давайте чё-нить думать...готов даже купить софтину, но рабочую, а не то что сейчас есть. Сам не программист, поэтому не поправлю, но с инфой и тестированием помочь могу, благо сервер свой есть...
xkoR займись, если не трудно этим вопросом, может сделаешь нормальный софт и оплата потянется....с моей стороны точно 8)

24.02.2008, 01:00
Access violation at adress 00528B13 in module 'l2phx.exe' Reed of adress 00000000
Может объясните на какой модуль ругается?

Tenshi
01.02.2009, 23:23
Access violation at adress 00528B13 in module 'l2phx.exe' Reed of adress 00000000
Может объясните на какой модуль ругается?

Та же ошибка, тока на Т0 ((
Чё делать ? :o

NLObP
02.02.2009, 00:16
Та же ошибка, тока на Т0 ((
Чё делать ? :o

Прочти (http://coderx.ru/showthread.php?t=423) как надо задать вопрос, чтобы тебе помогли, а не забанили.

Tenshi
02.02.2009, 00:49
Прочти (http://coderx.ru/showthread.php?t=423) как надо задать вопрос, чтобы тебе помогли, а не забанили.

Сори удалите пост, установил 318 версию всё идёт, не знаю почему 320 не пошла
Извиняюсь!:pardon:

NLObP
02.02.2009, 03:08
Сори удалите пост, установил 318 версию всё идёт, не знаю почему 320 не пошла
Извиняюсь!:pardon:

У меня встречный вопрос. Почему новее версию (http://coderx.ru/showthread.php?t=618) не попробовать? В крайнем случае взять из старой версии inject.dll.