如何逆向工程行车记录仪元数据

逆向工程 文件格式
2021-07-03 11:08:48

我正在尝试为来自 Roadhawk 行车记录仪的剪辑编写一个视频播放器,显示速度计和地图。我已经涵盖了基础知识,它播放视频和声音并从视频中提取原始元数据。

此原始元数据包括速度、GPS 坐标和重力。我的第一个目标是 Roadhawk DC2。Roadhawk 已经提供了用于执行此操作的软件,但它是闭源的。http://www.roadhawk.co.uk/roadhawk-dc2-software 我也许可以对软件,甚至相机固件进行逆向工程,但我想知道是否有更好的方法。

元数据存储在视频文件的字幕流中。我通过我的软件播放了一个一分钟的文件并转储了所有原始数据,并查看了现有软件中的同一个文件以获得第一帧的解码值。(由于现有软件中的搜索分辨率,确定超过第一帧很尴尬。这是我自己编写的一个原因。)

这一切似乎都是可打印的 ASCII 字符(大概是 qt-text 字幕编码系统的限制)。

查看所有数据时,我可以看到在最后三分之一的数据框中,一些文本大部分保持不变。在视频的最后三分之一中,汽车在一组灯前等待,这可能是 gforce 数据。这是我的调查所得。

我知道解码的帧如下所示:

.+;;;D=;-;6;;;;D;JP;4;;;=D;P?;O;;;=D=L;-HO71G>F=;;;JJF:FNJNBDL=R?F3F;;=;PDLR;;F0F;;=DRFJJ?DRJF??;J=LF;;;D;F:*59~

并像这样解码:

Gforce X = +0.108
       Y = +0.036
Lat      = 53.99020
Long     = -1.10792
Speed    = 2.0mph

捕获帧的完整列表在这里:http : //bitofahack.com/stuff/capture

我不认为这是任何特定的编码方法。它甚至可能有某种压缩,虽然我怀疑当我考虑到帧比所有数据都长时,只是作为一个长字符串打印出来。

我应该怎么做才能进一步调查?

1个回答

查看软件分发的文件,视频播放部分是通过Flowplayer完成的,嵌入在这些文件中:

assets/webthings/local_me.html
assets/webthings/local_me_OSM.html
assets/webthings/local_me_slowmo.html
assets/webthings/local_me_with_file_select.html

这些函数还控制更新 UI 字段 - 显然 flowplayer 通过回调提供字幕(标题)数据。搜索函数“parse_gps_data”。在函数“zgps_decode”中是实际的解码程序,它是一个简单的一对一替换。

执行:

#include <stdio.h>

const char *decode_table = "#I8XQWRVNZOYPUTA0B1C2SJ9K.L,M$D3E4F5G6H7";

void decode_in_place(char *s) {
    while (*s) {
        *s = decode_table[*s-43];
        s++;
    }
}

int main(void) {
    char data[] = ".+;;;D=;-;6;;;;D;JP;4;;;=D;P?;O;;;=D=L;-HO71G>F=;;;JJF:FNJNBDL=R?F3F;;=;PDLR;;F0F;;=DRFJJ?DRJF??;J=LF;;;D;F:*59~";
    decode_in_place(data);
    printf("%s", data);
    return 0;
}
// Output: X#000.1080Y0000.0360Z0001.0620G0001.1408$GPRMC,100033,A,5359.4172,N,00106.4700,W,001.7,332.73,220314,000.0,A

相同的 html 文件包含有关如何解释此数据的注释:

X0000.0000Y0000.0000Z0000.0000G0000.0000$GPRMC,UTS_Position,Status,Latitude,N/S,Longitude,E/W,Speed,Course_Over,Ground,Date,Magnetic_variation,Checksum~