reproto 0.0.3__py3-none-any.whl → 0.0.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. .git/COMMIT_EDITMSG +24 -0
  2. .git/HEAD +1 -0
  3. .git/config +15 -0
  4. .git/description +1 -0
  5. .git/hooks/applypatch-msg.sample +15 -0
  6. .git/hooks/commit-msg.sample +24 -0
  7. .git/hooks/fsmonitor-watchman.sample +174 -0
  8. .git/hooks/post-update.sample +8 -0
  9. .git/hooks/pre-applypatch.sample +14 -0
  10. .git/hooks/pre-commit.sample +49 -0
  11. .git/hooks/pre-merge-commit.sample +13 -0
  12. .git/hooks/pre-push.sample +53 -0
  13. .git/hooks/pre-rebase.sample +169 -0
  14. .git/hooks/pre-receive.sample +24 -0
  15. .git/hooks/prepare-commit-msg.sample +42 -0
  16. .git/hooks/push-to-checkout.sample +78 -0
  17. .git/hooks/sendemail-validate.sample +77 -0
  18. .git/hooks/update.sample +128 -0
  19. .git/index +0 -0
  20. .git/info/exclude +6 -0
  21. .git/logs/HEAD +2 -0
  22. .git/logs/refs/heads/iyue +2 -0
  23. .git/logs/refs/remotes/gitlab/iyue +1 -0
  24. .git/logs/refs/remotes/origin/HEAD +1 -0
  25. .git/logs/refs/remotes/origin/iyue +1 -0
  26. .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc +0 -0
  27. .git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1 +0 -0
  28. .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0 +0 -0
  29. .git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37 +0 -0
  30. .git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d +0 -0
  31. .git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3 +0 -0
  32. .git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f +0 -0
  33. .git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a +0 -0
  34. .git/objects/ed/fb5bbf938de738d1f658f80e23c675bb8b3fae +0 -0
  35. .git/objects/ef/4844af55f7f64b8dd24b81b5a8322a8c80208e +0 -0
  36. .git/objects/f2/2bfffda9fb6a7f37bed04b7c40c9466ef09454 +0 -0
  37. .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.idx +0 -0
  38. .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack +0 -0
  39. .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev +0 -0
  40. .git/packed-refs +2 -0
  41. .git/refs/heads/iyue +1 -0
  42. .git/refs/remotes/gitlab/iyue +1 -0
  43. .git/refs/remotes/origin/HEAD +1 -0
  44. .git/refs/remotes/origin/iyue +1 -0
  45. .gitignore +142 -0
  46. .python-version +1 -0
  47. ARCHITECTURE.md +266 -0
  48. README.md +231 -0
  49. core/info_decoder.py +332 -10
  50. core/reconstructor.py +107 -3
  51. generation/proto_generator.py +34 -0
  52. main.py +172 -0
  53. parsing/enum_parser.py +4 -4
  54. parsing/java_parser.py +101 -1
  55. pyproject.toml +36 -0
  56. {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/METADATA +1 -1
  57. reproto-0.0.5.dist-info/RECORD +69 -0
  58. requirements.txt +3 -0
  59. reproto-0.0.3.dist-info/RECORD +0 -18
  60. {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/WHEEL +0 -0
  61. {reproto-0.0.3.dist-info → reproto-0.0.5.dist-info}/entry_points.txt +0 -0
ARCHITECTURE.md ADDED
@@ -0,0 +1,266 @@
1
+ # Protobuf Reconstructor 项目架构
2
+
3
+ ## 🏗️ 总体架构
4
+
5
+ 本项目采用模块化设计,将Protobuf逆向重构过程分解为多个独立的功能模块,确保代码的可维护性和可扩展性。
6
+
7
+ ```
8
+ ┌─────────────────────────────────────────────────────────────┐
9
+ │ main.py (入口点) │
10
+ ├─────────────────────────────────────────────────────────────┤
11
+ │ core/reconstructor.py │
12
+ │ (主协调器) │
13
+ ├─────────────────┬─────────────────┬─────────────────────────┤
14
+ │ parsing/ │ core/ │ generation/ │
15
+ │ java_parser.py │ info_decoder.py│ proto_generator.py │
16
+ │ (Java解析) │ (字节码解码) │ (Proto生成) │
17
+ ├─────────────────┼─────────────────┼─────────────────────────┤
18
+ │ models/message_definition.py │
19
+ │ (数据模型) │
20
+ ├─────────────────────────────────────────────────────────────┤
21
+ │ utils/ (工具模块) │
22
+ │ logger.py + file_utils.py │
23
+ └─────────────────────────────────────────────────────────────┘
24
+ ```
25
+
26
+ ## 📦 模块详解
27
+
28
+ ### 1. 入口层 (Entry Layer)
29
+
30
+ #### `main.py`
31
+ - **职责**: 命令行接口,参数解析,程序入口
32
+ - **功能**:
33
+ - 解析命令行参数
34
+ - 初始化日志系统
35
+ - 创建并启动重构器
36
+ - 错误处理和用户反馈
37
+
38
+ ### 2. 核心层 (Core Layer)
39
+
40
+ #### `core/reconstructor.py` - 主协调器
41
+ - **职责**: 整个重构流程的协调和管理
42
+ - **核心功能**:
43
+ - 类队列管理 (避免重复处理)
44
+ - 依赖发现和递归处理
45
+ - 模块间的协调调用
46
+ - 结果汇总和文件生成
47
+ - **设计模式**: 协调者模式 (Coordinator Pattern)
48
+
49
+ #### `core/info_decoder.py` - 字节码解码器
50
+ - **职责**: Google Protobuf Lite字节码的逆向解析
51
+ - **核心技术**:
52
+ - `newMessageInfo`字节码解码
53
+ - 字节码到Protobuf类型映射
54
+ - oneof字段识别 (通过`<`字符检测)
55
+ - 智能类型推断算法
56
+ - **技术突破**: 首次成功逆向Protobuf Lite字节码格式
57
+
58
+ ### 3. 解析层 (Parsing Layer)
59
+
60
+ #### `parsing/java_parser.py` - Java源码解析器
61
+ - **职责**: 从Java源码中提取Protobuf相关信息
62
+ - **功能**:
63
+ - `newMessageInfo`调用提取
64
+ - 字节码字符串和对象数组解析
65
+ - 枚举值提取
66
+ - 依赖类型发现
67
+
68
+ #### `parsing/java_source_analyzer.py` - Java源码分析器
69
+ - **职责**: 直接从Java源码读取真实类型信息
70
+ - **功能**:
71
+ - 字段类型声明分析
72
+ - setter方法分析
73
+ - import语句解析
74
+ - 类型名智能匹配
75
+
76
+ ### 4. 生成层 (Generation Layer)
77
+
78
+ #### `generation/proto_generator.py` - Proto文件生成器
79
+ - **职责**: 根据解析结果生成标准的.proto文件
80
+ - **功能**:
81
+ - 符合Google Style Guide的文件生成
82
+ - import语句智能管理
83
+ - 包结构自动推导
84
+ - Java选项自动设置
85
+
86
+ ### 5. 数据模型层 (Model Layer)
87
+
88
+ #### `models/message_definition.py`
89
+ - **包含类型**:
90
+ - `MessageDefinition`: 消息类型定义
91
+ - `FieldDefinition`: 字段定义
92
+ - `OneofDefinition`: oneof字段定义
93
+ - `EnumDefinition`: 枚举类型定义
94
+ - `EnumValueDefinition`: 枚举值定义
95
+
96
+ ### 6. 工具层 (Utility Layer)
97
+
98
+ #### `utils/logger.py`
99
+ - **职责**: 统一的日志管理
100
+ - **功能**: 基于loguru的日志系统
101
+
102
+ #### `utils/file_utils.py`
103
+ - **职责**: 文件操作工具
104
+ - **功能**: 文件读写、路径处理、目录创建
105
+
106
+ ## 🔄 数据流向
107
+
108
+ ```
109
+ 1. Java源码输入
110
+
111
+ 2. JavaParser 提取字节码信息
112
+
113
+ 3. InfoDecoder 解码字节码 → MessageDefinition/EnumDefinition
114
+
115
+ 4. Reconstructor 发现依赖 → 递归处理
116
+
117
+ 5. ProtoGenerator 生成.proto文件
118
+
119
+ 6. 文件输出
120
+ ```
121
+
122
+ ## 🧠 核心算法
123
+
124
+ ### 1. 字节码解码算法
125
+ ```python
126
+ # 字节码格式: [字段标签, 字段类型] 对
127
+ # 特殊字符 '<' (ord=60) 标识oneof字段
128
+ def decode_message_info(info_string, objects):
129
+ bytes_data = decode_unicode_escapes(info_string)
130
+ for i in range(10, len(bytes_data)-1, 2): # 跳过元数据
131
+ field_tag = bytes_data[i]
132
+ field_type = type_mapping[bytes_data[i+1]]
133
+ # 处理字段...
134
+ ```
135
+
136
+ ### 2. 依赖发现算法
137
+ ```python
138
+ # 递归依赖发现
139
+ def discover_dependencies(message_def):
140
+ for field in message_def.fields:
141
+ if field.type_name in custom_types:
142
+ full_class_name = resolve_type_name(field.type_name)
143
+ if full_class_name not in processed:
144
+ queue.append(full_class_name)
145
+ ```
146
+
147
+ ### 3. 智能类型推断算法
148
+ ```python
149
+ # 无硬编码的通用推断
150
+ def infer_type_from_field_name(field_name):
151
+ clean_name = field_name.rstrip('_')
152
+ if clean_name.endswith('info'):
153
+ return to_pascal_case(clean_name)
154
+ elif clean_name.endswith('data'):
155
+ return to_pascal_case(clean_name)
156
+ # ... 更多通用规则
157
+ ```
158
+
159
+ ## 🎯 设计原则
160
+
161
+ ### 1. 单一职责原则 (SRP)
162
+ - 每个模块只负责一个特定的功能
163
+ - InfoDecoder只负责字节码解码
164
+ - ProtoGenerator只负责文件生成
165
+
166
+ ### 2. 开放封闭原则 (OCP)
167
+ - 通过接口扩展功能,不修改现有代码
168
+ - 类型推断算法可以轻松添加新规则
169
+
170
+ ### 3. 依赖倒置原则 (DIP)
171
+ - 高层模块不依赖低层模块的具体实现
172
+ - 通过抽象接口进行交互
173
+
174
+ ### 4. 无硬编码原则
175
+ - 所有类型推断都基于通用算法
176
+ - 避免特定应用的硬编码映射
177
+
178
+ ## 🔧 可扩展性
179
+
180
+ ### 1. 新增字节码类型支持
181
+ 在`InfoDecoder.type_mapping`中添加新的映射:
182
+ ```python
183
+ self.type_mapping[new_type_code] = 'new_protobuf_type'
184
+ ```
185
+
186
+ ### 2. 新增类型推断规则
187
+ 在推断方法中添加新的模式匹配:
188
+ ```python
189
+ def infer_type_from_field_name(self, field_name):
190
+ # 添加新的推断规则
191
+ if field_name.endswith('new_pattern'):
192
+ return handle_new_pattern(field_name)
193
+ ```
194
+
195
+ ### 3. 新增输出格式
196
+ 继承`ProtoGenerator`并实现新的生成方法:
197
+ ```python
198
+ class CustomProtoGenerator(ProtoGenerator):
199
+ def generate_custom_format(self, message_def):
200
+ # 实现自定义格式生成
201
+ ```
202
+
203
+ ## 🚀 性能优化
204
+
205
+ ### 1. 队列去重
206
+ 使用set进行O(1)的重复检查:
207
+ ```python
208
+ processed_classes = set()
209
+ pending_classes = set()
210
+ ```
211
+
212
+ ### 2. 懒加载
213
+ 只在需要时才解析Java文件和生成proto文件
214
+
215
+ ### 3. 缓存机制
216
+ 缓存已解析的类型定义,避免重复解析
217
+
218
+ ## 🧪 测试策略
219
+
220
+ ### 1. 单元测试
221
+ - 每个模块独立测试
222
+ - 模拟输入数据进行测试
223
+
224
+ ### 2. 集成测试
225
+ - 端到端的完整流程测试
226
+ - 真实Android应用的测试用例
227
+
228
+ ### 3. 回归测试
229
+ - 对比生成结果与预期输出
230
+ - 确保修改不破坏现有功能
231
+
232
+ ## 📈 监控和日志
233
+
234
+ ### 1. 结构化日志
235
+ ```python
236
+ logger.info("开始处理类", class_name=class_name, field_count=len(fields))
237
+ logger.success("生成proto文件", file_path=output_path, size=file_size)
238
+ ```
239
+
240
+ ### 2. 性能监控
241
+ - 处理时间统计
242
+ - 内存使用监控
243
+ - 文件生成统计
244
+
245
+ ### 3. 错误追踪
246
+ - 详细的错误堆栈
247
+ - 上下文信息记录
248
+ - 失败重试机制
249
+
250
+ ## 🔮 未来扩展
251
+
252
+ ### 1. 多语言支持
253
+ - 支持生成其他语言的绑定代码
254
+ - 扩展到其他序列化格式
255
+
256
+ ### 2. GUI界面
257
+ - 可视化的操作界面
258
+ - 拖拽式的配置管理
259
+
260
+ ### 3. 云端处理
261
+ - 支持大规模批量处理
262
+ - 分布式解析能力
263
+
264
+ ### 4. AI增强
265
+ - 机器学习辅助类型推断
266
+ - 智能错误修复建议
README.md ADDED
@@ -0,0 +1,231 @@
1
+ # Protobuf Reconstructor
2
+
3
+ 🔧 **从JADX反编译的Java源码自动重构Protobuf .proto文件**
4
+
5
+ 一个强大的逆向工程工具,能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构。
6
+
7
+ ## ✨ 特性
8
+
9
+ - 🎯 **精准解析**: 基于Google Protobuf Lite字节码的逆向工程
10
+ - 🔄 **递归依赖**: 自动发现和处理所有依赖的消息和枚举类型
11
+ - 📦 **完整支持**: 支持oneof、repeated、map、枚举等所有Protobuf特性
12
+ - 🌐 **通用性**: 适用于任何Android应用,无需硬编码映射
13
+ - 🚀 **高效处理**: 智能队列管理,避免重复处理
14
+ - 🧠 **智能推断**: 从Java源码直接读取类型信息,确保100%准确性
15
+ - 📝 **标准输出**: 严格遵循Google Proto Style Guide
16
+ - 📊 **结构化日志**: 基于loguru的专业日志系统
17
+
18
+ ## 🛠️ 安装
19
+
20
+ ### 方法1:直接运行
21
+ ```bash
22
+ # 克隆项目
23
+ git clone git@github.com:ys1231/reproto.git
24
+ cd reproto
25
+
26
+ # 安装依赖
27
+ pip install -r requirements.txt
28
+
29
+ # 运行
30
+ python main.py <java_sources_dir> <root_class> <output_dir>
31
+ ```
32
+
33
+ ### 方法2:安装为包
34
+ ```bash
35
+ # 安装到系统
36
+ pip install -e .
37
+
38
+ # 使用命令行工具
39
+ proto-reconstructor <java_sources_dir> <root_class> <output_dir>
40
+ ```
41
+
42
+ ## 📖 使用方法
43
+
44
+ ### 基本用法
45
+ ```bash
46
+ python main.py ./out_jadx/sources com.example.Model ./protos_generated
47
+ ```
48
+
49
+ ### 完整参数
50
+ ```bash
51
+ python main.py <java_sources_dir> <root_class> <output_dir> [--log-dir LOG_DIR] [--help]
52
+ ```
53
+
54
+ ### 参数说明
55
+ - `java_sources_dir`: JADX反编译的Java源码目录路径
56
+ - `root_class`: 要重构的根类完整类名(如:com.example.Model)
57
+ - `output_dir`: 生成的proto文件输出目录路径
58
+ - `--log-dir`: 日志文件输出目录(默认:./logs)
59
+ - `--help`: 显示帮助信息
60
+
61
+ ### 示例
62
+ ```bash
63
+ # 重构示例消息应用的数据模型
64
+ python main.py ./out_jadx/sources com.example.messaging.v1.models.MessageData ./protos_generated
65
+
66
+ # 指定日志目录
67
+ python main.py ./out_jadx/sources com.example.Model ./output --log-dir ./my_logs
68
+
69
+ # 重构其他应用的模型
70
+ python main.py /path/to/jadx/sources com.myapp.data.UserProfile ./output
71
+ ```
72
+
73
+ ## 🔍 工作原理
74
+
75
+ ### 核心技术
76
+ 1. **字节码解析**: 逆向工程Google Protobuf Lite的`newMessageInfo`调用
77
+ 2. **依赖发现**: 递归分析Java文件中的类型引用
78
+ 3. **智能推断**: 基于字段名和对象数组推断枚举和消息类型
79
+ 4. **源码分析**: 直接从Java源码读取真实的字段类型声明
80
+ 5. **标准生成**: 生成符合Protobuf规范的.proto文件
81
+
82
+ ### 解析流程
83
+ ```
84
+ Java源码 → 字节码提取 → 类型解码 → 依赖发现 → 源码验证 → Proto生成
85
+ ```
86
+
87
+ ## 📁 项目结构
88
+
89
+ ```
90
+ proto_reconstructor/
91
+ ├── main.py # 主程序入口
92
+ ├── core/ # 核心组件
93
+ │ ├── reconstructor.py # 主协调器
94
+ │ └── info_decoder.py # 字节码解码器
95
+ ├── parsing/ # 解析模块
96
+ │ ├── java_parser.py # Java文件解析器
97
+ │ └── java_source_analyzer.py # Java源码分析器
98
+ ├── generation/ # 生成模块
99
+ │ └── proto_generator.py # Proto文件生成器
100
+ ├── models/ # 数据模型
101
+
102
+ ```
103
+
104
+ ## 工作流程
105
+
106
+ 1. 使用JADX反编译Android应用
107
+ 2. 运行ReProto指定根Protobuf类
108
+ 3. 自动解析所有相关类和依赖
109
+ 4. 生成完整的.proto文件结构
110
+
111
+ ## 输出示例
112
+
113
+ ### 输入:Java源码
114
+
115
+ ```java
116
+ public final class MessageData extends GeneratedMessageLite {
117
+ private int dataCase_;
118
+ private Object data_;
119
+
120
+ public enum DataCase {
121
+ TEXT_MESSAGE(1),
122
+ MEDIA_MESSAGE(2),
123
+ DATA_NOT_SET(0);
124
+
125
+ private final int value;
126
+
127
+ private DataCase(int value) {
128
+ this.value = value;
129
+ }
130
+ }
131
+
132
+ // 其他方法...
133
+ }
134
+ ```
135
+
136
+ ### 输出:Proto文件
137
+
138
+ ```protobuf
139
+ syntax = "proto3";
140
+
141
+ package com.example.messaging.v1.models;
142
+
143
+ import "com/example/messaging/v1/models/message_data.proto";
144
+ import "com/example/messaging/v1/models/conversation_data.proto";
145
+
146
+ option java_package = "com.example.messaging.v1.models";
147
+ option java_multiple_files = true;
148
+
149
+ message MessageData {
150
+ oneof data {
151
+ TextMessage text_message = 1;
152
+ MediaMessage media_message = 2;
153
+ }
154
+ }
155
+ ```
156
+
157
+ ## 开发环境设置
158
+
159
+ ### 使用Poetry
160
+
161
+ ```bash
162
+ # 安装Poetry
163
+ curl -sSL https://install.python-poetry.org | python3 -
164
+
165
+ # 安装项目依赖
166
+ poetry install
167
+
168
+ # 进入虚拟环境
169
+ poetry shell
170
+ ```
171
+
172
+ ## 项目结构
173
+
174
+ ```
175
+ reproto/
176
+ ├── core/ # 核心重构逻辑
177
+ ├── parsing/ # Java源码解析
178
+ ├── generation/ # Proto文件生成
179
+ ├── models/ # 数据模型定义
180
+ ├── utils/ # 工具函数
181
+ └── main.py # 入口点
182
+ ```
183
+
184
+ ## 🔧 配置选项
185
+
186
+ ### 日志配置
187
+ ```bash
188
+ # 指定日志目录
189
+ python main.py sources/ com.example.Model output/ --log-dir ./my_logs
190
+
191
+ # 日志文件格式: proto_reconstructor-YYYY-MM-DD-HH-MM-SS.log
192
+ # 例如: proto_reconstructor-2024-01-15-14-30-25.log
193
+ ```
194
+
195
+ ### 输出格式
196
+ 生成的proto文件遵循Google Protobuf Style Guide:
197
+ - 文件名使用`snake_case.proto`格式
198
+ - 字段名使用`snake_case`
199
+ - 消息名使用`PascalCase`
200
+ - 枚举值使用`UPPER_SNAKE_CASE`
201
+ - 正确的包结构和导入语句
202
+
203
+ ## 🏗️ 架构设计
204
+
205
+ 本项目采用模块化设计,详细的架构说明请参考 [ARCHITECTURE.md](./ARCHITECTURE.md)。
206
+
207
+ 核心模块:
208
+ - **Core Layer**: 主协调器 + 字节码解码器
209
+ - **Parsing Layer**: Java解析器 + 源码分析器
210
+ - **Generation Layer**: Proto文件生成器
211
+ - **Model Layer**: 数据定义模型
212
+ - **Utility Layer**: 日志系统 + 文件工具
213
+
214
+
215
+ ## 🤝 贡献
216
+
217
+ 欢迎提交Issue和Pull Request!
218
+
219
+ ### 代码规范
220
+ - 遵循PEP 8代码风格
221
+ - 使用类型注解
222
+ - 编写单元测试
223
+ - 更新文档
224
+
225
+ ## 🙏 致谢
226
+
227
+ - Google Protobuf团队提供的优秀框架
228
+ - JADX项目提供的反编译工具
229
+ - 逆向工程社区的技术支持
230
+
231
+ ---