質問の仕方がよくわからなかったので、タイトルが間違っていたらすみません。さらに、コーヒーを飲みたいと思うかもしれません。
基本的に、セル ID に基づいて位置を取得するために Windows Mobile Live Search アプリケーションで使用されるプロトコルをリバース エンジニアリングしようとしています。先に進む前に、他のオープン ソース サービス (OpenCellID など) を認識していますが、これは教育のためであり、冗長性のためです。
キャプチャしたパケットによると、POST リクエストが行われます。
mobile.search.live.com/positionlookupservice_1/service.aspx
... いくつかの特定のヘッダー (agent、content-length など) があり、本文はありません。これが完了すると、サーバーは 100-Continue 応答を返します。この時点で、アプリケーションは次のデータを送信します (私はパケット ヘッダーを切り落としました)。
00 00 00 01 00 00 00 05 55 54 ........UT
46 2d 38 05 65 6e 2d 55 53 05 65 6e 2d 55 53 01 F-8.en-US.en-US.
06 44 65 76 69 63 65 05 64 75 6d 6d 79 01 06 02 .Device.dummy...
50 4c 08 0e 52 65 76 65 72 73 65 47 65 6f 63 6f PL..ReverseGeoco
64 65 01 07 0b 47 50 53 43 68 69 70 49 6e 66 6f de...GPSChipInfo
01 20 06 09 43 65 6c 6c 54 6f 77 65 72 06 03 43 . ..CellTower..C
47 49 08 03 4d 43 43 b6 02 07 03 4d 4e 43 03 34 GI..MCC....MNC.4
31 30 08 03 4c 41 43 cf 36 08 02 43 49 fd 01 00 10..LAC.6..CI...
00 00 00 ...
そして、応答でこれを受け取ります (パケットと HTTP 応答ヘッダーが切り刻まれます):
00 00 00 01 00 00 00 00 01 06 02 50 4c ...........PL
06 08 4c 6f 63 61 6c 69 74 79 06 08 4c 6f 63 61 ..Locality..Loca
74 69 6f 6e 07 03 4c 61 74 09 34 32 2e 33 37 35 tion..Lat.42.375
36 32 31 07 04 4c 6f 6e 67 0a 2d 37 31 2e 31 35 621..Long.-71.15
38 39 33 38 00 07 06 52 61 64 69 75 73 09 32 30 8938...Radius.20
30 30 2e 30 30 30 30 00 42 07 0c 4c 6f 63 61 6c 00.0000.B..Local
69 74 79 4e 61 6d 65 09 57 61 74 65 72 74 6f 77 ityName.Watertow
6e 07 16 41 64 6d 69 6e 69 73 74 72 61 74 69 76 n..Administrativ
65 41 72 65 61 4e 61 6d 65 0d 4d 61 73 73 61 63 eAreaName.Massac
68 75 73 65 74 74 73 07 10 50 6f 73 74 61 6c 43 husetts..PostalC
6f 64 65 4e 75 6d 62 65 72 05 30 32 34 37 32 07 odeNumber.02472.
0b 43 6f 75 6e 74 72 79 4e 61 6d 65 0d 55 6e 69 .CountryName.Uni
74 65 64 20 53 74 61 74 65 73 00 00 00 ted States...
さて、これが私がこれまでに決定したことです:
すべての文字列には、その長さに相当する 10 進数の 1 バイトが先頭に追加されます。
リクエストとレスポンス全体で使用される 3 つの異なるキャストがあるようです。これらは、長さバイトの前の 1 バイトとして表示されます。私は、3 つのタイプが次のようにマップされていると結論付けました。
- 0x06 - 親要素 (後続の値は子であり、0x00 で閉じられます)
- 0x07 - 文字列
- 0x08 - 整数?
これらの決定に基づいて、リクエストとレスポンスを読みやすくすると次のようになります (括弧で囲まれた値は長さを表し、括弧で囲まれた値はキャストを表します)。
\0x00\0x00\0x00\0x01\0x00\0x00\0x00
[5]UTF-8
[5]en-US
[5]en-US
\0x01
[6]Device
[5]dummy
\0x01
(6)[2]PL
(8)[14]ReverseGeocode\0x01
(7)[11]GPSChipInfo[1]\0x20
(6)[9]CellTower
(6)[3]CGI
(8)[3]MCC\0xB6\0x02 //310
(7)[3]MNC[3]410 //410
(8)[3]LAC\0xCF\0x36 //6991
(8)[2]CI\0xFD\0x01 //259
\0x00
\0x00
\0x00
\0x00
と..
\0x00\0x00\0x00\0x01\0x00\0x00\0x00
\0x00\0x01
(6)[2]PL
(6)[8]Locality
(6)[8]Location
(7)[3]Lat[9]42.375621
(7)[4]Long[10]-71.158938
\0x00
(7)[6]Radius[9]2000.0000
\0x00
\0x42 //"B" ... Has to do with GSM
(7)[12]LocalityName[9]Watertown
(7)[22]AdministrativeAreaName[13]Massachusetts
(7)[16]PostalCodeNumber[5]02472
(7)[11]CountryName[13]United States
\0x00
\0x00\0x00
私の分析は、いくつかのことを除いてかなりうまくいっているようです。
- 全体の 0x01 は私を混乱させます... 最初は、ある種の基本レベル要素ターミネータだと思っていましたが、確かではありません。
- 7 バイトのヘッダーが実際には 7 バイトのヘッダーかどうかはわかりません。おそらく 4 バイトで、残りの 3 つの 0x00 には別の意味があるのではないかと思います。
- 末尾の 0x00。リクエストには 1 つしかないのに、レスポンスには 2 つあるのはなぜですか?
- 上記のタイプ 8 キャスト...これらの値がどのようにエンコードされているのかわかりません。これらの行に、値が何に対応するかについてコメントを追加しました。
この4点についてアドバイスをいただければ幸いです。
はい、これらのパケットはマサチューセッツ州ウォータータウンでキャプチャされました。:)