Мы тут с
LordJZ начали делать сниффер, но наткнулись на неприятность:
При логине и пока стоим на окне выбора персонажей пакеты декриптуются нормально
Вот лог сниффера:
Код:
World server address: 62.67.45.123:3724
Connected to 62.67.45.123:3724
SERVER: Header = 44 Packet = 44 OK Opcode: SMSG_AUTH_CHALLENGE
Session Key: 6250DC798DDEA48A01102CE9B7EA33060D425E42DC2145E0477FBEC637F1287C00EAC7B10B54B3BB
CLIENT: Header = 278 Packet = 278 OK Opcode: CMSG_AUTH_SESSION
SERVER: Header = 15 Packet = 15 OK Opcode: SMSG_AUTH_RESPONSE
SERVER: Header = 192 Packet = 270 REUSE Opcode: SMSG_ADDON_INFO
SERVER: Header = 8 Packet = 78 REUSE Opcode: SMSG_CLIENTCACHE_VERSION
SERVER: Header = 36 Packet = 70 REUSE Opcode: SMSG_TUTORIAL_FLAGS
Redirect to 62.67.45.165:1119
SERVER: Header = 34 Packet = 34 OK Opcode: SMSG_REDIRECT_CLIENT
Connected to 62.67.45.165:1119
SERVER: Header = 44 Packet = 44 OK Opcode: SMSG_AUTH_CHALLENGE
Session Key: 6250DC798DDEA48A01102CE9B7EA33060D425E42DC2145E0477FBEC637F1287C00EAC7B10B54B3BB
CLIENT: Header = 46 Packet = 46 OK Opcode: CMSG_REDIRECTION_AUTH_PROOF
SERVER: Header = 4 Packet = 4 OK Opcode: SMSG_FORCE_SEND_QUEUED_PACKETS
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_READY_FOR_ACCOUNT_DATA_TIMES
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_CHAR_ENUM
CLIENT: Header = 10 Packet = 10 OK Opcode: CMSG_REALM_SPLIT
SERVER: Header = 25 Packet = 25 OK Opcode: SMSG_ACCOUNT_DATA_TIMES
SERVER: Header = 291 Packet = 312 REUSE Opcode: SMSG_CHAR_ENUM
SERVER: Header = 21 Packet = 21 OK Opcode: SMSG_REALM_SPLIT
SERVER: Header = 41 Packet = 41 OK Opcode: SMSG_WARDEN_DATA
Но при заходе персонажем в мир начинается каша, серверные пакеты неправильно декриптуются или разбираются:
Код:
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_PLAYER_LOGIN
SERVER: Header = 25 Packet = 25 OK Opcode: SMSG_ACCOUNT_DATA_TIMES
SERVER: Header = 36 Packet = 1460 REUSE Opcode: SMSG_TUTORIAL_FLAGS
SERVER: Header = 16 Packet = 1424 REUSE Opcode: MSG_SET_DUNGEON_DIFFICULTY
SERVER: Header = 24 Packet = 1408 REUSE Opcode: SMSG_LOGIN_VERIFY_WORLD
SERVER: Header = 29 Packet = 1384 REUSE Opcode: SMSG_ACCOUNT_DATA_TIMES
SERVER: Header = 6 Packet = 1355 REUSE Opcode: SMSG_FEATURE_SYSTEM_STATUS
SERVER: Header = 293 Packet = 1349 REUSE Opcode: SMSG_MOTD
SERVER: Header = 12 Packet = 1056 REUSE Opcode: SMSG_LEARNED_DANCE_MOVES
SERVER: Header = 12 Packet = 1044 REUSE Opcode: SMSG_CONTACT_LIST
SERVER: Header = 24 Packet = 1032 REUSE Opcode: SMSG_BINDPOINTUPDATE
SERVER: Header = 9 Packet = 1008 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 999 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 990 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 981 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 972 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 963 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 954 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 945 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 936 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 927 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 25 Packet = 918 REUSE Opcode: SMSG_TALENTS_INFO
SERVER: Header = 12 Packet = 893 REUSE Opcode: SMSG_INSTANCE_DIFFICULTY
SERVER: Header = 9 Packet = 881 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 9 Packet = 872 REUSE Opcode: SMSG_SET_PROFICIENCY
SERVER: Header = 285 Packet = 863 REUSE Opcode: SMSG_INITIAL_SPELLS
SERVER: Header = 8 Packet = 578 REUSE Opcode: SMSG_SEND_UNLEARN_SPELLS
ERROR: SERVER Size = 581 > packet.Length = 570
ERROR: SERVER Size = 27961 > packet.Length = 1460
ERROR: SERVER Size = 46186 > packet.Length = 1460
ERROR: SERVER Size = 27772 > packet.Length = 1355
CLIENT: Header = 7 Packet = 7 OK Opcode: CMSG_PLAYED_TIME
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_NAME_QUERY
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_SET_ACTIVE_MOVER
CLIENT: Header = 7 Packet = 7 OK Opcode: CMSG_SET_ACTIONBAR_TOGGLES
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_REQUEST_RAID_INFO
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_GMTICKET_GETTICKET
ERROR: SERVER Size = 34578 > packet.Length = 118
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_QUERY_TIME
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_QUEST_POI_QUERY
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_MEETINGSTONE_INFO
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_LFD_PLAYER_LOCK_INFO_REQUEST
CLIENT: Header = 6 Packet = 6 OK Opcode: MSG_GUILD_BANK_MONEY_WITHDRAWN
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_CALENDAR_GET_NUM_PENDING
CLIENT: Header = 8 Packet = 8 OK Opcode:
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_QUESTGIVER_STATUS_QUERY
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_NAME_QUERY
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_TIME_SYNC_RESP
CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_FALL_LAND
CLIENT: Header = 10 Packet = 10 OK Opcode: CMSG_ZONEUPDATE
CLIENT: Header = 43 Packet = 43 OK Opcode: CMSG_JOIN_CHANNEL
CLIENT: Header = 49 Packet = 49 OK Opcode: CMSG_JOIN_CHANNEL
CLIENT: Header = 47 Packet = 47 OK Opcode: CMSG_JOIN_CHANNEL
CLIENT: Header = 43 Packet = 43 OK Opcode: CMSG_JOIN_CHANNEL
CLIENT: Header = 47 Packet = 47 OK Opcode: CMSG_JOIN_CHANNEL
CLIENT: Header = 6 Packet = 6 OK Opcode: CMSG_WORLD_STATE_UI_TIMER_UPDATE
ERROR: SERVER Size = 44279 > packet.Length = 29
ERROR: SERVER Size = 7350 > packet.Length = 1460
ERROR: SERVER Size = 61367 > packet.Length = 649
ERROR: SERVER Size = 31772 > packet.Length = 62
ERROR: SERVER Size = 21770 > packet.Length = 388
ERROR: SERVER Size = 12076 > packet.Length = 54
ERROR: SERVER Size = 10025 > packet.Length = 108
ERROR: SERVER Size = 50091 > packet.Length = 62
ERROR: SERVER Size = 41905 > packet.Length = 61
ERROR: SERVER Size = 20541 > packet.Length = 66
ERROR: SERVER Size = 26947 > packet.Length = 54
ERROR: SERVER Size = 15250 > packet.Length = 66
ERROR: SERVER Size = 13283 > packet.Length = 147
ERROR: SERVER Size = 5655 > packet.Length = 170
ERROR: SERVER Size = 16965 > packet.Length = 54
ERROR: SERVER Size = 25301 > packet.Length = 62
ERROR: SERVER Size = 39797 > packet.Length = 62
ERROR: SERVER Size = 12419 > packet.Length = 54
CLIENT: Header = 32 Packet = 32 OK Opcode: CMSG_WARDEN_DATA
ERROR: SERVER Size = 18762 > packet.Length = 439
ERROR: SERVER Size = 9091 > packet.Length = 159
ERROR: SERVER Size = 32369 > packet.Length = 120
CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_SET_FACING
CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_START_FORWARD
ERROR: SERVER Size = 37437 > packet.Length = 5
CLIENT: Header = 42 Packet = 42 OK Opcode: MSG_MOVE_STOP
ERROR: SERVER Size = 11046 > packet.Length = 54
ERROR: SERVER Size = 59547 > packet.Length = 54
ERROR: SERVER Size = 32659 > packet.Length = 120
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_SET_SELECTION
CLIENT: Header = 14 Packet = 14 OK Opcode: CMSG_QUESTGIVER_HELLO
ERROR: SERVER Size = 23216 > packet.Length = 54
ERROR: SERVER Size = 12149 > packet.Length = 295
ERROR: SERVER Size = 25893 > packet.Length = 42
Сама функция которая обрабатывает пакеты:
Код:
private static void ProcessWorldPacket(byte[] data, Direction direction)
{
int i = 0, size = 0, opcode = 0;
int HEADER_LENGTH = 4;
bool isLarge = data.Length > 0x7FFF;
HEADER_LENGTH += (isLarge ? 1 : 0);
if (direction == Direction.SERVER)
{
Crypt.DecryptServer(data, HEADER_LENGTH);
}
else
{
HEADER_LENGTH += 2;
Crypt.DecryptClient(data, 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;
if (size > data.Length)
{
Console.WriteLine("ERROR: {0} Size = {1} \t>\t 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);
}
}
}
Подскажите, в чем загвоздка, или есть какой-то нюанс?