|
Опкоды, Формулы, Клиент Разбор и изучение взаимодействия клиента с сервером |
|
Опции темы | Поиск в этой теме | Опции просмотра |
01.06.2010, 09:58 | #11 | ||||||
RuDB Dev
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
|
Спасибо всем за советы и подсказки:
Цитата:
http://github.com/arrai/tiawps/blob/...pter/decrypt.c Если я правильно понял с примера, то нужно дополнительно декриптовать еще 1 байт, или же сразу нужный размер. Код:
private static void ProcessWorldPacket(byte[] data, Direction direction) { int i = 0, size = 0, opcode = 0; bool isLarge = (data[i] & 0x80) != 0; int HEADER_LENGTH = isLarge ? 4 : 5; if (direction == Direction.SERVER) { Crypt.DecryptServer(data, 0, HEADER_LENGTH); } else { HEADER_LENGTH += 2; Crypt.DecryptClient(data, 0, HEADER_LENGTH); } if (isLarge) size = data[i++] & 0x7F; size = (size << 8) | data[i++]; size = (size << 8) | data[i++]; for (int j = 0; j < HEADER_LENGTH - 2; j++) opcode |= ((0xFF & data[i++]) << (8 * j)); size += (2 + (isLarge ? 1 : 0)); if (size > data.Length) { Console.WriteLine("ERROR: {0} Size = {1} > packet.Length = {2}", direction, size, data.Length); return; } using (BinaryReader reader = new BinaryReader(new MemoryStream(data))) { reader.BaseStream.Position += HEADER_LENGTH; byte[] newData = reader.ReadBytes(size - HEADER_LENGTH); HandleWorldPacket((WorldOpcodes)opcode, newData); Console.WriteLine("{0}:\tHeader = {1}\tPacket = {2}\t{3}\tOpcode: {4}", direction, size, data.Length, data.Length == size ? "OK" : "REUSE", (WorldOpcodes)opcode); if (size < data.Length) { ProcessWorldPacket(reader.ReadBytes(data.Length - size), direction); } } } Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Да и с моим ничтожным опытом в программировании (чуть больше года на любительском уровне и когда есть время) наверное не постичь тайну аутеффикации, так как надо делать хук (подменить ИП сервера в памяти), надо еще чего-то и еще... Ладно хватит писать, пойду работать... |
||||||