本文中的分析与软件相关的内容,都是以WinCE中的 Microsoft Bluetooth Core Stack为例进行分析;与协议有关的内容,是基于Bluetooth Core 2.1 + EDR Spec进行分析。

1. 如何获取L2CAP包

  • 从HCI_ReadPacket()/HCI_WritePacket()中截获

在HCI_ReadPacket()/HCI_WritePacket()中判断eType为2的即是ACL-u数据,也即L2CAP数据。

ACL-u包中包括了Connection Handle,Flag,Data Length以及Data Domain,如下图所示:

其中,Data Domain即是L2CAP包的数据。

  • 从MS-Stack中获取

编译Debug版本的MS-Stack,即btd.dll,并打开Debug Zone DEBUG_L2CAP_PACKETS,即可以截取到L2CAP的数据。

#define DEBUG_L2CAP_PACKETS 0x00040000

一个MS-Stack中截获的L2CAP数据形如:

2. 如何分析L2CAP包

L2CAP是基于Packet进行数据传输的,其传输模型基于Channel。 Channel Identifier(CID)的分类如下图所示:

可以将Channel理解为USB协议中的Endpoint,不同的Channel用做不同的传输,总体上可以分为Connection-oriented channel,Connectionless data channel和Singling Channel,如下图所示:

2.1 Signaling Packet分析

  • 如何判别一个包为Signaling Packet

如果L2CAP包的CID为0x0001,则该包即为Signaling Packet。

  • Signaling包的结构

如下:

其中Commands域的格式如下:

上面的Code域可能的值如下:

  • 各个Code的具体分析方式

可以参照BlueCore Spec中有关各个Code的详细格式来对数据进行分析,以Disconnection Request为例,分析如下:

Destination CID - DCID (2 octets)

This field specifies the endpoint of the channel to be disconnected on the

device receiving this request.

Source CID - SCID (2 octets)

This field specifies the endpoint of the channel to be disconnected on the

device sending this request.

Identifier:

该域为1字节长,Request和Response中的该值是一样的,用来在一对设备之间进行通信的时候判别使用。每一组连续的Response-Request命令都必须有一个不一样的Identifier,长度为2个字节。在其它的通信协议中也经常会存在一个类似的Identifier,显然,0~0xff用完的时候,可以回收之前用过的值。

2.2 分析Data Packet

  • 如何判别一个包为Data Packet

Data Packet包括Connection-oriented和Connectionless data两种,它们的CID范围不一样,可以通过CID来进行区分。如果CID为0x2,则是Connectionless data,如果介于0x40和0xfff之间,则为Connection-oriented data Packet。

  • Data Packet的结构

两者的结构分别如下图所示:

Connection-oriented结构如下图:

Connectionless结构如下图:

可以看到,Connection-oriented Frame包括三种,Basic Frame(B-FRAME),Supervisory Frame(S-FRAME)和Information Frame(I-FRAME)。通过Control域中的Bit0来区分S-FRAME和I-FRAME,即Bit0=0为I-FRAME,为1是S-FRAME。

那么,如何来区分B-FRAME呢?这些就留到以后进行深究吧!

如何获取并分析L2CAP包的更多相关文章

  1. 使用wireshark抓包分析-抓包实用技巧

    目录 使用wireshark抓包分析-抓包实用技巧 前言 自定义捕获条件 输入配置 输出配置 命令行抓包 抓取多个接口 抓包分析 批量分析 合并包 结论 参考文献 使用wireshark抓包分析-抓包 ...

  2. 使用winpcap多线程抓包,以及简单的分析数据包

    刚开始使用winpcap数据包的时候,我在抓包的时候使用了 pcap_loop(adhandle, 0, packet_handler, NULL); 这个回调函数进行抓包.同时在回调函数中分析IP地 ...

  3. 在Android手机上获取其它应用的包名及版本

    转载请注明出处:http://blog.csdn.net/jason_src/article/details/37757661 获取Android手机上其它应用的包名及版本方法有非常多,能够通过AAP ...

  4. 微信小程序编译包的获取与解压——在手机中获取小程序编译包wxapkg

    准备工作: 微信关注需要下载编译包的小程序,然后点进去看一下,微信就会自动下载相应的编译包到手机上了. 获取小程序编译包: 据说root手机可以直接在手机的文件管理中查找wxapkg文件,自己尝试了下 ...

  5. 情感分析snownlp包部分核心代码理解

    snownlps是用Python写的个中文情感分析的包,自带了中文正负情感的训练集,主要是评论的语料库.使用的是朴素贝叶斯原理来训练和预测数据.主要看了一下这个包的几个主要的核心代码,看的过程作了一些 ...

  6. Wireshark数据抓包教程之认识捕获分析数据包

    Wireshark数据抓包教程之认识捕获分析数据包 认识Wireshark捕获数据包 当我们对Wireshark主窗口各部分作用了解了,学会捕获数据了,接下来就该去认识这些捕获的数据包了.Wiresh ...

  7. 获取软件的apk包名、查看手机设备名称等

    获取软件的apk包名 1.下载aapt,这里使用的是SDK自带的aapt,找到SDK路径下面的aapt.exe,本机路径:E:\downloads\android-sdk_r23.0.2-window ...

  8. 不同节点 IP 时间同步 分布式时间同步系统的参考时间获取技术分析

    linux linux下时间同步的两种方法分享_LINUX_操作系统_脚本之家 http://www.jb51.net/LINUXjishu/73979.html 分布式时间同步系统的参考时间获取技术 ...

  9. JAVAEE 是什么,如何获取各种规范jar包及各种规范的jar包源码

    1.什么是JAVA EE JAVA EE是由一系列规范组成的,规范是由JCP制定的,并且提供了参考实现.规范(Specification)是一系列接口,不包含具体实现 有以下常见的JAVA EE实现, ...

随机推荐

  1. DEDE织梦常用的调用方法

    DEDE织梦常用的调用常规调用: 网站名称调用:<title>{dede:global.cfg_webname/}</title> 网站关键词调用:<meta name= ...

  2. StringUtils中 isNotEmpty 和isNotBlank的区别【java字符串判空】

    isNotEmpty(str)等价于 str != null && str.length > 0 isNotBlank(str) 等价于 str != null &&am ...

  3. spring实战二之Bean的自动装配(非注解方式)

    Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...

  4. 简单几何(求凸包点数) POJ 1228 Grandpa's Estate

    题目传送门 题意:判断一些点的凸包能否唯一确定 分析:如果凸包边上没有其他点,那么边想象成橡皮筋,可以往外拖动,这不是唯一确定的.还有求凸包的点数<=2的情况一定不能确定. /********* ...

  5. 递推DP URAL 1586 Threeprime Numbers

    题目传送门 /* 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 所以,dp[i ...

  6. 关于InputStream.read()方法的阻塞原理的测试

    最近在一家公司做java实习,写了个网络字节采集器.写了个单例TCPServer来采集数据,其中用到了InputStream.read()来读取数据.产生了一系列问题,下面做下总结: 关于while( ...

  7. ! cocos2d sprintf的问题

    char dong[100]; sprintf(dong,"%s","dongshen"); CCLOG(dong); 以上正确 char dong[100]; ...

  8. Js和asp.net各自设置的cookie相互读取的方法

       在Web的开发过程中,避免不了要使用cookie,在这里,我们在前台设置cookie,也可以在后台设置cookie,关键是在前后台设置的cookie,怎么去相互读取,代码如下:  (1)  前台 ...

  9. COJ0700 数学(一)

    试题描述 现在有一大堆数,请你对这些数进行检验. 输入 第一行:CAS,代表数据组数(不大于500000),以下CAS行,每行一个数字,保证在64位长整形范围内,并且没有负数.你需要对于每个数字检验是 ...

  10. SQL Server事务的隔离级别

    SQL Server事务的隔离级别 ########## 数据库中数据的一致性 ########## 针对并发事务出现的数据不一致性,提出了4个级别的解决方法:  隔离级别  第一类丢失更新  脏读 ...