Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Клиент-Сервер (Delphi)
<< . 1 . 2 . 3 .
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 28 февраля 2012 07:02
· Личное сообщение · #1

Приветствую всех!
Есть флеш приложение, которое общается с сервером через порт по средствам TCP пакетов.
Надо сделать простейшее приложение логина на сервер и получение любых данных.
По идее если обращение из флеш, структуру пакетов можно откопать в нём же.
Обычно сталкивался с GET, POST запросами, там всё ловил через HttpAnalyzerStd. Через что лучше работать с пакетами? Ставил различные снифферы пакетов, что-то всё работает очень сомнительно (когда в приложении куда-либо обращаешься, никаких посылок не ловится, а по идее данные должны запрашиваться от сервака).
Вопросы:
1. Какой софт для анализа лучше в данном случае? (под винду)
2. С чего начать копать (в теории)

PS: Если уж совсем не в тему форума, киньте в оффтоп, но там мало кто читает

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 25 апреля 2013 20:45
· Личное сообщение · #2

xDvKx пишет:
во втором пакете имя персонажа в кодировке UTF

вот этого пакета я нигде не вижу
как он отличается?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 апреля 2013 21:35 · Поправил: xDvKx
· Личное сообщение · #3

Первый пакет который приходит от сервера.

В пакетах некоторые части пожаты zip, например встречается текст #gru.bdirect.ХХХХХХ.tutorial.model::Tutorial Config version progress




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 02 мая 2013 19:31 · Поправил: Isaev
· Личное сообщение · #4

Там работа с кодированными потоками, основная функция
Code:
  1. override public function readInt() : int
  2. {
  3.    return decodeZigZag32(this.readRawVarint32());
  4. }

Это функции из библиотеки protocol-buffers, для Java, C и Python например, а вот для Delphi сколько не гуглил, не нашёл ни ту ни другую...
decodeZigZag32
readRawVarint32()
Пробую перевести, но что-то я не понимаю для чего в readRawVarint32 читается из потока 15 байт для получения 32битного значения? Или она как-то иначе работает?

Читается по 1 байту и более логично, хотя в итоге для обычного int читается до 5 байт всё равно, вместо 4... плюс ещё до 5 может отбрасываться...

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 162.4 (ветеран), 11thx
Активность: 0.060
Статус: Участник

Создано: 06 мая 2013 14:05 · Поправил: SWR
· Личное сообщение · #5

тут просто кодирование
старший бит если 1 то нужно считать еще 1 байт, 0- конец декодированию.

в каждом байте 7 информативных бит.
int от 0 до 127 за кодируется в 1 байт.

для чисел больше 268435455 (и отрицательных) потребуется 5 байт.


а хвост с 5 байтами сделан для того что в потоке может быть число больше 4 байт (int64), а читается 4.
Вот и прочитывается байты с взведенным 7м битом + 1 с нулевым. Для int64 их max 9 штук. 4 считали, осталось максимум 5

| Сообщение посчитали полезным: Isaev


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 07 мая 2013 05:11 · Поправил: Isaev
· Личное сообщение · #6

допустим последовательность: d0 92 d2 c0 06 00
Packet.Data[0]=-48 (D0)
Packet.Data[1]=-110 (92)
Packet.Data[2]=-46 (D2)
Packet.Data[3]=-64 (C0)
Packet.Data[4]=6 (06)
Packet.Data[5]=0 (00)

M[0]=11010000
M[1]=10010010
M[2]=11010010
M[3]=11000000
M[4]=00000110
M[5]=00000000

N=01101000_00010100_10001001_01010000 - 1746176336 (после readRawVarint32, выход по идее правильный, если на бумажке нарисовать то же получится)
N=00110100_00001010_01000100_10101000 - 873088168 (после decodeZigZag32, эта не совсем понятно что делать должна... делит на 2 и если деление было не на цело, то инвертирует результат вроде, логики не вижу в этом)

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 162.4 (ветеран), 11thx
Активность: 0.060
Статус: Участник

Создано: 07 мая 2013 15:06 · Поправил: SWR
· Личное сообщение · #7

Zigzag32
это надстройка над пакером.
переводит int32 в int64.
и последний бит (младший) использует как знак.
Если int32 отрицательный, инвертирует его (Это убирает старшие биты).

Например:
-1 (0xFF FF FF FF) превратится в 0x00 00 00 01
1 (0x00 00 00 01) => 0x00 00 00 02

-2 => 0x00000003
2 => 0x00000004

-3 => 0x00000005
3 => 0x00000006

Тем самым убирая избыточность упаковки если число отрицательно (5 байт требовало)
А зигзаг и назвали из того, что числа идут зигзагом +-+-+-+-


Code:
  1. void  EncodeZigzag32(int32 x)
  2. {
  3.         int64 _X = 0;
  4.         if(x<0)_X = -1;
  5.         EncodeVarint(((int64)(x)<< 1)^_X);
  6. }
  7.  
  8. int32 DecodeZigzag32()
  9. {
  10.         uint64 x = DecodeVarint()
  11.         int64 _X = 0;
  12.         if((x&1) == 1)_X = -1;
  13.         return (int32)((x>>1)^_X);
  14. }
  15.  





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 08 мая 2013 01:39 · Поправил: Isaev
· Личное сообщение · #8

SWR Спс, Значит я таки всё правильно перевёл Чуть с типами подретуширую и будет хорошо...
Пойду разбераться дальше

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 12 мая 2013 22:40
· Личное сообщение · #9

Как расшифровать дату?
читаются данные 8 Byte: 42 73 E9 9C BB 4E 50 00
день/месяц/год по идее как у этого сообщения, время примерно послеобеденное
что-то ничего хорошего не выходит из этой цифры... Может какой-то инструмент показывает возможные представления даты? Если формат никсовый, должно быть 10 значное число по идее... а тут слишком большое... возможно так же, что порядок байтов обратный

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 мая 2013 22:57
· Личное сообщение · #10

зачем угадывать
смотри как она расшивровывается во флеше




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 13 мая 2013 00:45 · Поправил: Isaev
· Личное сообщение · #11

reversecode а оно там не расшифровывается и не используется, просто записывается как double, посылается на сервер и так же сравниваются даты , т.е. большее double значение соответствует действительно поздней дате
и потом она наверняка не зашифрована, просто в каком формате не известно
в ActionScript есть свой формат для хранения дат?
ps: а, вот! понял как)

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh



<< . 1 . 2 . 3 .
 eXeL@B —› Программирование —› Клиент-Сервер (Delphi)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати