prrevers 1.1.0__tar.gz
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.
- prrevers-1.1.0/.gitignore +127 -0
- prrevers-1.1.0/LICENSE +21 -0
- prrevers-1.1.0/PKG-INFO +220 -0
- prrevers-1.1.0/README.md +150 -0
- prrevers-1.1.0/docs/ETHICS.en.md +77 -0
- prrevers-1.1.0/docs/ETHICS.ru.md +60 -0
- prrevers-1.1.0/docs/ROADMAP-V2.ru.md +564 -0
- prrevers-1.1.0/docs/ROADMAP.en.md +584 -0
- prrevers-1.1.0/docs/ROADMAP.ru.md +656 -0
- prrevers-1.1.0/docs/analysis/rea-comparison.ru.md +269 -0
- prrevers-1.1.0/docs/architecture.en.md +443 -0
- prrevers-1.1.0/docs/architecture.ru.md +345 -0
- prrevers-1.1.0/docs/cases/web-gold-rush.md +264 -0
- prrevers-1.1.0/docs/changelog.md +28 -0
- prrevers-1.1.0/docs/errors.md +106 -0
- prrevers-1.1.0/docs/external-tools.en.md +232 -0
- prrevers-1.1.0/docs/external-tools.ru.md +244 -0
- prrevers-1.1.0/docs/index.md +57 -0
- prrevers-1.1.0/docs/verification/2026-11-01-gold-rush-v1.0.0/receipt.json +243 -0
- prrevers-1.1.0/docs/verification/2026-11-01-gold-rush-v1.0.0/report.md +98 -0
- prrevers-1.1.0/docs/verification/2026-11-01-v1.1.0/receipt.json +243 -0
- prrevers-1.1.0/docs/verification/2026-11-01-v1.1.0/report.md +98 -0
- prrevers-1.1.0/pyproject.toml +301 -0
- prrevers-1.1.0/scripts/README.md +6 -0
- prrevers-1.1.0/src/prrevers/__init__.py +118 -0
- prrevers-1.1.0/src/prrevers/adapters/__init__.py +302 -0
- prrevers-1.1.0/src/prrevers/adapters/custom.py +177 -0
- prrevers-1.1.0/src/prrevers/adapters/gamemaker.py +57 -0
- prrevers-1.1.0/src/prrevers/adapters/godot.py +46 -0
- prrevers-1.1.0/src/prrevers/adapters/unity.py +172 -0
- prrevers-1.1.0/src/prrevers/adapters/unreal.py +44 -0
- prrevers-1.1.0/src/prrevers/adapters/web.py +123 -0
- prrevers-1.1.0/src/prrevers/analyzers/__init__.py +92 -0
- prrevers-1.1.0/src/prrevers/analyzers/citations.py +150 -0
- prrevers-1.1.0/src/prrevers/analyzers/llm.py +262 -0
- prrevers-1.1.0/src/prrevers/analyzers/prompts/__init__.py +122 -0
- prrevers-1.1.0/src/prrevers/analyzers/prompts/analyze_system_v1.txt +29 -0
- prrevers-1.1.0/src/prrevers/analyzers/prompts/analyze_system_v2.txt +29 -0
- prrevers-1.1.0/src/prrevers/analyzers/prompts/analyze_user_v1.txt +13 -0
- prrevers-1.1.0/src/prrevers/analyzers/prompts/analyze_user_v2.txt +18 -0
- prrevers-1.1.0/src/prrevers/analyzers/prompts/trace_system_v1.txt +35 -0
- prrevers-1.1.0/src/prrevers/analyzers/prompts/trace_user_v1.txt +19 -0
- prrevers-1.1.0/src/prrevers/cache.py +191 -0
- prrevers-1.1.0/src/prrevers/citation.py +174 -0
- prrevers-1.1.0/src/prrevers/cli.py +979 -0
- prrevers-1.1.0/src/prrevers/compare.py +334 -0
- prrevers-1.1.0/src/prrevers/constants.py +200 -0
- prrevers-1.1.0/src/prrevers/detectors/__init__.py +74 -0
- prrevers-1.1.0/src/prrevers/detectors/container.py +294 -0
- prrevers-1.1.0/src/prrevers/detectors/engine.py +44 -0
- prrevers-1.1.0/src/prrevers/detectors/platform.py +49 -0
- prrevers-1.1.0/src/prrevers/dynamic/__init__.py +79 -0
- prrevers-1.1.0/src/prrevers/dynamic/doc.py +261 -0
- prrevers-1.1.0/src/prrevers/dynamic/hooks.py +511 -0
- prrevers-1.1.0/src/prrevers/dynamic/runner.py +335 -0
- prrevers-1.1.0/src/prrevers/dynamic/trace.py +238 -0
- prrevers-1.1.0/src/prrevers/errors.py +147 -0
- prrevers-1.1.0/src/prrevers/extractors/__init__.py +155 -0
- prrevers-1.1.0/src/prrevers/extractors/apk.py +57 -0
- prrevers-1.1.0/src/prrevers/extractors/asar.py +463 -0
- prrevers-1.1.0/src/prrevers/extractors/assets.py +389 -0
- prrevers-1.1.0/src/prrevers/extractors/base.py +168 -0
- prrevers-1.1.0/src/prrevers/extractors/ghidra.py +363 -0
- prrevers-1.1.0/src/prrevers/extractors/il2cpp.py +180 -0
- prrevers-1.1.0/src/prrevers/extractors/ilspy.py +103 -0
- prrevers-1.1.0/src/prrevers/extractors/mono.py +111 -0
- prrevers-1.1.0/src/prrevers/extractors/unreal.py +365 -0
- prrevers-1.1.0/src/prrevers/extractors/zip.py +249 -0
- prrevers-1.1.0/src/prrevers/ghidra_scripts/PrReversDecompileExport.py +185 -0
- prrevers-1.1.0/src/prrevers/llm.py +1146 -0
- prrevers-1.1.0/src/prrevers/mcp_server.py +107 -0
- prrevers-1.1.0/src/prrevers/mcp_tools.py +397 -0
- prrevers-1.1.0/src/prrevers/models.py +321 -0
- prrevers-1.1.0/src/prrevers/oracles/__init__.py +70 -0
- prrevers-1.1.0/src/prrevers/oracles/asset.py +230 -0
- prrevers-1.1.0/src/prrevers/oracles/base.py +93 -0
- prrevers-1.1.0/src/prrevers/oracles/binfmt.py +174 -0
- prrevers-1.1.0/src/prrevers/oracles/bytematch.py +182 -0
- prrevers-1.1.0/src/prrevers/oracles/citation.py +179 -0
- prrevers-1.1.0/src/prrevers/oracles/comparison.py +291 -0
- prrevers-1.1.0/src/prrevers/oracles/cs_check.py +71 -0
- prrevers-1.1.0/src/prrevers/oracles/detection.py +109 -0
- prrevers-1.1.0/src/prrevers/oracles/extraction.py +101 -0
- prrevers-1.1.0/src/prrevers/oracles/level.py +439 -0
- prrevers-1.1.0/src/prrevers/oracles/manifest.py +133 -0
- prrevers-1.1.0/src/prrevers/oracles/roundtrip.py +313 -0
- prrevers-1.1.0/src/prrevers/oracles/trace.py +187 -0
- prrevers-1.1.0/src/prrevers/oracles/tscn.py +146 -0
- prrevers-1.1.0/src/prrevers/pipeline.py +778 -0
- prrevers-1.1.0/src/prrevers/repl.py +271 -0
- prrevers-1.1.0/src/prrevers/session.py +243 -0
- prrevers-1.1.0/src/prrevers/synthesizers/__init__.py +78 -0
- prrevers-1.1.0/src/prrevers/synthesizers/base.py +64 -0
- prrevers-1.1.0/src/prrevers/synthesizers/csharp.py +231 -0
- prrevers-1.1.0/src/prrevers/synthesizers/design_doc.py +84 -0
- prrevers-1.1.0/src/prrevers/synthesizers/gdscript.py +200 -0
- prrevers-1.1.0/src/prrevers/synthesizers/levels.py +792 -0
- prrevers-1.1.0/src/prrevers/synthesizers/shaders.py +355 -0
- prrevers-1.1.0/src/prrevers/synthesizers/textutil.py +28 -0
- prrevers-1.1.0/src/prrevers/tools.py +423 -0
- prrevers-1.1.0/src/prrevers/utils/__init__.py +8 -0
- prrevers-1.1.0/src/prrevers/utils/logging.py +19 -0
- prrevers-1.1.0/src/prrevers/utils/paths.py +55 -0
- prrevers-1.1.0/tests/__init__.py +1 -0
- prrevers-1.1.0/tests/golden/README.md +55 -0
- prrevers-1.1.0/tests/golden/unity-il2cpp-apk/README.md +32 -0
- prrevers-1.1.0/tests/golden/unity-il2cpp-apk/expected.json +15 -0
- prrevers-1.1.0/tests/golden/unity-il2cpp-apk/input/game.apk +0 -0
- prrevers-1.1.0/tests/golden/unity-il2cpp-apk/provenance.json +25 -0
- prrevers-1.1.0/tests/golden/unity-mono-win/README.md +30 -0
- prrevers-1.1.0/tests/golden/unity-mono-win/expected.json +14 -0
- prrevers-1.1.0/tests/golden/unity-mono-win/input/Game.exe +0 -0
- prrevers-1.1.0/tests/golden/unity-mono-win/input/Game_Data/Managed/Assembly-CSharp.dll +0 -0
- prrevers-1.1.0/tests/golden/unity-mono-win/input/Game_Data/Managed/UnityEngine.CoreModule.dll +0 -0
- prrevers-1.1.0/tests/golden/unity-mono-win/provenance.json +33 -0
- prrevers-1.1.0/tests/golden/web-electron/README.md +34 -0
- prrevers-1.1.0/tests/golden/web-electron/expected.json +15 -0
- prrevers-1.1.0/tests/golden/web-electron/input/app.asar +0 -0
- prrevers-1.1.0/tests/golden/web-electron/input/app.asar.unpacked/native/game.node +0 -0
- prrevers-1.1.0/tests/golden/web-electron/provenance.json +29 -0
- prrevers-1.1.0/tests/golden/web-electron-install/README.md +29 -0
- prrevers-1.1.0/tests/golden/web-electron-install/expected.json +14 -0
- prrevers-1.1.0/tests/golden/web-electron-install/input/Game.exe +0 -0
- prrevers-1.1.0/tests/golden/web-electron-install/input/resources/app.asar +0 -0
- prrevers-1.1.0/tests/golden/web-electron-install/input/resources/app.asar.unpacked/native/game.node +0 -0
- prrevers-1.1.0/tests/golden/web-electron-install/provenance.json +33 -0
- prrevers-1.1.0/tests/golden/web-gold-rush/README.md +45 -0
- prrevers-1.1.0/tests/golden/web-gold-rush/expected.json +15 -0
- prrevers-1.1.0/tests/golden/web-gold-rush/input/GoldRush.asar +0 -0
- prrevers-1.1.0/tests/golden/web-gold-rush/provenance.json +25 -0
- prrevers-1.1.0/tests/unit/__init__.py +1 -0
- prrevers-1.1.0/tests/unit/native_fixtures.py +233 -0
- prrevers-1.1.0/tests/unit/test_adapters.py +456 -0
- prrevers-1.1.0/tests/unit/test_analyzers.py +207 -0
- prrevers-1.1.0/tests/unit/test_assets.py +712 -0
- prrevers-1.1.0/tests/unit/test_cache.py +130 -0
- prrevers-1.1.0/tests/unit/test_citation.py +144 -0
- prrevers-1.1.0/tests/unit/test_citation_extraction.py +148 -0
- prrevers-1.1.0/tests/unit/test_citation_oracle.py +169 -0
- prrevers-1.1.0/tests/unit/test_cli.py +618 -0
- prrevers-1.1.0/tests/unit/test_compare.py +525 -0
- prrevers-1.1.0/tests/unit/test_csharp_synth.py +276 -0
- prrevers-1.1.0/tests/unit/test_detectors.py +341 -0
- prrevers-1.1.0/tests/unit/test_dynamic_doc.py +284 -0
- prrevers-1.1.0/tests/unit/test_dynamic_hooks.py +372 -0
- prrevers-1.1.0/tests/unit/test_dynamic_runner.py +486 -0
- prrevers-1.1.0/tests/unit/test_errors.py +142 -0
- prrevers-1.1.0/tests/unit/test_extractors.py +1738 -0
- prrevers-1.1.0/tests/unit/test_gdscript_synth.py +258 -0
- prrevers-1.1.0/tests/unit/test_golden.py +207 -0
- prrevers-1.1.0/tests/unit/test_levels.py +779 -0
- prrevers-1.1.0/tests/unit/test_llm.py +1550 -0
- prrevers-1.1.0/tests/unit/test_mcp.py +449 -0
- prrevers-1.1.0/tests/unit/test_models.py +60 -0
- prrevers-1.1.0/tests/unit/test_oracles.py +741 -0
- prrevers-1.1.0/tests/unit/test_pipeline.py +1064 -0
- prrevers-1.1.0/tests/unit/test_prompts.py +142 -0
- prrevers-1.1.0/tests/unit/test_public_api.py +228 -0
- prrevers-1.1.0/tests/unit/test_repl.py +237 -0
- prrevers-1.1.0/tests/unit/test_session.py +159 -0
- prrevers-1.1.0/tests/unit/test_shaders.py +265 -0
- prrevers-1.1.0/tests/unit/test_synthesizers.py +90 -0
- prrevers-1.1.0/tests/unit/test_tools.py +602 -0
- prrevers-1.1.0/tests/unit/test_trace_oracle.py +176 -0
- prrevers-1.1.0/tests/unit/test_unreal.py +512 -0
- prrevers-1.1.0/tests/unit/test_utils.py +37 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# --- Python ---
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
develop-eggs/
|
|
9
|
+
dist/
|
|
10
|
+
downloads/
|
|
11
|
+
eggs/
|
|
12
|
+
.eggs/
|
|
13
|
+
lib/
|
|
14
|
+
lib64/
|
|
15
|
+
parts/
|
|
16
|
+
sdist/
|
|
17
|
+
var/
|
|
18
|
+
wheels/
|
|
19
|
+
share/python-wheels/
|
|
20
|
+
*.egg-info/
|
|
21
|
+
.installed.cfg
|
|
22
|
+
*.egg
|
|
23
|
+
MANIFEST
|
|
24
|
+
|
|
25
|
+
# --- Virtualenvs ---
|
|
26
|
+
.venv/
|
|
27
|
+
venv/
|
|
28
|
+
env/
|
|
29
|
+
ENV/
|
|
30
|
+
.python-version
|
|
31
|
+
|
|
32
|
+
# --- Testing & coverage ---
|
|
33
|
+
.pytest_cache/
|
|
34
|
+
.coverage
|
|
35
|
+
.coverage.*
|
|
36
|
+
htmlcov/
|
|
37
|
+
.tox/
|
|
38
|
+
.nox/
|
|
39
|
+
coverage.xml
|
|
40
|
+
*.cover
|
|
41
|
+
.cache
|
|
42
|
+
nosetests.xml
|
|
43
|
+
|
|
44
|
+
# --- Type checkers ---
|
|
45
|
+
.mypy_cache/
|
|
46
|
+
.ruff_cache/
|
|
47
|
+
.pyre/
|
|
48
|
+
.pytype/
|
|
49
|
+
|
|
50
|
+
# --- IDEs ---
|
|
51
|
+
.vscode/
|
|
52
|
+
.idea/
|
|
53
|
+
*.swp
|
|
54
|
+
*.swo
|
|
55
|
+
*~
|
|
56
|
+
.DS_Store
|
|
57
|
+
Thumbs.db
|
|
58
|
+
|
|
59
|
+
# --- Jupyter ---
|
|
60
|
+
.ipynb_checkpoints
|
|
61
|
+
*.ipynb
|
|
62
|
+
|
|
63
|
+
# --- Project-specific: never commit game data ---
|
|
64
|
+
tests/golden/**/*.apk
|
|
65
|
+
tests/golden/**/*.exe
|
|
66
|
+
tests/golden/**/*.dll
|
|
67
|
+
tests/golden/**/*.so
|
|
68
|
+
tests/golden/**/*.bin
|
|
69
|
+
tests/golden/**/*.obb
|
|
70
|
+
tests/golden/**/*.pak
|
|
71
|
+
tests/golden/**/*.pck
|
|
72
|
+
tests/golden/**/*.ipa
|
|
73
|
+
tests/golden/**/extracted/
|
|
74
|
+
|
|
75
|
+
# But DO commit small synthetic fixtures
|
|
76
|
+
!tests/golden/**/fixture.zip
|
|
77
|
+
!tests/golden/**/*.json
|
|
78
|
+
!tests/golden/**/*.ksy
|
|
79
|
+
!tests/golden/**/README.md
|
|
80
|
+
|
|
81
|
+
# Синтетические PE-файлы golden-фикстур e2e-тестов: 62-байтные MZ-заглушки
|
|
82
|
+
# и сборки из нулей — НЕ game data. Каждая строка явная и точная, чтобы
|
|
83
|
+
# случайно закоммитить настоящий .exe/.dll было невозможно.
|
|
84
|
+
!tests/golden/unity-mono-win/input/Game.exe
|
|
85
|
+
!tests/golden/unity-mono-win/input/Game_Data/Managed/Assembly-CSharp.dll
|
|
86
|
+
!tests/golden/unity-mono-win/input/Game_Data/Managed/UnityEngine.CoreModule.dll
|
|
87
|
+
!tests/golden/web-electron-install/input/Game.exe
|
|
88
|
+
# Синтетический IL2CPP APK (~1 КБ, 4 записи-заглушки из нулей) — НЕ game
|
|
89
|
+
# data; см. tests/golden/unity-il2cpp-apk/README.md.
|
|
90
|
+
!tests/golden/unity-il2cpp-apk/input/game.apk
|
|
91
|
+
|
|
92
|
+
# --- Secrets & tokens — never commit ---
|
|
93
|
+
.env
|
|
94
|
+
.env.*
|
|
95
|
+
*.pem
|
|
96
|
+
*.key
|
|
97
|
+
secrets/
|
|
98
|
+
credentials.json
|
|
99
|
+
token.json
|
|
100
|
+
|
|
101
|
+
# --- Output of extraction runs ---
|
|
102
|
+
output/
|
|
103
|
+
extracted/
|
|
104
|
+
exports/
|
|
105
|
+
work/
|
|
106
|
+
tmp/
|
|
107
|
+
*.tmp
|
|
108
|
+
|
|
109
|
+
# Рабочий каталог CLI/MCP по умолчанию (cli.py, mcp_server.py):
|
|
110
|
+
# любое «prrevers …» сыплет туда распакованные ассеты — в коммит
|
|
111
|
+
# этому месту нечего попадать, поэтому игнорируется весь каталог.
|
|
112
|
+
prrevers-out/
|
|
113
|
+
|
|
114
|
+
# --- OS ---
|
|
115
|
+
.DS_Store
|
|
116
|
+
Thumbs.db
|
|
117
|
+
|
|
118
|
+
# --- Logs ---
|
|
119
|
+
*.log
|
|
120
|
+
logs/
|
|
121
|
+
|
|
122
|
+
# uv.lock не хранится в репозитории (решение 686b44e):
|
|
123
|
+
# зависимости фиксирует CI через pip + pyproject constraints.
|
|
124
|
+
uv.lock
|
|
125
|
+
|
|
126
|
+
# Сборка документационного сайта (mkdocs build) — артефакт, не исходник.
|
|
127
|
+
site/
|
prrevers-1.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pradushkoai
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
prrevers-1.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: prrevers
|
|
3
|
+
Version: 1.1.0
|
|
4
|
+
Summary: AI-assisted reverse engineering toolkit for game developers — Windows & Android.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Pradushkoai/PRRevers
|
|
6
|
+
Project-URL: Repository, https://github.com/Pradushkoai/PRRevers
|
|
7
|
+
Project-URL: Issues, https://github.com/Pradushkoai/PRRevers/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/Pradushkoai/PRRevers/releases
|
|
9
|
+
Author: Pradushkoai
|
|
10
|
+
License: MIT License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 Pradushkoai
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Keywords: android,decompilation,games,godot,llm,mcp,reverse-engineering,unity,unreal,windows
|
|
33
|
+
Classifier: Development Status :: 4 - Beta
|
|
34
|
+
Classifier: Intended Audience :: Developers
|
|
35
|
+
Classifier: Intended Audience :: Science/Research
|
|
36
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
37
|
+
Classifier: Operating System :: OS Independent
|
|
38
|
+
Classifier: Programming Language :: Python :: 3
|
|
39
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
41
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
42
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
43
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
44
|
+
Classifier: Topic :: Games/Entertainment
|
|
45
|
+
Classifier: Topic :: Security
|
|
46
|
+
Classifier: Topic :: Software Development :: Disassemblers
|
|
47
|
+
Requires-Python: >=3.10
|
|
48
|
+
Requires-Dist: click>=8.1
|
|
49
|
+
Requires-Dist: platformdirs>=4.0
|
|
50
|
+
Requires-Dist: pydantic>=2.6
|
|
51
|
+
Requires-Dist: rich>=13.7
|
|
52
|
+
Provides-Extra: assets
|
|
53
|
+
Requires-Dist: unitypy>=1.20; extra == 'assets'
|
|
54
|
+
Provides-Extra: dev
|
|
55
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
56
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
57
|
+
Requires-Dist: pre-commit>=3.7; extra == 'dev'
|
|
58
|
+
Requires-Dist: pytest-cov>=4.1; extra == 'dev'
|
|
59
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
60
|
+
Requires-Dist: ruff~=0.6.9; extra == 'dev'
|
|
61
|
+
Requires-Dist: types-click; extra == 'dev'
|
|
62
|
+
Provides-Extra: docs
|
|
63
|
+
Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
|
|
64
|
+
Requires-Dist: mkdocs>=1.6; extra == 'docs'
|
|
65
|
+
Provides-Extra: frida
|
|
66
|
+
Requires-Dist: frida>=16.0.0; extra == 'frida'
|
|
67
|
+
Provides-Extra: mcp
|
|
68
|
+
Requires-Dist: mcp>=1.2; extra == 'mcp'
|
|
69
|
+
Description-Content-Type: text/markdown
|
|
70
|
+
|
|
71
|
+
# PRRevers
|
|
72
|
+
|
|
73
|
+
> AI-ассистированный тулз для **гейм-девов**: извлекает механики, ассеты и форматы данных из Windows и Android игр, чтобы учиться у них и вдохновляться на собственные проекты.
|
|
74
|
+
|
|
75
|
+
[](https://github.com/Pradushkoai/PRRevers/actions/workflows/ci.yml)
|
|
76
|
+
[](https://www.python.org/downloads/)
|
|
77
|
+
[](LICENSE)
|
|
78
|
+
[](https://docs.astral.sh/ruff/)
|
|
79
|
+
|
|
80
|
+
PRRevers — **не** декомпилятор, **не** дизассемблер и **не** замена тулзам вроде Ghidra, IDA, AssetRipper или Il2CppDumper. Это **оркестратор**: он связывает эти тулзы вместе, определяет движок, извлекает код/ассеты/данные и использует LLM-агента, чтобы объяснить механики и сгенерировать дизайн-доки, пригодные для использования в вашей собственной игре.
|
|
81
|
+
|
|
82
|
+
> **Этика и легальность.** PRRevers предназначен **исключительно для исследований и обучения**. Анализируйте только те игры, которыми вы законно владеете или на которые у вас есть явное разрешение на реверс-инжиниринг. Не распространяйте извлечённый код или ассеты. Прочитайте [docs/ETHICS.ru.md](docs/ETHICS.ru.md) перед использованием.
|
|
83
|
+
|
|
84
|
+
> **English version:** [README.en.md](README.en.md)
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Режимы работы
|
|
89
|
+
|
|
90
|
+
PRRevers предоставляет шесть CLI-режимов, каждый как отдельная подкоманду:
|
|
91
|
+
|
|
92
|
+
| Команда | Что делает | Когда использовать |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `prrevers inspect <file>` | Разовый прогон: детект движка → экстракция → декомпиляция → анализ → дизайн-док | Быстрый обзор одной игры |
|
|
95
|
+
| `prrevers session <file>` | Интерактивный REPL: детект + экстракция один раз, дальше задаёте вопросы | Глубокое изучение игры |
|
|
96
|
+
| `prrevers compare <a> <b>` | Side-by-side сравнение двух игр: таблица механик, diff дизайн-доков, отчёт `compare/<a>-vs-<b>.md` | Выбор между стратегиями реализации |
|
|
97
|
+
| `prrevers trace <file>` | Динамика: аттач к запущенной игре (Frida), хуки из статики, трейс → дизайн-док | Наблюдение механик в рантайме |
|
|
98
|
+
| `prrevers mcp serve` | MCP-сервер: инструменты PRRevers для Claude Code / Cursor | LLM-агент вместо CLI |
|
|
99
|
+
| `prrevers catalog <dir>` | Batch-детект движка для каждого файла в директории, таблица | Кураторская библиотека референсов |
|
|
100
|
+
|
|
101
|
+
Утилиты: `prrevers tools install/list` (установка внешних тулзов в user data dir и статус), `prrevers version`.
|
|
102
|
+
|
|
103
|
+
Полное описание — в [docs/architecture.ru.md § Режимы работы](docs/architecture.ru.md).
|
|
104
|
+
|
|
105
|
+
## Зачем это нужно?
|
|
106
|
+
|
|
107
|
+
Реверс-инжиниринг игры, чтобы у неё поучиться — это мультитулзовая, многодневная рутина:
|
|
108
|
+
|
|
109
|
+
1. Определить движок (Unity Mono / IL2CPP / Unreal / Godot / кастомный).
|
|
110
|
+
2. Распаковать контейнер (APK / PAK / PCK / OBB).
|
|
111
|
+
3. Запустить правильный экстрактор под правильный формат.
|
|
112
|
+
4. Открыть результат в Ghidra / dnSpy / UModel.
|
|
113
|
+
5. Смотреть на тысячи классов и функций, чтобы найти одну механику, которая вас интересует.
|
|
114
|
+
|
|
115
|
+
PRRevers автоматизирует шаги 1–3 и добавляет LLM-агента поверх 4–5, который может отвечать на вопросы вроде *«как работает инвентарь в этой игре?»* и генерировать дизайн-док.
|
|
116
|
+
|
|
117
|
+
## Архитектура
|
|
118
|
+
|
|
119
|
+
Пайплайн состоит из 4 этапов плюс слой оракулов, который независимо проверяет каждый этап:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
[файл] → Детекторы → Экстракторы → Анализаторы (LLM) → Синтезаторы → [ваш проект]
|
|
123
|
+
↑
|
|
124
|
+
Оракулы (проверяют каждый этап)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Ключевые архитектурные решения:
|
|
128
|
+
|
|
129
|
+
- **Плагин-система движков** через протокол `EngineAdapter` + `entry_points`. Добавить новый движок теперь можно без правки ядра.
|
|
130
|
+
- **Типизированная модель `Citation`** вместо `list[str]` в evidence — верифицируется `CitationOracle`.
|
|
131
|
+
- **Протокол `LLMBackend`** — любой класс, реализующий протокол, можно подключить.
|
|
132
|
+
- **Content-addressed кэш** — повторный запуск на том же входе почти мгновенный.
|
|
133
|
+
- **Сессии** — интерактивный REPL с сохраняемой историей Q&A.
|
|
134
|
+
- **Stage-level оракулы** — `DetectionOracle` (согласованность вердикта), `ExtractionOracle` (заявленные файлы против реальной ФС) и `RoundTripOracle` (побайтовая сверка с оригинальным архивом + SHA256-integrity) проверяют этапы сразу после выполнения.
|
|
135
|
+
- **Pure-Python экстракторы** — stdlib `zipfile`/`shutil`/`json`+`struct` покрывают ZIP-контейнеры, Unity-layout и Electron `app.asar` без установки apktool; первая обёртка над внешним тулзом — ILSpy (`prrevers tools install ilspy`) — превращает Mono-сборки в читаемый C#.
|
|
136
|
+
|
|
137
|
+
Полное обоснование архитектуры: [docs/architecture.ru.md](docs/architecture.ru.md).
|
|
138
|
+
|
|
139
|
+
## Документация
|
|
140
|
+
|
|
141
|
+
Документационный сайт (mkdocs-material): архитектура, роадмап, внешние
|
|
142
|
+
тулзы, этика, кейсы — с навигацией и поиском.
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
uv sync --extra docs # или: pip install -e ".[docs]"
|
|
146
|
+
mkdocs serve # localhost:8000
|
|
147
|
+
mkdocs build --strict # проверка: битые ссылки ломают сборку (и CI)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
CI собирает сайт в strict-режиме на каждый push.
|
|
151
|
+
|
|
152
|
+
## Статус
|
|
153
|
+
|
|
154
|
+
`main` — закрыты v0.1.0 (Unity Mono + web-игры end-to-end), v0.2.0 (IL2CPP: Il2CppDumper + Ghidra headless), v0.3.0 (LLM-анализатор: Ollama / OpenAI / Anthropic / GigaChat / LiteLLM, цитаты `file:line`), v0.4.0 (REPL-сессии + MCP-сервер), v0.5.0 (Unity-ассеты: AssetRipper → UnityPy fallback + манифест + `AssetRoundTripOracle`), v0.6.0 (синтез для game-dev: clean-room скелеты Unity C# / Godot GDScript + переводчик шейдеров HLSL→GLSL→AGSL + импортёр уровней (схема v1 → `.tscn` / C#, `LevelRoundTripOracle`)), v0.7.0 (Unreal и нативные движки: `UnrealPakExtractor` + `UModelExtractor` + `GhidraNativeExtractor` для кастомных C++ движков + фингерпринтинг кастомных движков — Ren'Py/Cocos2d-x/MonoGame/LÖVE/RGSS/Clickteam → нативная Ghidra-дорога), v0.8.0 (динамический анализ: `prrevers trace` — аттач к живому процессу через Frida (опциональный extras `[frida]`), хуки по адресам из собственной статики (дамп Il2CppDumper / Ghidra-манифест), подсистемы inventory/combat/save_load, JSONL-трейс + `TraceOracle` + trace-to-doc дизайн-док из событий `[ts Метод]`; без живой игры — честный отказ, трейсы не выдумываются). Экстракция без внешних тулзов: **ZIP-контейнеры** (APK / OBB / raw ZIP), **Windows-установки Unity** (Mono / IL2CPP layout), **Electron `app.asar`**; декомпиляция `Assembly-CSharp.dll` → C# через ILSpy (`prrevers tools install ilspy`; без тулза — честный warning, не тихая деградация); распаковка Unreal `.pak` — тулзом из установки движка (`$UNREAL_PAK`), экспорт ассетов — UModel (gildor.org, вручную). Детекция движков реальная (Unity Mono/IL2CPP, Unreal, Godot, GameMaker, Web — Cordova/Capacitor/Electron, известные кастомные — фингерпринтингом строковых маркеров). Анализ — реален при подключённом LLM-бэкенде; синтез — дизайн-доки + clean-room скелеты под целевой движок (Unity C# / Godot GDScript, `--target-engine`) + переводы шейдеров + импорт уровней, v0.9.0 (compare mode: две игры через один пайплайн — сравнительная таблица механик, diff дизайн-доков по секциям, `ComparisonOracle`), v1.0.0 (стабильный API: заморожены top-level экспорты, CLI-команды и имена MCP-инструментов; цикл депрекации; PyPI-релиз-инженерия — `pip install prrevers` после проставленного владельцем тега; документационный сайт mkdocs; первый опубликованный end-to-end кейс «Gold Rush» — своя Electron-игра, [docs/cases/web-gold-rush.md](docs/cases/web-gold-rush.md)). См. [docs/ROADMAP.ru.md](docs/ROADMAP.ru.md) и [CHANGELOG.md](CHANGELOG.md).
|
|
155
|
+
|
|
156
|
+
## Установка
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# из PyPI (начиная с v1.0.0)
|
|
160
|
+
pip install prrevers
|
|
161
|
+
|
|
162
|
+
# опциональные возможности — extras (см. ниже)
|
|
163
|
+
pip install "prrevers[mcp]" # MCP-сервер для Claude Code / Cursor
|
|
164
|
+
pip install "prrevers[assets]" # pure-Python fallback Unity-ассетов
|
|
165
|
+
pip install "prrevers[frida]" # динамический анализ (живой процесс игры)
|
|
166
|
+
|
|
167
|
+
# из репозитория (разработка)
|
|
168
|
+
git clone https://github.com/Pradushkoai/PRRevers.git
|
|
169
|
+
cd PRRevers
|
|
170
|
+
pip install -e ".[dev]"
|
|
171
|
+
pre-commit install
|
|
172
|
+
|
|
173
|
+
# опционально: pure-Python fallback экстракции Unity-ассетов
|
|
174
|
+
# (AssetRipper остаётся внешним тулзом — см. таблицу ниже)
|
|
175
|
+
pip install -e ".[assets]"
|
|
176
|
+
|
|
177
|
+
# опционально: динамический анализ (v0.8.0) — аттач к живой игре
|
|
178
|
+
# через Frida: локально Windows/macOS/Linux или Android по USB
|
|
179
|
+
pip install -e ".[frida]"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Внешние тулзы, которые оркестрирует PRRevers (см. [docs/external-tools.ru.md](docs/external-tools.ru.md); `prrevers tools install <name>` ставит их в user data dir автоматически):
|
|
183
|
+
|
|
184
|
+
| Тулз | Назначение | Требуется для |
|
|
185
|
+
| --- | --- | --- |
|
|
186
|
+
| `ILSpy` (ilspycmd) | Декомпиляция .NET / Unity Mono в C# | Unity Mono-игры (`prrevers tools install ilspy`) |
|
|
187
|
+
| `apktool` | Распаковка APK | Android-игры (смелали/ресурсы) |
|
|
188
|
+
| `Il2CppDumper` | Дамп метадаты Unity IL2CPP | Unity IL2CPP-игры |
|
|
189
|
+
| `AssetRipper` | Экспорт Unity-ассетов | Unity-ассеты |
|
|
190
|
+
| `Ghidra` (headless) | Анализ нативного кода | Кастомные движки / IL2CPP |
|
|
191
|
+
| `jadx` | DEX → Java | не-Unity Android-игры |
|
|
192
|
+
|
|
193
|
+
## Быстрый старт
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
prrevers inspect path/to/game.apk
|
|
197
|
+
prrevers inspect path/to/game.exe --engine auto
|
|
198
|
+
prrevers session path/to/game.apk --name mygame
|
|
199
|
+
prrevers catalog /path/to/games/folder
|
|
200
|
+
|
|
201
|
+
# опционально: C# из Assembly-CSharp.dll (нужен .NET SDK)
|
|
202
|
+
prrevers tools install ilspy
|
|
203
|
+
|
|
204
|
+
# динамический анализ (v0.8.0): игра должна быть ЗАПУЩЕНА
|
|
205
|
+
pip install -e ".[frida]"
|
|
206
|
+
prrevers trace path/to/game.apk --list-processes # найти pid/name игры
|
|
207
|
+
prrevers trace path/to/game.apk --pid 4242 --duration 120 \
|
|
208
|
+
--subsystem inventory --subsystem combat
|
|
209
|
+
# → трейс prrevers-out/traces/*.jsonl + дизайн-док
|
|
210
|
+
# prrevers-out/synthesized/*-trace.md (с LLM — анализ механик по событиям,
|
|
211
|
+
# без LLM — честный stub из таблицы частот)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Контрибьюшн
|
|
215
|
+
|
|
216
|
+
Контрибьюшны приветствуются. Сначала прочитайте [CONTRIBUTING.md](CONTRIBUTING.md). Участвуя, вы соглашаетесь следовать [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
217
|
+
|
|
218
|
+
## Лицензия
|
|
219
|
+
|
|
220
|
+
[MIT](LICENSE) © Pradushkoai
|
prrevers-1.1.0/README.md
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# PRRevers
|
|
2
|
+
|
|
3
|
+
> AI-ассистированный тулз для **гейм-девов**: извлекает механики, ассеты и форматы данных из Windows и Android игр, чтобы учиться у них и вдохновляться на собственные проекты.
|
|
4
|
+
|
|
5
|
+
[](https://github.com/Pradushkoai/PRRevers/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.python.org/downloads/)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](https://docs.astral.sh/ruff/)
|
|
9
|
+
|
|
10
|
+
PRRevers — **не** декомпилятор, **не** дизассемблер и **не** замена тулзам вроде Ghidra, IDA, AssetRipper или Il2CppDumper. Это **оркестратор**: он связывает эти тулзы вместе, определяет движок, извлекает код/ассеты/данные и использует LLM-агента, чтобы объяснить механики и сгенерировать дизайн-доки, пригодные для использования в вашей собственной игре.
|
|
11
|
+
|
|
12
|
+
> **Этика и легальность.** PRRevers предназначен **исключительно для исследований и обучения**. Анализируйте только те игры, которыми вы законно владеете или на которые у вас есть явное разрешение на реверс-инжиниринг. Не распространяйте извлечённый код или ассеты. Прочитайте [docs/ETHICS.ru.md](docs/ETHICS.ru.md) перед использованием.
|
|
13
|
+
|
|
14
|
+
> **English version:** [README.en.md](README.en.md)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Режимы работы
|
|
19
|
+
|
|
20
|
+
PRRevers предоставляет шесть CLI-режимов, каждый как отдельная подкоманду:
|
|
21
|
+
|
|
22
|
+
| Команда | Что делает | Когда использовать |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| `prrevers inspect <file>` | Разовый прогон: детект движка → экстракция → декомпиляция → анализ → дизайн-док | Быстрый обзор одной игры |
|
|
25
|
+
| `prrevers session <file>` | Интерактивный REPL: детект + экстракция один раз, дальше задаёте вопросы | Глубокое изучение игры |
|
|
26
|
+
| `prrevers compare <a> <b>` | Side-by-side сравнение двух игр: таблица механик, diff дизайн-доков, отчёт `compare/<a>-vs-<b>.md` | Выбор между стратегиями реализации |
|
|
27
|
+
| `prrevers trace <file>` | Динамика: аттач к запущенной игре (Frida), хуки из статики, трейс → дизайн-док | Наблюдение механик в рантайме |
|
|
28
|
+
| `prrevers mcp serve` | MCP-сервер: инструменты PRRevers для Claude Code / Cursor | LLM-агент вместо CLI |
|
|
29
|
+
| `prrevers catalog <dir>` | Batch-детект движка для каждого файла в директории, таблица | Кураторская библиотека референсов |
|
|
30
|
+
|
|
31
|
+
Утилиты: `prrevers tools install/list` (установка внешних тулзов в user data dir и статус), `prrevers version`.
|
|
32
|
+
|
|
33
|
+
Полное описание — в [docs/architecture.ru.md § Режимы работы](docs/architecture.ru.md).
|
|
34
|
+
|
|
35
|
+
## Зачем это нужно?
|
|
36
|
+
|
|
37
|
+
Реверс-инжиниринг игры, чтобы у неё поучиться — это мультитулзовая, многодневная рутина:
|
|
38
|
+
|
|
39
|
+
1. Определить движок (Unity Mono / IL2CPP / Unreal / Godot / кастомный).
|
|
40
|
+
2. Распаковать контейнер (APK / PAK / PCK / OBB).
|
|
41
|
+
3. Запустить правильный экстрактор под правильный формат.
|
|
42
|
+
4. Открыть результат в Ghidra / dnSpy / UModel.
|
|
43
|
+
5. Смотреть на тысячи классов и функций, чтобы найти одну механику, которая вас интересует.
|
|
44
|
+
|
|
45
|
+
PRRevers автоматизирует шаги 1–3 и добавляет LLM-агента поверх 4–5, который может отвечать на вопросы вроде *«как работает инвентарь в этой игре?»* и генерировать дизайн-док.
|
|
46
|
+
|
|
47
|
+
## Архитектура
|
|
48
|
+
|
|
49
|
+
Пайплайн состоит из 4 этапов плюс слой оракулов, который независимо проверяет каждый этап:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
[файл] → Детекторы → Экстракторы → Анализаторы (LLM) → Синтезаторы → [ваш проект]
|
|
53
|
+
↑
|
|
54
|
+
Оракулы (проверяют каждый этап)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Ключевые архитектурные решения:
|
|
58
|
+
|
|
59
|
+
- **Плагин-система движков** через протокол `EngineAdapter` + `entry_points`. Добавить новый движок теперь можно без правки ядра.
|
|
60
|
+
- **Типизированная модель `Citation`** вместо `list[str]` в evidence — верифицируется `CitationOracle`.
|
|
61
|
+
- **Протокол `LLMBackend`** — любой класс, реализующий протокол, можно подключить.
|
|
62
|
+
- **Content-addressed кэш** — повторный запуск на том же входе почти мгновенный.
|
|
63
|
+
- **Сессии** — интерактивный REPL с сохраняемой историей Q&A.
|
|
64
|
+
- **Stage-level оракулы** — `DetectionOracle` (согласованность вердикта), `ExtractionOracle` (заявленные файлы против реальной ФС) и `RoundTripOracle` (побайтовая сверка с оригинальным архивом + SHA256-integrity) проверяют этапы сразу после выполнения.
|
|
65
|
+
- **Pure-Python экстракторы** — stdlib `zipfile`/`shutil`/`json`+`struct` покрывают ZIP-контейнеры, Unity-layout и Electron `app.asar` без установки apktool; первая обёртка над внешним тулзом — ILSpy (`prrevers tools install ilspy`) — превращает Mono-сборки в читаемый C#.
|
|
66
|
+
|
|
67
|
+
Полное обоснование архитектуры: [docs/architecture.ru.md](docs/architecture.ru.md).
|
|
68
|
+
|
|
69
|
+
## Документация
|
|
70
|
+
|
|
71
|
+
Документационный сайт (mkdocs-material): архитектура, роадмап, внешние
|
|
72
|
+
тулзы, этика, кейсы — с навигацией и поиском.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
uv sync --extra docs # или: pip install -e ".[docs]"
|
|
76
|
+
mkdocs serve # localhost:8000
|
|
77
|
+
mkdocs build --strict # проверка: битые ссылки ломают сборку (и CI)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
CI собирает сайт в strict-режиме на каждый push.
|
|
81
|
+
|
|
82
|
+
## Статус
|
|
83
|
+
|
|
84
|
+
`main` — закрыты v0.1.0 (Unity Mono + web-игры end-to-end), v0.2.0 (IL2CPP: Il2CppDumper + Ghidra headless), v0.3.0 (LLM-анализатор: Ollama / OpenAI / Anthropic / GigaChat / LiteLLM, цитаты `file:line`), v0.4.0 (REPL-сессии + MCP-сервер), v0.5.0 (Unity-ассеты: AssetRipper → UnityPy fallback + манифест + `AssetRoundTripOracle`), v0.6.0 (синтез для game-dev: clean-room скелеты Unity C# / Godot GDScript + переводчик шейдеров HLSL→GLSL→AGSL + импортёр уровней (схема v1 → `.tscn` / C#, `LevelRoundTripOracle`)), v0.7.0 (Unreal и нативные движки: `UnrealPakExtractor` + `UModelExtractor` + `GhidraNativeExtractor` для кастомных C++ движков + фингерпринтинг кастомных движков — Ren'Py/Cocos2d-x/MonoGame/LÖVE/RGSS/Clickteam → нативная Ghidra-дорога), v0.8.0 (динамический анализ: `prrevers trace` — аттач к живому процессу через Frida (опциональный extras `[frida]`), хуки по адресам из собственной статики (дамп Il2CppDumper / Ghidra-манифест), подсистемы inventory/combat/save_load, JSONL-трейс + `TraceOracle` + trace-to-doc дизайн-док из событий `[ts Метод]`; без живой игры — честный отказ, трейсы не выдумываются). Экстракция без внешних тулзов: **ZIP-контейнеры** (APK / OBB / raw ZIP), **Windows-установки Unity** (Mono / IL2CPP layout), **Electron `app.asar`**; декомпиляция `Assembly-CSharp.dll` → C# через ILSpy (`prrevers tools install ilspy`; без тулза — честный warning, не тихая деградация); распаковка Unreal `.pak` — тулзом из установки движка (`$UNREAL_PAK`), экспорт ассетов — UModel (gildor.org, вручную). Детекция движков реальная (Unity Mono/IL2CPP, Unreal, Godot, GameMaker, Web — Cordova/Capacitor/Electron, известные кастомные — фингерпринтингом строковых маркеров). Анализ — реален при подключённом LLM-бэкенде; синтез — дизайн-доки + clean-room скелеты под целевой движок (Unity C# / Godot GDScript, `--target-engine`) + переводы шейдеров + импорт уровней, v0.9.0 (compare mode: две игры через один пайплайн — сравнительная таблица механик, diff дизайн-доков по секциям, `ComparisonOracle`), v1.0.0 (стабильный API: заморожены top-level экспорты, CLI-команды и имена MCP-инструментов; цикл депрекации; PyPI-релиз-инженерия — `pip install prrevers` после проставленного владельцем тега; документационный сайт mkdocs; первый опубликованный end-to-end кейс «Gold Rush» — своя Electron-игра, [docs/cases/web-gold-rush.md](docs/cases/web-gold-rush.md)). См. [docs/ROADMAP.ru.md](docs/ROADMAP.ru.md) и [CHANGELOG.md](CHANGELOG.md).
|
|
85
|
+
|
|
86
|
+
## Установка
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# из PyPI (начиная с v1.0.0)
|
|
90
|
+
pip install prrevers
|
|
91
|
+
|
|
92
|
+
# опциональные возможности — extras (см. ниже)
|
|
93
|
+
pip install "prrevers[mcp]" # MCP-сервер для Claude Code / Cursor
|
|
94
|
+
pip install "prrevers[assets]" # pure-Python fallback Unity-ассетов
|
|
95
|
+
pip install "prrevers[frida]" # динамический анализ (живой процесс игры)
|
|
96
|
+
|
|
97
|
+
# из репозитория (разработка)
|
|
98
|
+
git clone https://github.com/Pradushkoai/PRRevers.git
|
|
99
|
+
cd PRRevers
|
|
100
|
+
pip install -e ".[dev]"
|
|
101
|
+
pre-commit install
|
|
102
|
+
|
|
103
|
+
# опционально: pure-Python fallback экстракции Unity-ассетов
|
|
104
|
+
# (AssetRipper остаётся внешним тулзом — см. таблицу ниже)
|
|
105
|
+
pip install -e ".[assets]"
|
|
106
|
+
|
|
107
|
+
# опционально: динамический анализ (v0.8.0) — аттач к живой игре
|
|
108
|
+
# через Frida: локально Windows/macOS/Linux или Android по USB
|
|
109
|
+
pip install -e ".[frida]"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Внешние тулзы, которые оркестрирует PRRevers (см. [docs/external-tools.ru.md](docs/external-tools.ru.md); `prrevers tools install <name>` ставит их в user data dir автоматически):
|
|
113
|
+
|
|
114
|
+
| Тулз | Назначение | Требуется для |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| `ILSpy` (ilspycmd) | Декомпиляция .NET / Unity Mono в C# | Unity Mono-игры (`prrevers tools install ilspy`) |
|
|
117
|
+
| `apktool` | Распаковка APK | Android-игры (смелали/ресурсы) |
|
|
118
|
+
| `Il2CppDumper` | Дамп метадаты Unity IL2CPP | Unity IL2CPP-игры |
|
|
119
|
+
| `AssetRipper` | Экспорт Unity-ассетов | Unity-ассеты |
|
|
120
|
+
| `Ghidra` (headless) | Анализ нативного кода | Кастомные движки / IL2CPP |
|
|
121
|
+
| `jadx` | DEX → Java | не-Unity Android-игры |
|
|
122
|
+
|
|
123
|
+
## Быстрый старт
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
prrevers inspect path/to/game.apk
|
|
127
|
+
prrevers inspect path/to/game.exe --engine auto
|
|
128
|
+
prrevers session path/to/game.apk --name mygame
|
|
129
|
+
prrevers catalog /path/to/games/folder
|
|
130
|
+
|
|
131
|
+
# опционально: C# из Assembly-CSharp.dll (нужен .NET SDK)
|
|
132
|
+
prrevers tools install ilspy
|
|
133
|
+
|
|
134
|
+
# динамический анализ (v0.8.0): игра должна быть ЗАПУЩЕНА
|
|
135
|
+
pip install -e ".[frida]"
|
|
136
|
+
prrevers trace path/to/game.apk --list-processes # найти pid/name игры
|
|
137
|
+
prrevers trace path/to/game.apk --pid 4242 --duration 120 \
|
|
138
|
+
--subsystem inventory --subsystem combat
|
|
139
|
+
# → трейс prrevers-out/traces/*.jsonl + дизайн-док
|
|
140
|
+
# prrevers-out/synthesized/*-trace.md (с LLM — анализ механик по событиям,
|
|
141
|
+
# без LLM — честный stub из таблицы частот)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Контрибьюшн
|
|
145
|
+
|
|
146
|
+
Контрибьюшны приветствуются. Сначала прочитайте [CONTRIBUTING.md](CONTRIBUTING.md). Участвуя, вы соглашаетесь следовать [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
147
|
+
|
|
148
|
+
## Лицензия
|
|
149
|
+
|
|
150
|
+
[MIT](LICENSE) © Pradushkoai
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Ethics & responsible use
|
|
2
|
+
|
|
3
|
+
PRRevers is a research tool. Using it correctly is your responsibility.
|
|
4
|
+
This page exists to make that responsibility explicit.
|
|
5
|
+
|
|
6
|
+
## What this tool is for
|
|
7
|
+
|
|
8
|
+
- **Learning** how other games implement mechanics you admire.
|
|
9
|
+
- **Documenting** software you own when no documentation is available.
|
|
10
|
+
- **Interoperability** — reading save files, level formats, or mod formats
|
|
11
|
+
so you can build tools around games you love.
|
|
12
|
+
- **Security research** on software you have authorization to test.
|
|
13
|
+
|
|
14
|
+
## What this tool is not for
|
|
15
|
+
|
|
16
|
+
- Pirating, cracking, or bypassing DRM / copy protection.
|
|
17
|
+
- Redistributing code, assets, audio, or text extracted from games you
|
|
18
|
+
do not have the rights to.
|
|
19
|
+
- Cheating in online games or gaining competitive advantages.
|
|
20
|
+
- Analyzing software you do not own or do not have permission to study.
|
|
21
|
+
|
|
22
|
+
## The clean-room rule
|
|
23
|
+
|
|
24
|
+
PRRevers's synthesizers produce **original code** that implements the
|
|
25
|
+
same behavior as the analyzed game's mechanic. They do not copy
|
|
26
|
+
decompiled code verbatim. This is the same principle that lets
|
|
27
|
+
clean-room reimplementations of BIOSes, file formats, and protocols
|
|
28
|
+
exist legally.
|
|
29
|
+
|
|
30
|
+
What this means in practice:
|
|
31
|
+
|
|
32
|
+
1. **Read** the analysis output (a design doc), not the decompiled code.
|
|
33
|
+
2. **Implement** the mechanic in your own style, in your own codebase.
|
|
34
|
+
3. **Cite** the inspiration where appropriate, just like you would cite
|
|
35
|
+
a paper.
|
|
36
|
+
|
|
37
|
+
If you find yourself copy-pasting decompiled code into your game, stop.
|
|
38
|
+
That is not what PRRevers is for.
|
|
39
|
+
|
|
40
|
+
## Jurisdiction
|
|
41
|
+
|
|
42
|
+
The legality of reverse engineering varies by country:
|
|
43
|
+
|
|
44
|
+
- **United States** — DMCA §1201 prohibits circumventing technological
|
|
45
|
+
protection measures, even for interoperability. Reverse engineering
|
|
46
|
+
for interoperability is generally allowed under §1201(f), but
|
|
47
|
+
distribution of tools that enable circumvention is restricted.
|
|
48
|
+
- **European Union** — Software Directive 91/250/EEC (now
|
|
49
|
+
Directive 2009/24/EC) explicitly permits reverse engineering for
|
|
50
|
+
interoperability. But circumventing DRM is restricted.
|
|
51
|
+
- **Russia** — Civil Code Article 1280 permits reverse engineering for
|
|
52
|
+
interoperability, with conditions.
|
|
53
|
+
- **Other jurisdictions** — check local law. PRRevers's authors are not
|
|
54
|
+
lawyers and this document is not legal advice.
|
|
55
|
+
|
|
56
|
+
When in doubt, consult a lawyer. The fact that PRRevers *can* analyze a
|
|
57
|
+
file does not mean it *should*.
|
|
58
|
+
|
|
59
|
+
## Reporting misuse
|
|
60
|
+
|
|
61
|
+
If you become aware of PRRevers being used to redistribute copyrighted
|
|
62
|
+
assets, crack DRM, or otherwise violate the project's intent, please
|
|
63
|
+
report it via a GitHub issue (for non-sensitive reports) or to the
|
|
64
|
+
maintainer's email listed in `SECURITY.md`.
|
|
65
|
+
|
|
66
|
+
The maintainers reserve the right to:
|
|
67
|
+
|
|
68
|
+
- Close issues / PRs that demonstrate or facilitate misuse.
|
|
69
|
+
- Remove examples from the documentation that reference specific
|
|
70
|
+
commercial games by name.
|
|
71
|
+
- Decline contributions whose primary purpose is circumvention.
|
|
72
|
+
|
|
73
|
+
## Summary
|
|
74
|
+
|
|
75
|
+
> **If you don't own it or don't have permission, don't reverse it.**
|
|
76
|
+
> **If you reverse it, don't redistribute what you find.**
|
|
77
|
+
> **If you learn from it, write your own code.**
|