binary - 如何对二进制 thrift 文件进行逆向工程?

标签 binary reverse-engineering thrift

我被要求处理一些序列化为二进制文件(不幸的是不是文本/JSON)Thrift对象,但我无权访问创建文件的程序或程序员,所以我不知道它们的结构、字段顺序等。有没有办法使用 Thrift 库打开二进制文件并分析它,获取字段类型、值、嵌套等的列表?

最佳答案

不幸的是,Thrift 的二进制协议(protocol)似乎根本没有对数据进行太多标记。解码它似乎假设你手头有 .thrift 文件,所以你知道,比如说,接下来的 4 个字节应该是一个整数,实际上不是浮点数的前半部分。因此,基本上,您似乎被困在十六进制编辑器(或等效)中查看文件并尝试根据您看到的确切模式推断字段。

有一些有用的位:

每个文件都以版本、协议(protocol)标识符字符串和序列号开头。映射将以 6 个字节开始,标识键和值类型(前两个字节,作为整数代码)加上元素数量作为 4 字节整数。类型代码似乎是标准的(它们定义的规范位置似乎是 Thrift 源中的 TProtocol.h,例如, bool 值由类型代码 2 指定,UTF-8 字符串由类型代码 16 指定,等等) .字符串以 4 字节整数长度字段为前缀,列表以类型(1 字节)和 4 字节长度为前缀。看起来所有整数字段都以大端方式保存,浮点数以 IEEE 格式保存(这应该使 double 数相对容易找到,至少)。

Thrift 中的 TBinaryProtocol* 文件有一些更有用的细节;从好的方面来说,有许多不同的实现,因此您可以阅读以您最熟悉的语言实现的那些。

抱歉,我知道这可能没有那么有用,但确实看起来这是 Thrift 二进制格式提供的所有信息;显然,二进制格式的设计目的是让您始终知道确切的协议(protocol)规范,并且目标是最小化线路空间,而不是使其易于盲目解码。

关于binary - 如何对二进制 thrift 文件进行逆向工程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1561693/

相关文章:

python - 在 Blender (python) 中从 Windows 剪贴板读取二进制数据

java - 是否有支持通过 websocket 传输二进制文件的 Java/JVM 服务器?

reverse-engineering - x64dbg 中的这个 "r8d"是什么?

windows - "Relative Virtual Addresses",相对于什么?

c++ - 是否可以将 Thrift 代码转换为 Async

c# - 我可以直接在 C# 中将存储为字符串的二进制文件写入二进制文件吗?

types - 为什么 Rust 中没有任意大小的二进制整数类型?

c++ - 有没有什么工具可以从可执行文件中提取基本 block 和CFG(控制流图)

crash - robolectric java.lang.NoClassDefFoundError:org/apache/thrift/b

c++ - 为什么我的 Threaded Thrift 调用速度很慢?