一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
Project description
Protobuf Reconstructor
🔧 从JADX反编译的Java源码自动重构Protobuf .proto文件
一个强大的逆向工程工具,能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构。经过重大性能优化,执行效率提升20%+。
✨ 特性
- 🎯 精准解析: 基于Google Protobuf Lite字节码的逆向工程
- 🔄 递归依赖: 自动发现和处理所有依赖的消息和枚举类型
- 📦 完整支持: 支持oneof、repeated、map、枚举等所有Protobuf特性
- 🌐 通用性: 适用于任何Android应用,无需硬编码映射
- 🧠 智能推断: 从Java源码直接读取类型信息,确保高准确性
- 📝 标准输出: 严格遵循Google Proto Style Guide
- 🚀 高性能: 文件缓存系统 + 智能路径构造,执行速度提升20%+
- 🛠️ 特殊类型支持: MapFieldLite、Internal.ProtobufList、Google Well-Known Types
🛠️ 安装
# 克隆项目
git clone https://github.com/ys1231/reproto.git
cd reproto
# 安装依赖
pip install -r requirements.txt
📖 使用方法
基本用法
python main.py <java_sources_dir> <root_class> <output_dir> [--verbose]
参数说明
java_sources_dir: JADX反编译的Java源码目录路径root_class: 要重构的根类完整类名(如:com.example.Model)output_dir: 生成的proto文件输出目录路径--verbose: 显示详细处理信息
示例
# 重构消息应用的数据模型
python main.py ./out_jadx/sources com.example.messaging.v1.models.MessageData ./protos_generated --verbose
# 重构内部类
python main.py ./out_jadx/sources 'com.truecaller.accountonboarding.v1.Models$Onboarded' ./output --verbose
# 重构包含特殊类型的类
python main.py ./out_jadx/sources com.truecaller.search.v1.models.SearchResult ./output --verbose
🔍 工作原理
核心技术
- 字节码解析: 逆向工程Google Protobuf Lite的
newMessageInfo调用 - 依赖发现: 递归分析Java文件中的类型引用
- 智能推断: 基于字段名和对象数组推断枚举和消息类型
- 源码分析: 直接从Java源码读取真实的字段类型声明
- 🆕 性能优化: 文件缓存系统 + 直接路径构造,避免全目录扫描
解析流程
Java源码 → 字节码提取 → 类型解码 → 依赖发现 → 源码验证 → Proto生成
↓
🚀 性能优化: 文件缓存 + 智能路径构造 + 统一类型检测
📁 项目结构
reproto/
├── main.py # 主程序入口
├── core/ # 核心组件
│ ├── reconstructor.py # 主协调器 (已优化)
│ ├── info_decoder.py # 字节码解码器
│ └── bytecode_parser.py # 字节码解析工具
├── parsing/ # 解析模块
│ ├── java_parser.py # Java文件解析器
│ ├── enum_parser.py # 枚举解析器 (🆕)
│ └── java_source_analyzer.py # Java源码分析器 (已优化)
├── generation/ # 生成模块
│ └── proto_generator.py # Proto文件生成器
├── models/ # 数据模型
│ └── message_definition.py # 消息和枚举定义
├── utils/ # 工具函数 (大幅扩展)
│ ├── logger.py # 日志系统
│ ├── file_utils.py # 文件工具
│ ├── file_cache.py # 文件缓存系统 (🆕)
│ └── type_utils.py # 类型处理工具 (🆕)
└── logs/ # 日志文件目录
📊 输出示例
输入:Java源码
public final class BulkSearchResult extends GeneratedMessageLite {
private MapFieldLite<String, Contact> contacts_;
private Internal.ProtobufList<String> phoneNumbers_;
public static final int CONTACTS_FIELD_NUMBER = 1;
public static final int PHONE_NUMBERS_FIELD_NUMBER = 2;
}
输出:Proto文件
syntax = "proto3";
package com.truecaller.search.v1.models;
option java_package = "com.truecaller.search.v1.models";
option java_multiple_files = true;
message BulkSearchResult {
map<string, Contact> contacts = 1;
repeated string phone_numbers = 2;
}
🚀 性能优化亮点
🆕 重大性能提升
- 总执行时间: 从
81秒优化到65秒,提升 19.8% - 基础类型检测: 从2-3秒延迟优化为 瞬间响应,提升 99%+
- 索引系统: 移除未使用的索引系统,节省 100% 构建开销
- 文件I/O: 智能缓存系统,避免重复读取
🔧 技术优化
- 文件缓存系统: 线程安全的文件内容缓存,避免重复I/O
- 直接路径构造: 根据包名直接构造文件路径,避免全目录扫描
- 统一类型检测: 使用
TypeMapper统一处理所有类型转换 - 智能包名推断: 基于包结构的智能类名解析
📈 性能监控
📊 文件缓存统计:
总请求数: 33
缓存命中: 0 # 表明程序高效,无重复读取
缓存未命中: 33 # 每个文件只读取一次
已缓存文件: 33 # 所有文件已缓存备用
🛠️ 特殊类型支持
MapFieldLite 支持
// Java源码
private MapFieldLite<String, Contact> contacts_;
// 生成的Proto
map<string, Contact> contacts = 1;
Internal.ProtobufList 支持
// Java源码
private Internal.ProtobufList<String> tags_;
// 生成的Proto
repeated string tags = 1;
Google Well-Known Types
google.protobuf.Anygoogle.protobuf.Timestampgoogle.protobuf.Durationgoogle.protobuf.StringValue- 等等...
🚀 工作流程
- 使用JADX反编译Android应用:
jadx -d out_jadx app.apk - 运行ReProto指定根Protobuf类
- 自动解析所有相关类和依赖
- 🆕 智能缓存和路径优化,快速处理
- 生成完整的.proto文件结构
📝 配置选项
日志配置
- 日志文件自动保存到
./logs/目录 - 文件格式:
reproto-YYYY-MM-DD-HH-MM-SS.log - 使用
--verbose参数查看详细处理过程 - 🆕 性能统计和缓存监控信息
输出格式
生成的proto文件遵循Google Protobuf Style Guide:
- 文件名:
snake_case.proto - 字段名:
snake_case - 消息名:
PascalCase - 枚举值:
UPPER_SNAKE_CASE
🔧 开发
# 使用Poetry管理依赖
poetry install
poetry shell
# 运行测试
python main.py ../out_jadx/sources 'com.example.TestClass' ../test_output --verbose
# 性能测试
time python main.py ../out_jadx/sources com.truecaller.search.v1.models.SearchResult ../test_output
🐛 故障排除
常见问题
-
文件找不到错误
# 确保JADX输出目录正确 ls -la out_jadx/sources/com/example/
-
内存不足
# 对于大型应用,增加Java堆内存 export JAVA_OPTS="-Xmx4g"
-
性能问题
# 查看缓存统计,确认没有重复I/O grep "缓存统计" logs/reproto-*.log
📊 支持的Protobuf特性
| 特性 | 支持状态 | 示例 |
|---|---|---|
| 基础类型 | ✅ 完整支持 | string, int32, bool |
| 消息类型 | ✅ 完整支持 | Contact, UserInfo |
| 枚举类型 | ✅ 完整支持 | enum Status { ACTIVE = 0; } |
| repeated | ✅ 完整支持 | repeated string tags |
| map | ✅ 完整支持 | map<string, Contact> contacts |
| oneof | ✅ 完整支持 | oneof data { ... } |
| 嵌套消息 | ✅ 完整支持 | message Outer.Inner |
| Well-Known Types | ✅ 新增支持 | google.protobuf.Timestamp |
🎯 最新更新 (v2.0)
🚀 性能优化
- 移除未使用的索引系统,提升执行效率20%+
- 文件缓存系统,避免重复I/O操作
- 智能路径构造,避免全目录扫描
- 统一类型检测器,简化代码逻辑
🆕 新增功能
- MapFieldLite自动转换为标准map语法
- Internal.ProtobufList支持
- Google Protobuf Well-Known Types支持
- 增强的枚举解析器
- 详细的性能监控和统计
🔧 技术改进
- 代码复杂度显著降低
- 内存使用优化
- 错误处理增强
- 日志系统改进
📄 许可证
本项目为私有项目,仅供授权用户使用。
�� 现在就体验20%+的性能提升!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
reproto-0.1.1.tar.gz
(391.9 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
reproto-0.1.1-py3-none-any.whl
(432.5 kB
view details)
File details
Details for the file reproto-0.1.1.tar.gz.
File metadata
- Download URL: reproto-0.1.1.tar.gz
- Upload date:
- Size: 391.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.0 Linux/6.6.84-amd64-desktop-hwe
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2289d943c62dc5ddb4183baab5e35271561ee8c9a5554c50dbbc0c93805cd573
|
|
| MD5 |
3ed282478c250b6bc6237d67ef70ee5f
|
|
| BLAKE2b-256 |
27d38c3ccaf955b06c6bb70bdc025df41e73eac92ac5cc04faffbb60b20e9491
|
File details
Details for the file reproto-0.1.1-py3-none-any.whl.
File metadata
- Download URL: reproto-0.1.1-py3-none-any.whl
- Upload date:
- Size: 432.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.0 Linux/6.6.84-amd64-desktop-hwe
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7c6717e0d1b89bc5866efa6e20abbcbea7bc9de0244295c67a82a30de58191b0
|
|
| MD5 |
2b3450f67b172d17903e2c59dcd5c2ac
|
|
| BLAKE2b-256 |
ef64a5c9856dbd88d326348c3d01a4bfeb7b4e463218bcea292a3835826bdd61
|