-
-
[原创] 自动化提取protobuf结构体
-
发表于:
2025-3-11 20:16
5260
-
众所周知,国赛非常喜欢在题目中塞进protobuf来????人,所以简单搓了个脚本来梭哈proto
以2024年华北国赛半决赛的proc为例,简单复习一下

程序是个heap菜单题,输入会经过sub_1AA5
函数进行处理

这是一个protobuf的反序列化函数,proto的结构体在unk_3C60

简单对应一下,可知name
short_name
c_name
都是unk_2260
,即Msg
,package_name
则为空
其字段内容在values
,即off_3B80
处

只要把每个字段的name
type
找到,就可以复原出proto文件了
项目地址在此~
github
struct
ProtobufCEnumDescriptor {
uint32_t magic;
const
char
*name;
const
char
*short_name;
const
char
*c_name;
const
char
*package_name;
unsigned n_values;
const
ProtobufCEnumValue *values;
unsigned n_value_names;
const
ProtobufCEnumValueIndex *values_by_name;
unsigned n_value_ranges;
const
ProtobufCIntRange *value_ranges;
void
*reserved1;
void
*reserved2;
void
*reserved3;
void
*reserved4;
};
struct
ProtobufCEnumDescriptor {
uint32_t magic;
const
char
*name;
const
char
*short_name;
const
char
*c_name;
const
char
*package_name;
unsigned n_values;
const
ProtobufCEnumValue *values;
unsigned n_value_names;
const
ProtobufCEnumValueIndex *values_by_name;
unsigned n_value_ranges;
const
ProtobufCIntRange *value_ranges;
void
*reserved1;
void
*reserved2;
void
*reserved3;
void
*reserved4;
};
struct
ProtobufCFieldDescriptor {
const
char
*name;
uint32_t id;
ProtobufCLabel label;
ProtobufCType type;
unsigned quantifier_offset;
unsigned offset;
const
void
*descriptor;
const
void
*default_value;
uint32_t flags;
unsigned reserved_flags;
void
*reserved2;
void
*reserved3;
};
struct
ProtobufCFieldDescriptor {
const
char
*name;
uint32_t id;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课