我们将如何对从设备中提取的一组二进制数据进行反向工程?

时间:2020-03-06 14:32:55  来源:igfitidea点击:

我的一个朋友前一天提起这个问题,他最近购买了garmin心率监测器,该设备可以跟踪他的心率,并允许他将一天的心率统计信息上传到计算机。

唯一的问题是garmin USB设备没有linux驱动程序,他设法解释了一些数据,例如型号和他的用户详细信息,并确定了一些基本的二进制数据表,我们假设它们代表了一系列记录他的心率和记录时间。

当我们对结构一无所知时,逆向工程数据将从何处开始?

解决方案

我建议我们首先检查我们所在国家/地区的反向工程的合法性。大多数国家/地区对逆向工程设备和代码的允许和禁止有非常严格的法律。

我们可以使用计算机扬声器等来合成心跳吗? (我不知道这样的设备实际上是如何工作的)。观察二进制结果如何根据不同的输入而变化。

拆开设备并检查其中的内容可能也会有所帮助。

我将开始在十六进制编辑器中查看数据,希望它是一个能了解最常见编码(ASCII,Unicode等)的良好编码,然后尝试从我们知道的已存储数据中弄清楚它。

我遇到了同样的问题,最初在Google Code上找到了这个项目,该项目旨在完成Garmin设备的跨平台版本的工具...请参阅:http://code.google.com/p/garmintools/。该项目的首页上有一个指向我们所需协议的链接,Garmin考虑周全,可以公开发布这些协议。

这是Garmin I / O规范的直接链接:http://www.garmin.com/support/pdf/IOSDK.zip

正如另一位发布者所提到的那样,逆向工程可能不是实际的,而是合法的。

话虽如此,通过检出该项目及其代码,我们也许可以找到与根本问题相关的所有信息……而且它们也可以处理跑步者的心率/ GPS组合数据

http://www.gpsbabel.org/

我将从查看设备正在发送哪些数据开始,然后考虑如何表示和打包此类数据。

我将首先捕获许多样本,然后查看是否存在任何模式,因为心跳是有规律的,这表明它与心脏本身有关。我还将寻找单调递增的位字段,因为这将暗示某种时间戳。

形成关于什么地方的假设之后,我将编写一个程序对其进行测试并绘制结果图形,看看它是否有意义。如果不是,那么仔细检查可能会发现我们在此处或者那里需要一些缩放比例。我完全有可能需要先处理数据,然后再看起来像他们的程序显示的内容一样,即可能需要集成数据点。如果我收到垃圾,那么它又回到了绘图板上:-)

我还将检查制造商的网站,或者在其二进制文件上运行`strings'。寻找在生物医学工程领域工作的人也将列在我的名单上,因为他们可能知道通常使用的协议(如果有)。我还将寻找这些协议,看看是否可以将任何协议应用于我所看到的数据。

我将从创建数据的十六进制转储开始。图它可能被阻塞在一些2的幂的块中。开始寻找重复的图案。考虑一下他们可能正在发送什么样的数据。他们或者单独记录每个心跳,或者他们记录固定间隔发送的传感器。如果是单个拍子,那么将有一个时间增量(自上一拍起),持续时间以及某种最大或者平均强度。如果它是固定的时间间隔,那么它很可能是读数的简单向量。可能会有某种前言,带有开始时间戳和采样率。我们可以尝试自己解码时间戳,也可以尝试将其馈送到ctime()并查看它们是否使用标准的绝对时间格式。

请记住,许多廉价的A / D转换器仅产生12位输出,因此读数不太可能大于16位(并且高4位可能用于标记)。我建议重置设备,使其"空白",转储并存储内容,然后读取一组读数,记录结果(无论设备正常报告的内容),然后再次转储内容并尝试关联记录的结果在"空白"转储后出现的任何数据。