1.摘要

为了弥补TPL(TLS Presentation Language),文章提出了增强的TPL语言(eTPL)。文章首先定义了一个二进制数据解析的生成模型。基于此,文章为TPL提供了一组可以捕获重要信息的语言结构。如果没有这些结构,TPL中的重要信息只能由人工“手动”获取。最后,文章提出两种软件工具:gmt-c++和etpl-tool。

2.创新点

2.1通用解析模型

受TLS固有的解析范式启发,开发此通用模型来解析TLS的复杂的二进制编码。

解析范式见tls不同版本的规范文档。例如RFC5246

2.1.1专用名词与概念解释
  • 解析(parsing):指二进制数据流转换成一种结构(树)表示的过程,在输入流解析时不能有任何跳变。
  • 序列化(serialization):相反的过程,从树表示转换为二进制流,通过深度优先的树遍历。
  • 类型(type):类型是解析数据的方法。类型可以是“原子的”,没有解析相关的子结构(例如整型或者不透明的原始数据an opaque blob of raw data);类型也可以是复合的(类似结构体,例如由不同字段组成的网络数据包)。
  • 字段(filed)类型的实例,通常由复合的类型定义。
  • 解析器(parser/dissector):类型解析方法的实现。复合类型的解析器将输入数据流交给子解析器。如果字段依赖于前面字段的解析结果,则相应的子解析器将被实时实例化。要解析的输入流可以以任意碎片的形式提供,即流中的中间不连续性不影响解析结果。
  • 长度(length)解析器在某个时间点上消耗的数据量。
  • 大小(size)解析器或者类型的目标值(可选)。
  • 溢出(overflow situation):所有解析器的子解析器已经满了,但是还有数据流要输入。
  • underflow situation:父解析器已满,但是不是所有的子解析器都满了。

image-20221028112948242

image-20221028114126692

2.1.2通用消息树(Generic Message Trees)

GMT是由解析器实现的消息的树形表示。

叶子节点与不能再解析的“元消息”有关。

除了静态和不可变的类型,GMT还拥有动态类型组件,可以由GMT在运行时解析的具体数据来确定。(select/case)

此外,GMT节点还有可扩展的元信息。

2.1.3 TPL & eTPL

TPL的定义不明确,可读性差。于是提出了加强型TPL(etpl),部分增强功能如下:

  • 类型字段的显示大小(Explicit size of types and fields)**:定义类型与字段的大小。
  • 类型参数化(Type parametrization):允许类型具有参数,并定义一个语言构造来在实例化类型时设置这些参数。整数类型的可接受数值限制(最小值/最大值)。
  • 动态解析上下文(Dynamic parsing context):引入了允许使用GMT提供的动态解析上下文的语言结构。解析上下文由嵌入了一个解析器的(部分增长的)GMT给出。具体元素(即GMT节点或与GMT节点相关联的元信息)使用相对于解析器在GMT中的位置的路径来引用。

3.复现

3.1 gmt-cpp

通用消息树(GMT)的c++实现。

  1. 下载库

    git clone https://github.com/phantax/gmt-cpp.git
  2. 下载 bitbuffers-cpp 库并创建软链接至gmt-cpp的目录。这里建议用绝对路径,否则会出现“链接层数过多”的问题。

    git clone https://github.com/phantax/bitbuffers-cpp.git
    ln -s home/mkh/bitbuffers-cpp home/mkh/gmt-cpp/bitbuffers-cpp
  3. 下载propertynode-cpp 库并创建软链接;与2同理

    git clone https://github.com/phantax/propertynode-cpp.git
    ln -s home/mkh/propertynode-cpp home/mkh/gmt-cpp/propertynode-cpp
  4. build

    cd gmt-cpp
    make deps
    make

gmt-cpp是一个在C++中实现gmt概念的库。为了使用这些代码,需要一个针对gmt-cpp链接的应用程序。
test/子目录中有一个测试应用程序,可以将其用作起点。为了构建和运行测试应用程序(在构建gmt-cpp库之后),键入

make test
./test/test

test.cpp源代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include "InternalNode.h"

#include "tls-with1.3.h"


using std::cout;
using std::endl;
using std::string;


int main(int argc , char *argv[]) {

// Hex representation of a TLS ClientHello message generated with OpenSSL.
string hex = "0x"
"160301012c01000128030340c70e243001b96d8c63687738696432d3e6f949"
"107aabad8450cdffd6a266e4000092c030c02cc028c024c014c00a00a3009f"
"006b006a0039003800880087c032c02ec02ac026c00fc005009d003d003500"
"84c02fc02bc027c023c013c00900a2009e0067004000330032009a00990045"
"0044c031c02dc029c025c00ec004009c003c002f00960041c011c007c00cc0"
"0200050004c012c00800160013c00dc003000a001500120009001400110008"
"0006000300ff0100006d000b000403000102000a00340032000e000d001900"
"0b000c00180009000a00160017000800060007001400150004000500120013"
"000100020003000f0010001100230000000d0020001e060106020603050105"
"020503040104020403030103020303020102020203000f000101";


VectorBuffer buf;

buf.appendFromString(hex);

TVector_MainType node;

node.dissector().dissectFromBuffer(buf);

node.print();


cout << endl << endl;


DataUnit* testnode = node.getByPath("**/ClientHello_extensions%/_V/~2");

cout << "~-2" << endl;
testnode->getSibling("~-2")->print();

cout << "~-1" << endl;
testnode->getSibling("~-1")->print();

cout << "~0" << endl;
testnode->getSibling("~0")->print();

cout << "~1" << endl;
testnode->getSibling("~1")->print();

cout << "~2" << endl;
testnode->getSibling("~2")->print();


cout << "~r-2" << endl;
testnode->getSibling("~r-2")->print();

cout << "~r-1" << endl;
testnode->getSibling("~r-1")->print();

cout << "~r0" << endl;
testnode->getSibling("~r0")->print();

cout << "~r1" << endl;
testnode->getSibling("~r1")->print();

cout << "~r2" << endl;
testnode->getSibling("~r2")->print();



return EXIT_SUCCESS;
}

运行结果

image-20221027155629256

3.2 etpl-tool

用etpl作为派生解析例程的描述语言。

we brieflfly presented a software tool that automatically generates C++ message parsers from eTPL defifinitions.

image-20221031145119569