@ksl101/vulnreaper 0.0.0-stage → 0.1.0-beta.1

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.

Potentially problematic release.


This version of @ksl101/vulnreaper might be problematic. Click here for more details.

Files changed (70) hide show
  1. package/LICENSE +107 -0
  2. package/README.md +200 -3
  3. package/bin/vulnreaper.js +11 -0
  4. package/lib/cli.js +36 -0
  5. package/lib/resolve-core.js +109 -0
  6. package/package.json +39 -4
  7. package/vendor/vulnreaper/__init__.py +23 -0
  8. package/vendor/vulnreaper/__main__.py +7 -0
  9. package/vendor/vulnreaper/_platform.py +101 -0
  10. package/vendor/vulnreaper/android/__init__.py +4 -0
  11. package/vendor/vulnreaper/android/adb.py +89 -0
  12. package/vendor/vulnreaper/android/apk.py +201 -0
  13. package/vendor/vulnreaper/android/dex_analysis.py +65 -0
  14. package/vendor/vulnreaper/android/manifest.py +156 -0
  15. package/vendor/vulnreaper/android/native.py +67 -0
  16. package/vendor/vulnreaper/cli/__init__.py +4 -0
  17. package/vendor/vulnreaper/cli/app.py +588 -0
  18. package/vendor/vulnreaper/cli/autocomplete.py +50 -0
  19. package/vendor/vulnreaper/cli/commands.py +300 -0
  20. package/vendor/vulnreaper/cli/components/__init__.py +11 -0
  21. package/vendor/vulnreaper/cli/components/banner.py +81 -0
  22. package/vendor/vulnreaper/cli/components/error.py +29 -0
  23. package/vendor/vulnreaper/cli/components/finding.py +105 -0
  24. package/vendor/vulnreaper/cli/components/palette.py +65 -0
  25. package/vendor/vulnreaper/cli/components/spinner.py +96 -0
  26. package/vendor/vulnreaper/cli/components/status.py +55 -0
  27. package/vendor/vulnreaper/cli/dashboard.py +51 -0
  28. package/vendor/vulnreaper/cli/intent.py +84 -0
  29. package/vendor/vulnreaper/cli/prompt.py +354 -0
  30. package/vendor/vulnreaper/cli/repl.py +243 -0
  31. package/vendor/vulnreaper/cli/terminal.py +105 -0
  32. package/vendor/vulnreaper/cli/theme.py +170 -0
  33. package/vendor/vulnreaper/config.py +232 -0
  34. package/vendor/vulnreaper/database.py +253 -0
  35. package/vendor/vulnreaper/engine.py +493 -0
  36. package/vendor/vulnreaper/findings/__init__.py +4 -0
  37. package/vendor/vulnreaper/findings/model.py +110 -0
  38. package/vendor/vulnreaper/findings/report.py +227 -0
  39. package/vendor/vulnreaper/formats/__init__.py +4 -0
  40. package/vendor/vulnreaper/formats/axml.py +253 -0
  41. package/vendor/vulnreaper/formats/dex.py +180 -0
  42. package/vendor/vulnreaper/formats/elf.py +157 -0
  43. package/vendor/vulnreaper/formats/il2cpp_metadata.py +135 -0
  44. package/vendor/vulnreaper/formats/strings.py +102 -0
  45. package/vendor/vulnreaper/gating.py +85 -0
  46. package/vendor/vulnreaper/il2cpp/__init__.py +4 -0
  47. package/vendor/vulnreaper/il2cpp/detector.py +116 -0
  48. package/vendor/vulnreaper/il2cpp/dumper.py +89 -0
  49. package/vendor/vulnreaper/licensing.py +341 -0
  50. package/vendor/vulnreaper/logging_setup.py +48 -0
  51. package/vendor/vulnreaper/pipeline.py +106 -0
  52. package/vendor/vulnreaper/project.py +126 -0
  53. package/vendor/vulnreaper/rules/android.json +77 -0
  54. package/vendor/vulnreaper/rules/crypto.json +65 -0
  55. package/vendor/vulnreaper/rules/network.json +65 -0
  56. package/vendor/vulnreaper/rules/secrets.json +101 -0
  57. package/vendor/vulnreaper/rules/unity.json +41 -0
  58. package/vendor/vulnreaper/scanners/__init__.py +4 -0
  59. package/vendor/vulnreaper/scanners/android.py +158 -0
  60. package/vendor/vulnreaper/scanners/native.py +65 -0
  61. package/vendor/vulnreaper/scanners/ruleengine.py +156 -0
  62. package/vendor/vulnreaper/scanners/web.py +58 -0
  63. package/vendor/vulnreaper/tools.py +226 -0
  64. package/vendor/vulnreaper/ui.py +126 -0
  65. package/vendor/vulnreaper/unity/__init__.py +4 -0
  66. package/vendor/vulnreaper/unity/detector.py +90 -0
  67. package/vendor/vulnreaper/updates.py +299 -0
  68. package/vendor/vulnreaper/web/__init__.py +4 -0
  69. package/vendor/vulnreaper/web/endpoints.py +124 -0
  70. package/vendor/vulnreaper/workspace.py +81 -0
package/LICENSE ADDED
@@ -0,0 +1,107 @@
1
+ VulnReaper — CONTRAT DE LICENCE UTILISATEUR FINAL (EULA)
2
+ Version du contrat : 0.1.0-beta.0
3
+ Copyright (c) 2026 KSL101. Tous droits réservés.
4
+
5
+ En installant, en activant ou en utilisant le logiciel VulnReaper (le « Logiciel »),
6
+ vous (l'« Utilisateur ») acceptez les termes du présent contrat. Si vous n'acceptez
7
+ pas ces termes, n'installez pas, n'activez pas et n'utilisez pas le Logiciel.
8
+
9
+ 1. DÉFINITIONS
10
+ 1.1 « Logiciel » : le cœur d'analyse, la CLI, le lanceur npm `@ksl101/vulnreaper`
11
+ (commandes `vulnreaper` et `vr`), les binaires, les règles et la documentation
12
+ associés, distribués sous quelque forme que ce soit.
13
+ 1.2 « Clé de licence » : le jeton nominatif fourni par l'Éditeur permettant
14
+ d'activer le Logiciel.
15
+ 1.3 « Serveur de licence » : le service d'authentification et d'autorisation
16
+ utilisé pour l'activation et le contrôle des permissions.
17
+ 1.4 « Éditeur » : KSL101, titulaire des droits sur le Logiciel.
18
+
19
+ 2. OCTROI DE LICENCE
20
+ 2.1 Sous réserve du paiement éventuel et du respect du présent contrat, l'Éditeur
21
+ accorde à l'Utilisateur une licence nominative, non exclusive, non cessible et
22
+ non transférable d'utiliser le Logiciel, dans la limite du nombre d'appareils
23
+ autorisés pour sa Clé de licence.
24
+ 2.2 La Clé de licence est stricto personnelle. Elle ne peut être partagée,
25
+ revendue, louée, prêtée ni publiée.
26
+ 2.3 Le Logiciel est concédé sous licence, non vendu. L'Éditeur conserve tous les
27
+ droits, titres et intérêts non expressément accordés.
28
+
29
+ 3. ACTIVATION, APPAREIL ET SESSION
30
+ 3.1 L'activation associe la Clé de licence à un ou plusieurs appareils. Un
31
+ identifiant d'appareil technique peut être généré et transmis au Serveur de
32
+ licence aux seules fins d'activation, de contrôle des permissions et de
33
+ sécurité.
34
+ 3.2 Les jetons de session sont stockés localement et uniquement pour maintenir
35
+ l'authentification. La Clé de licence en clair n'est pas conservée par le
36
+ Logiciel après échange contre des jetons.
37
+ 3.3 L'Utilisateur s'engage à ne pas dissimuler, falsifier ni manipuler
38
+ l'identité d'appareil afin de contourner la limite d'appareils.
39
+
40
+ 4. RESTRICTIONS
41
+ Sauf autorisation écrite préalable de l'Éditeur, l'Utilisateur ne peut pas :
42
+ 4.1 copier, distribuer, publier, mettre à disposition ou revendre le Logiciel ou
43
+ une partie de celui-ci, y compris sous forme compilée ou reconditionnée ;
44
+ 4.2 contourner, désactiver, neutraliser ou altérer le mécanisme de licence,
45
+ d'activation, d'authentification ou de contrôle des permissions, ni retirer
46
+ les mentions de copyright ou de propriété ;
47
+ 4.3 rétro-concevoir, décompiler ou désassembler le Logiciel, sauf dans la mesure
48
+ strictement permise par une disposition légale impérative ;
49
+ 4.4 modifier, traduire ou créer des œuvres dérivées du Logiciel ;
50
+ 4.5 utiliser le Logiciel pour développer un produit concurrent.
51
+
52
+ 5. UTILISATION AUTORISÉE — OBLIGATION LÉGALE
53
+ 5.1 Le Logiciel est un outil d'audit de sécurité destiné aux professionnels.
54
+ L'Utilisateur s'engage à ne l'utiliser que sur des cibles (applications,
55
+ paquets, systèmes) pour lesquelles il dispose d'une autorisation explicite,
56
+ ou dans le cadre d'un programme de bug-bounty l'y habilitant.
57
+ 5.2 Toute utilisation contre des systèmes tiers sans autorisation est
58
+ strictement interdite et relève de la seule responsabilité de l'Utilisateur.
59
+ 5.3 L'Utilisateur demeure seul responsable du respect des lois et règlements
60
+ applicables dans sa juridiction.
61
+
62
+ 6. STATUT BÊTA — ABSENCE DE GARANTIE
63
+ 6.1 Le Logiciel est fourni « EN L'ÉTAT » et « SELON DISPONIBILITÉ », en version
64
+ bêta, sans garantie d'aucune sorte, expresse ou implicite, y compris, sans
65
+ limitation, les garanties de qualité marchande, d'adéquation à un usage
66
+ particulier et d'absence de contrefaçon.
67
+ 6.2 L'Éditeur ne garantit pas que le Logiciel sera exempt d'erreurs, ni que son
68
+ fonctionnement sera ininterrompu, ni qu'il détectera l'intégralité des
69
+ vulnérabilités d'une cible donnée.
70
+
71
+ 7. LIMITATION DE RESPONSABILITÉ
72
+ 7.1 Dans toute la mesure permise par la loi, l'Éditeur ne saurait être tenu
73
+ responsable de tout dommage indirect, accessoire, spécial, consécutif ou
74
+ punitif, ni de toute perte de données, de revenus ou d'exploitation,
75
+ résultant de l'utilisation ou de l'impossibilité d'utiliser le Logiciel.
76
+ 7.2 La responsabilité globale de l'Éditeur, toutes causes confondues, est
77
+ limitée au montant effectivement payé par l'Utilisateur pour la licence au
78
+ cours des douze (12) mois précédant le fait générateur.
79
+
80
+ 8. DONNÉES TECHNIQUES
81
+ 8.1 Le Logiciel peut transmettre au Serveur de licence des données strictement
82
+ nécessaires à l'activation, au contrôle des permissions, à la sécurité et à
83
+ l'audit des accès. Aucune cible analysée, aucun code d'application et aucun
84
+ résultat de scan ne sont transmis automatiquement.
85
+ 8.2 Les données techniques sont traitées conformément à la réglementation
86
+ applicable en matière de protection des données personnelles.
87
+
88
+ 9. DURÉE ET RÉSILIATION
89
+ 9.1 Le présent contrat prend effet à la première utilisation et demeure en
90
+ vigueur jusqu'à résiliation.
91
+ 9.2 L'Éditeur peut suspendre ou révoquer la Clé de licence, ainsi que l'accès au
92
+ Serveur de licence, en cas de violation du présent contrat.
93
+ 9.3 En cas de résiliation, l'Utilisateur doit cesser toute utilisation et
94
+ supprimer les copies du Logiciel en sa possession.
95
+
96
+ 10. DROIT APPLICABLE
97
+ 10.1 Le présent contrat est régi par le droit applicable au siège de l'Éditeur,
98
+ sans préjudice des règles impératives protégeant les consommateurs.
99
+ 10.2 Tout litige relève de la compétence exclusive des tribunaux de ce ressort.
100
+
101
+ 11. CONTACT
102
+ Pour toute question relative aux licences, à l'activation ou au présent contrat,
103
+ contactez l'Éditeur via les canaux officiels du projet.
104
+
105
+ ---
106
+ Le présent document constitue l'intégralité de l'accord entre les parties
107
+ relativement à son objet et prévaut sur tout accord antérieur.
package/README.md CHANGED
@@ -1,3 +1,200 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # VulnReaper — Plateforme d'analyse statique pour la sécurité Android
2
+
3
+ **VulnReaper** est une plateforme d'analyse statique **offline-first** destinée au
4
+ bug-bounty et à la recherche sécurité sur les **jeux Android** (APK natifs,
5
+ Unity et IL2CPP). Elle tourne en **pur Python** (bibliothèque standard
6
+ uniquement), sans dépendance runtime, et est **conçue pour Windows en priorité**,
7
+ tout en restant compatible POSIX.
8
+
9
+ Elle transforme un APK en un rapport exploitable : surface d'attaque
10
+ (manifest), chaînes et secrets, endpoints/hosts, bibliothèques natives et
11
+ métadonnées IL2CPP — le tout corrélé par un moteur de règles JSON.
12
+
13
+ ---
14
+
15
+ ## Points clés
16
+
17
+ - **Aucune dépendance runtime** : uniquement la bibliothèque standard.
18
+ - **Jamais de résultats fabriqués** : un outil externe absent est marqué
19
+ `missing` et l'étape correspondante est `skipped`, jamais simulée.
20
+ - **Windows-first** : encodage UTF-8, couleurs ANSI (VT), gestion des chemins et
21
+ des sous-processus adaptée à Windows.
22
+ - **Analyses natives sans décompilateur** : parseurs intégrés DEX, AXML
23
+ (manifest compilé), ELF et `global-metadata.dat` (IL2CPP v24–v31).
24
+ - **Rapports** JSON, Markdown et HTML prêts à joindre à un rapport de bug bounty.
25
+
26
+ ---
27
+
28
+ ## Installation
29
+
30
+ ### Bêta publique (npm)
31
+
32
+ ```sh
33
+ npm install -g @ksl101/vulnreaper@beta
34
+ vr version
35
+ ```
36
+
37
+ Prérequis : Node.js ≥ 18 et Python ≥ 3.10 (le paquet embarque le cœur Python
38
+ complet, exécuté par le lanceur `vr` / `vulnreaper`).
39
+
40
+ VulnReaper est sous licence nominative : activez votre clé avec
41
+ `vr login --key VR-...`, puis consultez `vr whoami`. Les commandes `scan` et
42
+ `report` exigent une permission (`scan.run`, `report.export`) ; les permissions
43
+ `recon.run` et `audit.run` sont réservées aux futures commandes `recon`/`audit`.
44
+ Voir **[docs/BETA_TESTERS.md](docs/BETA_TESTERS.md)** pour le guide complet des
45
+ testeurs.
46
+
47
+ ### Depuis les sources
48
+
49
+ Aucune installation n'est requise pour utiliser VulnReaper depuis les sources.
50
+
51
+ ```bat
52
+ :: Windows (invité de commandes)
53
+ vulnreaper.bat doctor
54
+ vulnreaper.bat scan C:\path\to\game.apk --profile apk-static
55
+ ```
56
+
57
+ ```sh
58
+ # Git Bash / Linux / macOS
59
+ ./vulnreaper.sh doctor
60
+ ./vulnreaper.sh scan /path/to/game.apk --profile apk-static
61
+ ```
62
+
63
+ Ou directement via Python (à la racine du dépôt) :
64
+
65
+ ```bat
66
+ python -m vulnreaper doctor
67
+ python -m vulnreaper scan C:\path\to\game.apk
68
+ ```
69
+
70
+ Installation optionnelle comme commande globale :
71
+
72
+ ```sh
73
+ pip install -e .
74
+ vulnreaper --version
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Commandes
80
+
81
+ | Commande | Description |
82
+ | --- | --- |
83
+ | `vulnreaper doctor` | Diagnostic de l'environnement et des outils externes |
84
+ | `vulnreaper version` | Affiche la version |
85
+ | `vulnreaper profiles` | Liste les profils de scan |
86
+ | `vulnreaper rules [--json]` | Liste les règles chargées |
87
+ | `vulnreaper tools [--missing\|--available] [--json]` | Inspecte les outils externes |
88
+ | `vulnreaper project create\|list\|show\|delete <nom>` | Gère les projets/workspaces |
89
+ | `vulnreaper scan <apk> [--profile P] [--project N] [--json]` | Lance un scan |
90
+ | `vulnreaper runs [--project N]` | Liste les runs |
91
+ | `vulnreaper findings [--run ID] [--severity S]` | Affiche les findings |
92
+ | `vulnreaper report --run ID` | Chemin des rapports générés |
93
+ | `vulnreaper config show\|init` | Affiche / initialise la configuration |
94
+ | `vulnreaper login --key <VR-…> [--base-url URL]` | Active une licence et ouvre une session |
95
+ | `vulnreaper logout` | Ferme la session locale |
96
+ | `vulnreaper whoami [--json]` | Affiche licence, rôle, statut, permissions |
97
+ | `vulnreaper admin license\|device\|audit …` | Administration des licences/appareils (rôle `admin`) |
98
+ | `vulnreaper ui` | Shell interactif (REPL conversationnel) |
99
+
100
+ Sans commande, `vulnreaper` ouvre le shell interactif (`ui`).
101
+
102
+ ---
103
+
104
+ ## Profils de scan
105
+
106
+ | Profil | Usage |
107
+ | --- | --- |
108
+ | `apk-static` *(défaut)* | Analyse statique complète : import, extraction, manifest, dex, natif, Unity, IL2CPP, assets, endpoints, scanners, rapport |
109
+ | `quick` | Version rapide sans extraction ni décompilation |
110
+ | `android-full` | Ajoute apktool, Il2CppDumper et jadx quand ils sont présents |
111
+ | `il2cpp` | Orienté Unity/IL2CPP |
112
+ | `recon` | Reconnaissance endpoints/hosts uniquement |
113
+ | `device` | Énumération des appareils adb |
114
+ | `report-only` | Régénère un rapport à partir de données existantes |
115
+
116
+ Lister les profils : `vulnreaper profiles`.
117
+
118
+ ---
119
+
120
+ ## Outils externes (optionnels)
121
+
122
+ VulnReaper fonctionne sans eux ; s'ils sont présents, il en tire parti :
123
+
124
+ | Outil | Rôle |
125
+ | --- | --- |
126
+ | `adb` | Énumération d'appareils / interaction device |
127
+ | `apktool` | Décodage des ressources |
128
+ | `jadx` | Décompilation Java |
129
+ | `apksigner` | Vérification de signature |
130
+ | `aapt` | Inspection d'APK |
131
+ | `frida` | Instrumentation dynamique |
132
+ | `il2cppdumper` | Dump IL2CPP (`.cs` reconstruits) |
133
+ | `cpp2il` | Reconstruction IL2CPP alternative |
134
+ | `ghidra` | Analyse native avancée |
135
+
136
+ Statut : `vulnreaper tools`. Chemins explicites et répertoires de recherche se
137
+ définissent dans la configuration (`vulnreaper config show`).
138
+
139
+ ---
140
+
141
+ ## Structure du dépôt
142
+
143
+ ```
144
+ vulnreaper/ paquet principal
145
+ cli/ point d'entrée, shell interactif (REPL), thème + composants
146
+ formats/ parseurs strings, AXML, DEX, ELF, métadonnées IL2CPP
147
+ android/ import APK, modèle manifest, analyse dex/natif, adb
148
+ unity/ il2cpp/ détection moteur + adaptateurs de dump
149
+ web/ découverte et classification d'endpoints
150
+ scanners/ moteur de règles + scanners (secrets, crypto, réseau, natif)
151
+ findings/ modèle Finding + rapports JSON/MD/HTML
152
+ rules/ packs de règles JSON
153
+ config.py workspace.py database.py project.py pipeline.py engine.py tools.py
154
+ tests/ suite pytest + fixtures synthétiques + smoke end-to-end
155
+ docs/ architecture, règles, utilisation
156
+ ```
157
+
158
+ ---
159
+
160
+ ## Tests
161
+
162
+ ```bat
163
+ python -m pytest tests/ -q :: cœur Python + UI (164 tests)
164
+ python tests/smoke.py :: scan end-to-end d'un APK synthétique
165
+ cd server && npm test :: API de licence (11 tests, store mémoire)
166
+ cd server && VULNREAPER_E2E=1 npm test :: + E2E CLI ↔ API
167
+ ```
168
+
169
+ Le smoke construit un APK structurellement valide (manifest AXML compilé, DEX,
170
+ `.so` natif, `global-metadata.dat`) dans un dossier temporaire, exécute le profil
171
+ `quick` et vérifie que le run se termine, écrit les 3 formats de rapport et
172
+ produit findings et endpoints.
173
+
174
+ Le test E2E inter-stack pilote réellement la CLI contre l'API de licence
175
+ (activation, `whoami`, gating, révocation). Détail de la couverture et
176
+ prérequis : **[docs/TESTING.md](docs/TESTING.md)**.
177
+
178
+ ---
179
+
180
+ ## Documentation
181
+
182
+ - [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — conception et flux de données
183
+ - [`docs/USAGE.md`](docs/USAGE.md) — prise en main et workflow bug-bounty
184
+ - [`docs/UI.md`](docs/UI.md) — interface CLI/REPL (thème, composants, raccourcis)
185
+ - [`docs/RULES.md`](docs/RULES.md) — packs de règles et écriture de règles
186
+ - [`docs/BETA_TESTERS.md`](docs/BETA_TESTERS.md) — guide des testeurs bêta (npm, licence, gating)
187
+ - [`docs/TESTING.md`](docs/TESTING.md) — stratégie et couverture des tests
188
+
189
+ ---
190
+
191
+ ## Licence et usage
192
+
193
+ > Distribution sous licence nominative propriétaire. L'utilisation du logiciel
194
+ > vaut acceptation du [contrat de licence utilisateur final (EULA)](LICENSE).
195
+ > Le guide d'activation et le détail des permissions se trouvent dans
196
+ > [docs/BETA_TESTERS.md](docs/BETA_TESTERS.md).
197
+
198
+ Outil destiné aux professionnels autorisés. Ne scannez que des applications que
199
+ vous êtes autorisé à tester (vos propres cibles, programmes de bug bounty, ou
200
+ cibles explicitement autorisées).
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /*
5
+ * VulnReaper launcher shim.
6
+ *
7
+ * This thin, auditable entry point only forwards arguments to the VulnReaper
8
+ * core (native binary or Python). It intentionally performs NO security
9
+ * decision: all authorisation lives server-side.
10
+ */
11
+ require('../lib/cli.js').run(process.argv.slice(2));
package/lib/cli.js ADDED
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const { spawn } = require('node:child_process');
4
+ const { resolveCore } = require('./resolve-core.js');
5
+
6
+ function run(argv) {
7
+ let core;
8
+ try {
9
+ core = resolveCore();
10
+ } catch (err) {
11
+ process.stderr.write(String((err && err.message) || err) + '\n');
12
+ process.exitCode = 127;
13
+ return;
14
+ }
15
+
16
+ const child = spawn(core.command, core.args.concat(argv), {
17
+ stdio: 'inherit',
18
+ env: core.env,
19
+ windowsHide: false,
20
+ });
21
+
22
+ child.on('error', (err) => {
23
+ process.stderr.write('Failed to start the VulnReaper core: ' + err.message + '\n');
24
+ process.exitCode = 127;
25
+ });
26
+
27
+ child.on('exit', (code, signal) => {
28
+ if (signal) {
29
+ process.kill(process.pid, signal);
30
+ return;
31
+ }
32
+ process.exitCode = code === null ? 1 : code;
33
+ });
34
+ }
35
+
36
+ module.exports = { run };
@@ -0,0 +1,109 @@
1
+ 'use strict';
2
+
3
+ /*
4
+ * Resolve the VulnReaper core executable/runner.
5
+ *
6
+ * Resolution order:
7
+ * 1. VULNREAPER_CORE override (explicit path).
8
+ * 2. Vendored native binary (vendor/bin/<platform>-<arch>/VulnReaper[.exe]).
9
+ * 3. Platform optional-dependency package (@ksl101/vulnreaper-<tag>).
10
+ * 4. Bundled Python source run through a system Python (vendor/ or repo dev).
11
+ */
12
+
13
+ const fs = require('node:fs');
14
+ const path = require('node:path');
15
+ const { spawnSync } = require('node:child_process');
16
+
17
+ const ROOT = path.join(__dirname, '..');
18
+ const DEP_SCOPE = '@ksl101/vulnreaper';
19
+
20
+ function platformTag() {
21
+ const arch = process.arch === 'ia32' ? 'x86' : process.arch;
22
+ return `${process.platform}-${arch}`;
23
+ }
24
+
25
+ function binaryName() {
26
+ return process.platform === 'win32' ? 'VulnReaper.exe' : 'VulnReaper';
27
+ }
28
+
29
+ function isFile(p) {
30
+ try {
31
+ return fs.statSync(p).isFile();
32
+ } catch {
33
+ return false;
34
+ }
35
+ }
36
+
37
+ function findPython() {
38
+ const candidates = process.platform === 'win32'
39
+ ? ['python', 'py', 'python3']
40
+ : ['python3', 'python'];
41
+ for (const exe of candidates) {
42
+ const probe = spawnSync(exe, ['--version'], { stdio: 'ignore' });
43
+ if (probe.status === 0) return exe;
44
+ }
45
+ return null;
46
+ }
47
+
48
+ function pythonCore(pkgDir) {
49
+ const env = Object.assign({}, process.env);
50
+ env.PYTHONPATH = pkgDir + (env.PYTHONPATH ? path.delimiter + env.PYTHONPATH : '');
51
+ env.PYTHONUTF8 = '1';
52
+ env.PYTHONIOENCODING = 'utf-8';
53
+ env.PYTHONDONTWRITEBYTECODE = '1';
54
+ const py = findPython();
55
+ if (!py) return null;
56
+ return { command: py, args: ['-m', 'vulnreaper'], env };
57
+ }
58
+
59
+ function resolveCore() {
60
+ const override = process.env.VULNREAPER_CORE;
61
+ if (override) {
62
+ return { command: override, args: [], env: Object.assign({}, process.env) };
63
+ }
64
+
65
+ const tag = platformTag();
66
+
67
+ // 2. Vendored native binary.
68
+ const vendored = path.join(ROOT, 'vendor', 'bin', tag, binaryName());
69
+ if (isFile(vendored)) {
70
+ return { command: vendored, args: [], env: Object.assign({}, process.env) };
71
+ }
72
+
73
+ // 3. Platform package.
74
+ const depName = `${DEP_SCOPE}-${tag}`;
75
+ try {
76
+ const pkgJsonPath = require.resolve(`${depName}/package.json`);
77
+ const pkg = require(pkgJsonPath);
78
+ if (pkg && pkg.core && pkg.core.path) {
79
+ const p = path.resolve(path.dirname(pkgJsonPath), pkg.core.path);
80
+ if (isFile(p)) {
81
+ return { command: p, args: [], env: Object.assign({}, process.env) };
82
+ }
83
+ }
84
+ } catch {
85
+ /* platform package not installed - fall through */
86
+ }
87
+
88
+ // 4a. Bundled Python source.
89
+ const bundledPkg = path.join(ROOT, 'vendor');
90
+ if (fs.existsSync(path.join(bundledPkg, 'vulnreaper'))) {
91
+ const core = pythonCore(bundledPkg);
92
+ if (core) return core;
93
+ }
94
+
95
+ // 4b. Repository development checkout.
96
+ if (fs.existsSync(path.join(ROOT, 'vulnreaper'))) {
97
+ const core = pythonCore(ROOT);
98
+ if (core) return core;
99
+ }
100
+
101
+ throw new Error(
102
+ 'VulnReaper core not found for ' + tag + '.\n' +
103
+ ' - Install a supported platform package, or\n' +
104
+ ' - install Python 3.10+, or\n' +
105
+ ' - set VULNREAPER_CORE to the core executable path.'
106
+ );
107
+ }
108
+
109
+ module.exports = { resolveCore, platformTag, binaryName, findPython };
package/package.json CHANGED
@@ -1,6 +1,41 @@
1
1
  {
2
2
  "name": "@ksl101/vulnreaper",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0-beta.1",
4
+ "description": "VulnReaper - authorised security auditing & bug-bounty CLI for Android/Unity/IL2CPP game packages",
5
+ "keywords": [
6
+ "security",
7
+ "bug-bounty",
8
+ "pentest",
9
+ "android",
10
+ "apk",
11
+ "unity",
12
+ "il2cpp",
13
+ "static-analysis",
14
+ "cli"
15
+ ],
16
+ "homepage": "https://github.com/ksl101/vulnreaper",
17
+ "license": "SEE LICENSE IN LICENSE",
18
+ "author": "KSL101",
19
+ "bin": {
20
+ "vulnreaper": "bin/vulnreaper.js",
21
+ "vr": "bin/vulnreaper.js"
22
+ },
23
+ "main": "lib/cli.js",
24
+ "files": [
25
+ "bin/",
26
+ "lib/",
27
+ "vendor/",
28
+ "README.md",
29
+ "LICENSE"
30
+ ],
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
34
+ "scripts": {
35
+ "prepack": "node scripts/npm/pack-core.js"
36
+ },
37
+ "optionalDependencies": {},
38
+ "publishConfig": {
39
+ "access": "public"
40
+ }
41
+ }
@@ -0,0 +1,23 @@
1
+ """VulnReaper — Android game security research & bug-bounty automation platform.
2
+
3
+ A modular, offline-first toolkit for analysing Android/Unity/IL2CPP game
4
+ packages: APK/DEX/native/IL2CPP parsing, secret and misconfiguration scanning,
5
+ endpoint discovery, and JSON/Markdown/HTML reporting.
6
+
7
+ Design invariants
8
+ -----------------
9
+ * Standard library only (no third-party runtime dependencies).
10
+ * Never fabricate results: a missing external tool is reported as ``missing``
11
+ and its pipeline stage is ``skipped`` — never simulated.
12
+ * Windows-first, POSIX-compatible.
13
+ """
14
+ from __future__ import annotations
15
+
16
+ __all__ = ["__version__", "PRODUCT"]
17
+
18
+ __version__ = "0.1.0-beta.1"
19
+ PRODUCT = "VulnReaper"
20
+
21
+
22
+ def version_string() -> str:
23
+ return f"{PRODUCT} {__version__} — Security Research Platform"
@@ -0,0 +1,7 @@
1
+ """Allow ``python -m vulnreaper``."""
2
+ from __future__ import annotations
3
+
4
+ from .cli.app import main
5
+
6
+ if __name__ == "__main__":
7
+ raise SystemExit(main())
@@ -0,0 +1,101 @@
1
+ """Platform compatibility helpers.
2
+
3
+ VulnReaper targets Windows first, but keeps POSIX working. This module is the ONLY
4
+ place that should contain platform branching for stdio, console colour, process
5
+ creation flags and default home directories.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import os
10
+ import subprocess
11
+ import sys
12
+
13
+ IS_WINDOWS = os.name == "nt"
14
+
15
+
16
+ def configure_stdio() -> None:
17
+ """Force UTF-8 on stdin/stdout/stderr.
18
+
19
+ Windows consoles often default to cp1252/cp850 which breaks on Unicode
20
+ findings. ``reconfigure`` is available on Python 3.7+ TextIOWrapper.
21
+ """
22
+ for name in ("stdout", "stderr", "stdin"):
23
+ stream = getattr(sys, name, None)
24
+ reconfigure = getattr(stream, "reconfigure", None)
25
+ if reconfigure is None:
26
+ continue
27
+ try:
28
+ reconfigure(encoding="utf-8", errors="replace")
29
+ except (ValueError, OSError):
30
+ pass
31
+
32
+
33
+ def enable_virtual_terminal() -> bool:
34
+ """Enable ANSI escape processing on Windows consoles (Windows 10+).
35
+
36
+ Returns True when colours can be used. On POSIX this is a no-op.
37
+ """
38
+ if not IS_WINDOWS:
39
+ return True
40
+ try:
41
+ import ctypes
42
+
43
+ kernel32 = ctypes.windll.kernel32 # type: ignore[attr-defined]
44
+ enable_vt = 0x0004 # ENABLE_VIRTUAL_TERMINAL_PROCESSING
45
+ ok = False
46
+ for std_handle in (-11, -12): # STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
47
+ handle = kernel32.GetStdHandle(std_handle)
48
+ if handle in (0, -1):
49
+ continue
50
+ mode = ctypes.c_uint32()
51
+ if kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
52
+ if kernel32.SetConsoleMode(handle, mode.value | enable_vt):
53
+ ok = True
54
+ return ok
55
+ except Exception:
56
+ return False
57
+
58
+
59
+ def supports_colour() -> bool:
60
+ """Best-effort decision on whether to emit ANSI colour."""
61
+ if os.environ.get("NO_COLOR"):
62
+ return False
63
+ if os.environ.get("VULNREAPER_FORCE_COLOR"):
64
+ return True
65
+ if not sys.stdout.isatty():
66
+ return False
67
+ return enable_virtual_terminal()
68
+
69
+
70
+ def creation_flags() -> int:
71
+ """subprocess creation flags: hide console windows on Windows."""
72
+ if IS_WINDOWS:
73
+ return getattr(subprocess, "CREATE_NO_WINDOW", 0)
74
+ return 0
75
+
76
+
77
+ def default_home() -> str:
78
+ """Default VulnReaper home directory (config + workspaces)."""
79
+ env = os.environ.get("VULNREAPER_HOME")
80
+ if env:
81
+ return os.path.abspath(os.path.expanduser(env))
82
+ if IS_WINDOWS:
83
+ base = os.environ.get("LOCALAPPDATA") or os.path.expanduser("~")
84
+ return os.path.join(base, "vulnreaper")
85
+ base = os.environ.get("XDG_DATA_HOME") or os.path.join(os.path.expanduser("~"), ".local", "share")
86
+ return os.path.join(base, "vulnreaper")
87
+
88
+
89
+ def executable_names(name: str) -> list[str]:
90
+ """Candidate executable filenames for a tool on this platform."""
91
+ if IS_WINDOWS:
92
+ return [name + ".exe", name + ".bat", name + ".cmd", name]
93
+ return [name]
94
+
95
+
96
+ def subprocess_env() -> dict:
97
+ """Environment for child processes: force UTF-8 and unbuffered."""
98
+ env = dict(os.environ)
99
+ env.setdefault("PYTHONIOENCODING", "utf-8")
100
+ env.setdefault("PYTHONUTF8", "1")
101
+ return env
@@ -0,0 +1,4 @@
1
+ """Android APK analysis: import, manifest, DEX, native, adb."""
2
+ from __future__ import annotations
3
+
4
+ __all__ = ["apk", "manifest", "dex_analysis", "native", "adb"]