Android CDMAメールpduパケット解析

4286 ワード

メールの送信中に、メールの内容、送信時間などの情報が「数字」文字列に圧縮され、この文字列が私たちのpduパッケージであり、このプロセスはpduのパッケージとも呼ばれます.pduパケットはATコマンドの助けでmodermに到着し、modermによって移動基地局に送信され、その後、基地局を通じて受信者の携帯電話に中継され、受信者はpduパケットを受け取った後、圧縮の逆過程に従って解析され、すなわちpduパケットを解包し、最終的に短彩信データベースに到着し、ユーザーに展示される.
pdu圧縮パケットと解パケットはほぼ類似しており,正逆過程であるため,そのうちの1つの過程を理解する必要がある.
pdu解析の手順を説明します.
cdmaメールpduパケット解析:
メールの内容:国がそろってお祝いして、家と国が団らんします.
キャプチャされたpduパケット:
00      00 02 10 02      02 04 01 46 AA 8406 01 0C 08 2F 00 03 11 11 C0 01 1A 20 62 B7 EA DD B4 FA 82 A062 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 30 01 08 03 06 12 10 11 1538 37 08 01 40 0A 01 40
BearerData.java
while (inStream.available() > 0) {
                boolean decodeSuccess = false;
                int subparamId = inStream.read(8);
                int subparamIdBit = 1 << subparamId;//  1   ,   8 
                if ((foundSubparamMask & subparamIdBit) != 0) {
                    throw new CodingException("illegal duplicate subparameter (" +
                                              subparamId + ")");
                }
.......//         ,Mask        ,               
}

最初のフィールド:
00:messageType,messageId等を得る.
private static boolean decodeMessageId(BearerData bData, BitwiseInputStream inStream)
        throws BitwiseInputStream.AccessException, CodingException
    {
        final int EXPECTED_PARAM_SIZE = 3 * 8;
        boolean decodeSuccess = false;
        int paramBits = inStream.read(8) * 8;
        if (paramBits >= EXPECTED_PARAM_SIZE) {
            paramBits -= EXPECTED_PARAM_SIZE;
            decodeSuccess = true;
            bData.messageType = inStream.read(4);
            bData.messageId = inStream.read(8) << 8;
            bData.messageId |= inStream.read(8);
            bData.hasUserDataHeader = (inStream.read(1) == 1);
            inStream.skip(3);
        }
        if ((! decodeSuccess) || (paramBits > 0)) {
            Log.d(LOG_TAG, "MESSAGE_IDENTIFIER decode " +
                      (decodeSuccess ? "succeeded" : "failed") +
                      " (extra bits = " + paramBits + ")");
        }
        inStream.skip(paramBits);
        return decodeSuccess;
    }

2番目のフィールド:
0002 10 02:メールのteleservice、その値は:(16進)1002すなわち4098.
最初のフィールド:
02 04 01 46 AA 84:メールアドレス.内容は:0146 AA 84
00000001 0100 0110 1010 1010 1000 0100
1位:0:代表モード
2位:0:数値モード
以下の8 bitは長さを表し、ここでは0000 01値は5、5*4=20、後ろの20桁は電話番号である.
  • 1010 1010 1010 1010 00 01)すなわち10001.解析完了.

  • 最初のフィールド:
    0601 C:SMS_を表すTL_BEARER_RPLY_OPT
    最初のフィールド:
    082F00 03 11 11 C0 01 1A 20 62 B7 EA DDB4 FA 82 A0 62 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 30 01 08 03 0612 10 11 15 38 37 08 01 40 0A 01 40
    08:メールの内容を表示
    2 F:フィールド長.47
    セクション1
    0003 11 11 C0:
    00:MessageId
    1111 C0:00010001 0001 0001 1100 0000
    0001:DELIVERメッセージを表示
    00010001 0001 1100:messageidを表す
    0:HEADER_を表すIND.
    セクション2
    011A      20 62 B7 EA DD B4
    FA82 A0 62 F4 30
    01 62 DD B2 B7 EA
    71 22 B7 12 B8 30
    01 08
    01:フィールドタイプ.
    20 62 B7 EA DD B4 FA 82 A0 62 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 3001 08
    バイナリ表現:
    0010 0000 0110 0010 1011 0111 1110 1010 1101 1101 1011 0100 1111 1010 1000 0010 1010 0000 0110 0010 1111 0100 0011 0000
    0000 0001 0110 0010 1101 1101 1011 0010 1011 0111 1110 1010
    0111 0001 0010 0010 1011 0111 0001 0010 1011 1000 0011 0000
    0000 0001 0000 1000
    (
    2062 B7 EA DD B4 FA 82 A0 62 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 3001 08
    バイナリ表現:
    00100000 0110 0010 1011 0111 1110 1010 1101 1101 1011 0100 1111 1010 1000 0010 1010 0000 0110 0010 1111 0100 0011 0000
    0000 0001 0110 0010 1101 1101 1011 0010 1011 0111 1110 1010
    0111 0001 0010 0010 1011 0111 0001 0010 1011 1000 0011 0000
    0000 0001 0000 1000
    )
    20:上位5ビット:00100すなわち4、符号化方式:unicode
    20:の下位3位、62の上位5位は:000,01100は10に等しく、10個のunicodeがあることを示す.
    62の後3個のunicedeにB 7の8 bitを加え、EAの前5個のbitを加えて得る.
    0101 0110 111 1 110 1 56 fd unicodeコードを見ると国であることがわかります
    0101 1011 1011 0110 5 bb 6 unicode符号化を見ると家であることがわかります
    セクション1
    0306 12 10 11 15 38 37
    タイムスタンプ12年10月11日15時38分37秒
    08 01 40 0A 01 40