07-09-2016, 11:08 AM
Приветствую всех!
В виду того, что PointShark так и не исправили, пришлось брать дело в свои руки и запилить на базе MapleShark - сниффер пакетов к игре Piercing Blow и Point Blank с версией 1.x - 3.x
![[Изображение: QZ7D.png]](https://image.zone-game.info/images/2016/07/09/QZ7D.png)
Как и в оригинальном MapleShark поддерживаются скрипты для разбора пакетов. Так же, в их API были добавлены методы чтения Unicode строк:
[SRC="csharp"] string AddUnicodeString(string name, int sizeOf);
string AddPaddedUnicodeString(string name, int length);
[/SRC]
C формы Data можно копировать данные в буфер обмена двумя способами:
CTRL + C - копирует hex:
CTRL + B - копирует подготовленный массив байт:
Последняя версия: 1.0.0.2 (Изменения)
Предыдущая версия: 1.0.0.1 (Изменения)
VirusTotal PiercingShark 1.0.0.2.7z
VirusTotal PiercingShark 1.0.0.1.7z
VirusTotal PiercingShark.7z
Для запуска требуется .NET Framework 4.6.1 и WinPcap.
В виду того, что PointShark так и не исправили, пришлось брать дело в свои руки и запилить на базе MapleShark - сниффер пакетов к игре Piercing Blow и Point Blank с версией 1.x - 3.x
![[Изображение: QZ7D.png]](https://image.zone-game.info/images/2016/07/09/QZ7D.png)
Как и в оригинальном MapleShark поддерживаются скрипты для разбора пакетов. Так же, в их API были добавлены методы чтения Unicode строк:
[SRC="csharp"] string AddUnicodeString(string name, int sizeOf);
string AddPaddedUnicodeString(string name, int length);
[/SRC]
C формы Data можно копировать данные в буфер обмена двумя способами:
CTRL + C - копирует hex:
Код:
58 00 61 00 76 00 69 00 65 00 72 00 43 00 6F 00 6D 00 6D 00 61 00 6E 00 64 00 65 00 72 00
CTRL + B - копирует подготовленный массив байт:
Код:
var data = new byte[]
{
0x58, 0x00, 0x61, 0x00, 0x76, 0x00, 0x69, 0x00, 0x65, 0x00, 0x72, 0x00, 0x43, 0x00, 0x6f, 0x00,
0x6d, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00,
};
Написание скриптов
Для разбора структуры пакета мы можем написать скрипт на скриптовом языке S#, синтаксис которого очень напоминает C#.
Возьмём для примера пакет PROTOCOL_BASE_GET_INVEN_INFO_ACK (который получаем при входе на сервер авторизации) и двойным нажатием ЛКМ на самом пакете - вызовем форму:
Опытным путём, мы узнали примерную структуру:
Чтобы прочитать первые три значения, достаточно написать:
[SRC="csharp"]Struct.AddShort("Unk");
Struct.AddInt("Result");
Struct.AddShort("Count");
[/SRC]
После нажатия кнопки Save script в структурах появятся три наших поля. Но что делать с массивом предметов? Правильно, нужен цикл for, а так же нам нужно получить в переменную количество предметов. Все методы AddType возвращают указанный тип, поэтому достаточно написать так:
[SRC="csharp"]Struct.AddShort("Unk1");
Struct.AddInt("Result");
count = Struct.AddShort("Count");
for (i = 0; i < count; i++)
{
Struct.AddInt("StoredId");
Struct.AddInt("ItemId");
Struct.AddByte("ExpirationType");
Struct.AddInt("Quantity");
}
[/SRC]
Вот и всё, в структурах у нас теперь список всех значений, но не в совсем удобном виде:
В данном случае мы можем воспользоваться методами StartNode и EndNode и сгруппировать данные. Доработаем скрипт:
[SRC="csharp"]Struct.AddShort("Unk1");
Struct.AddInt("Result");
count = Struct.AddShort("Count");
Struct.StartNode("Items"); // Открываем узел Items
for (i = 0; i < count; i++)
{
Struct.StartNode("Item"); // Открываем вложенный узел Item
Struct.AddInt("StoredId");
Struct.AddInt("ItemId");
Struct.AddByte("ExpirationType");
Struct.AddInt("Quantity");
Struct.EndNode(false); // Закрываем вложенный узел Item
}
Struct.EndNode(false); // Закрываем узел Items
[/SRC]
Дополнительные возможности
[SRC="csharp"]Struct.Write("filename.ext", value); // добавит новую строчку в filename.ext со значением value
[/SRC]
[SRC="csharp"]Struct.AddField("Skipped", 300); // пропускаем 300 байт
[/SRC]
Возьмём для примера пакет PROTOCOL_BASE_GET_INVEN_INFO_ACK (который получаем при входе на сервер авторизации) и двойным нажатием ЛКМ на самом пакете - вызовем форму:
Форма написания скрипта
![[Изображение: vR5QG.png]](https://image.zone-game.info/images/2016/07/18/vR5QG.png)
Опытным путём, мы узнали примерную структуру:
Код:
short // ? появилось в новых пакетах, возможно когда-то opcode с short в int перерастёт
int // result
short // count
byte[] // предметы, по 13 байт на предмет
Чтобы прочитать первые три значения, достаточно написать:
[SRC="csharp"]Struct.AddShort("Unk");
Struct.AddInt("Result");
Struct.AddShort("Count");
[/SRC]
После нажатия кнопки Save script в структурах появятся три наших поля. Но что делать с массивом предметов? Правильно, нужен цикл for, а так же нам нужно получить в переменную количество предметов. Все методы AddType возвращают указанный тип, поэтому достаточно написать так:
[SRC="csharp"]Struct.AddShort("Unk1");
Struct.AddInt("Result");
count = Struct.AddShort("Count");
for (i = 0; i < count; i++)
{
Struct.AddInt("StoredId");
Struct.AddInt("ItemId");
Struct.AddByte("ExpirationType");
Struct.AddInt("Quantity");
}
[/SRC]
Вот и всё, в структурах у нас теперь список всех значений, но не в совсем удобном виде:
Структура #1
![[Изображение: GuVJP.png]](https://image.zone-game.info/images/2016/07/18/GuVJP.png)
В данном случае мы можем воспользоваться методами StartNode и EndNode и сгруппировать данные. Доработаем скрипт:
[SRC="csharp"]Struct.AddShort("Unk1");
Struct.AddInt("Result");
count = Struct.AddShort("Count");
Struct.StartNode("Items"); // Открываем узел Items
for (i = 0; i < count; i++)
{
Struct.StartNode("Item"); // Открываем вложенный узел Item
Struct.AddInt("StoredId");
Struct.AddInt("ItemId");
Struct.AddByte("ExpirationType");
Struct.AddInt("Quantity");
Struct.EndNode(false); // Закрываем вложенный узел Item
}
Struct.EndNode(false); // Закрываем узел Items
[/SRC]
Сгруппированная структура
![[Изображение: 9NEkB.png]](https://image.zone-game.info/images/2016/07/18/9NEkB.png)
Дополнительные возможности
[SRC="csharp"]Struct.Write("filename.ext", value); // добавит новую строчку в filename.ext со значением value
[/SRC]
[SRC="csharp"]Struct.AddField("Skipped", 300); // пропускаем 300 байт
[/SRC]
Последняя версия: 1.0.0.2 (Изменения)
Предыдущая версия: 1.0.0.1 (Изменения)
VirusTotal PiercingShark 1.0.0.2.7z
VirusTotal PiercingShark 1.0.0.1.7z
VirusTotal PiercingShark.7z
Для запуска требуется .NET Framework 4.6.1 и WinPcap.