一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
Project description
Protobuf Reconstructor
🔧 从JADX反编译的Java源码自动重构Protobuf .proto文件
一个强大的逆向工程工具,能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构。
✨ 特性
- 🎯 精准解析: 基于Google Protobuf Lite字节码的逆向工程
- 🔄 递归依赖: 自动发现和处理所有依赖的消息和枚举类型
- 📦 完整支持: 支持oneof、repeated、map、枚举等所有Protobuf特性
- 🌐 通用性: 适用于任何Android应用,无需硬编码映射
- 🚀 高效处理: 智能队列管理,避免重复处理
- 🧠 智能推断: 从Java源码直接读取类型信息,确保100%准确性
- 📝 标准输出: 严格遵循Google Proto Style Guide
- 📊 结构化日志: 基于loguru的专业日志系统
🛠️ 安装
方法1:直接运行
# 克隆项目
git clone git@github.com:ys1231/reproto.git
cd reproto
# 安装依赖
pip install -r requirements.txt
# 运行
python main.py <java_sources_dir> <root_class> <output_dir>
方法2:安装为包
# 安装到系统
pip install -e .
# 使用命令行工具
proto-reconstructor <java_sources_dir> <root_class> <output_dir>
📖 使用方法
基本用法
python main.py ./out_jadx/sources com.example.Model ./protos_generated
完整参数
python main.py <java_sources_dir> <root_class> <output_dir> [--log-dir LOG_DIR] [--help]
参数说明
java_sources_dir: JADX反编译的Java源码目录路径root_class: 要重构的根类完整类名(如:com.example.Model)output_dir: 生成的proto文件输出目录路径--log-dir: 日志文件输出目录(默认:./logs)--help: 显示帮助信息
示例
# 重构示例消息应用的数据模型
python main.py ./out_jadx/sources com.example.messaging.v1.models.MessageData ./protos_generated
# 指定日志目录
python main.py ./out_jadx/sources com.example.Model ./output --log-dir ./my_logs
# 重构其他应用的模型
python main.py /path/to/jadx/sources com.myapp.data.UserProfile ./output
🔍 工作原理
核心技术
- 字节码解析: 逆向工程Google Protobuf Lite的
newMessageInfo调用 - 依赖发现: 递归分析Java文件中的类型引用
- 智能推断: 基于字段名和对象数组推断枚举和消息类型
- 源码分析: 直接从Java源码读取真实的字段类型声明
- 标准生成: 生成符合Protobuf规范的.proto文件
解析流程
Java源码 → 字节码提取 → 类型解码 → 依赖发现 → 源码验证 → Proto生成
📁 项目结构
proto_reconstructor/
├── main.py # 主程序入口
├── core/ # 核心组件
│ ├── reconstructor.py # 主协调器
│ └── info_decoder.py # 字节码解码器
├── parsing/ # 解析模块
│ ├── java_parser.py # Java文件解析器
│ └── java_source_analyzer.py # Java源码分析器
├── generation/ # 生成模块
│ └── proto_generator.py # Proto文件生成器
├── models/ # 数据模型
工作流程
- 使用JADX反编译Android应用
- 运行ReProto指定根Protobuf类
- 自动解析所有相关类和依赖
- 生成完整的.proto文件结构
输出示例
输入:Java源码
public final class MessageData extends GeneratedMessageLite {
private int dataCase_;
private Object data_;
public enum DataCase {
TEXT_MESSAGE(1),
MEDIA_MESSAGE(2),
DATA_NOT_SET(0);
private final int value;
private DataCase(int value) {
this.value = value;
}
}
// 其他方法...
}
输出:Proto文件
syntax = "proto3";
package com.example.messaging.v1.models;
import "com/example/messaging/v1/models/message_data.proto";
import "com/example/messaging/v1/models/conversation_data.proto";
option java_package = "com.example.messaging.v1.models";
option java_multiple_files = true;
message MessageData {
oneof data {
TextMessage text_message = 1;
MediaMessage media_message = 2;
}
}
开发环境设置
使用Poetry
# 安装Poetry
curl -sSL https://install.python-poetry.org | python3 -
# 安装项目依赖
poetry install
# 进入虚拟环境
poetry shell
项目结构
reproto/
├── core/ # 核心重构逻辑
├── parsing/ # Java源码解析
├── generation/ # Proto文件生成
├── models/ # 数据模型定义
├── utils/ # 工具函数
└── main.py # 入口点
🔧 配置选项
日志配置
# 指定日志目录
python main.py sources/ com.example.Model output/ --log-dir ./my_logs
# 日志文件格式: proto_reconstructor-YYYY-MM-DD-HH-MM-SS.log
# 例如: proto_reconstructor-2024-01-15-14-30-25.log
输出格式
生成的proto文件遵循Google Protobuf Style Guide:
- 文件名使用
snake_case.proto格式 - 字段名使用
snake_case - 消息名使用
PascalCase - 枚举值使用
UPPER_SNAKE_CASE - 正确的包结构和导入语句
🏗️ 架构设计
本项目采用模块化设计,详细的架构说明请参考 ARCHITECTURE.md。
核心模块:
- Core Layer: 主协调器 + 字节码解码器
- Parsing Layer: Java解析器 + 源码分析器
- Generation Layer: Proto文件生成器
- Model Layer: 数据定义模型
- Utility Layer: 日志系统 + 文件工具
🤝 贡献
欢迎提交Issue和Pull Request!
代码规范
- 遵循PEP 8代码风格
- 使用类型注解
- 编写单元测试
- 更新文档
🙏 致谢
- Google Protobuf团队提供的优秀框架
- JADX项目提供的反编译工具
- 逆向工程社区的技术支持
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.0.5.tar.gz
(124.5 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.0.5-py3-none-any.whl
(144.7 kB
view details)
File details
Details for the file reproto-0.0.5.tar.gz.
File metadata
- Download URL: reproto-0.0.5.tar.gz
- Upload date:
- Size: 124.5 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 |
d8162e5b5ec9753bc1fb49c71db57161e8d3011661bde794eb6466da4d928477
|
|
| MD5 |
012e0e7dd3aa363a14e4a76211417e46
|
|
| BLAKE2b-256 |
640874a1d8ca063fc6d3c9f9d778e0b7854297d2eecd4810c81c5b36bc188e2e
|
File details
Details for the file reproto-0.0.5-py3-none-any.whl.
File metadata
- Download URL: reproto-0.0.5-py3-none-any.whl
- Upload date:
- Size: 144.7 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 |
c42b612714f396d81bd1be8b2ee9f4989559e83e58df365bb8a5d0bee2f55b02
|
|
| MD5 |
8a0d9b05734c5d92d972f4753e2d7f50
|
|
| BLAKE2b-256 |
005be5bbe14874e51eacc7c2e918a7da2a965d1367ad139149c4e5ddfe831955
|