PHP 8.x · loader Rust · Web + CLI · Linux / Unix
BinaryPHP chiffre votre code PHP commercial avec AES-256-GCM, avec une clé indépendante par fichier, et l'attache à un domaine ou un MAC avec date d'expiration — tout le déchiffrement est géré de manière transparente par un loader Rust ultraléger. Les clés sont mises à jour chaque trimestre, avec une rétrocompatibilité permanente, et les coûts de cracking dépassent largement les frais de licence.
# Sur binaryphp.com/encode/, téléversez le fichier et remplissez la licence :
Domaine : acmestore.com, *.acmestore.com
Expiration : 2027-12-31
Nom : acme-pro
# Entrée → plugin.php (le code que vous avez écrit, ~40 Ko)
# Sortie → plugin.php (chiffré, ~41 Ko de contenu binaire)
# Le nom et l'extension restent identiques — vous pouvez écraser le fichier original
# directement, sans rien changer aux appels. Le loader détecte les fichiers par
# le magic header "BPHP2" (5 octets), indépendamment de l'extension.
# La clé maître reste sur notre serveur ; vous ne recevez que le résultat chiffré.
À l'instant où le client télécharge votre .zip, chaque ligne de PHP que vous avez écrite peut être copiée, modifiée, revendue.
Si le code source est étalé là, en quelques minutes la vérification de licence est retirée. Sans protection au niveau du code, une licence n'est qu'un interrupteur, pas un mur.
Dès que le client télécharge, votre propriété intellectuelle est éparpillée sur des hébergements partagés, VPS, machines CI — vous ne voyez rien, vous ne contrôlez rien, et un tar -xzf suffit pour tout extraire.
Glissez un fichier .php ou un .zip de plugin entier dans notre encodeur en ligne, configurez le domaine, le MAC, la date d'expiration. C'est tout. La clé maître reste de notre côté — vous n'avez aucune préoccupation de conservation.
Téléchargez le fichier chiffré. Chaque fichier reçoit un salt indépendant de 16 octets et une clé dérivée par HKDF-SHA256. Si même un octet est modifié, la vérification GCM échoue et l'exécution est refusée.
Le client ajoute la ligne extension=binaryphp.so dans php.ini. Le loader s'insère dans le pipeline de compilation PHP, déchiffre en mémoire, vérifie la licence (domaine via SERVER_NAME / HTTP_HOST ou MAC en CLI), et passe le code en clair directement au moteur Zend.
Chiffrement authentifié au standard NIST. Si un octet est modifié, le tag GCM ne passe pas et l'exécution est refusée.
Chaque fichier chiffré a un salt indépendant de 16 octets, puis HKDF-SHA256 dérive une clé spécifique au fichier. Chaque fichier est scellé séparément, sans interaction.
Les fonctions marquées #[binaryphp\Protected] sont compilées en notre propre bytecode — ni PHP ni opcode Zend. À l'exécution, le loader les interprète directement ; les algorithmes n'apparaissent jamais sous forme de source sur le disque du client.
Une licence peut lister plusieurs hostnames ou wildcards (*.example.com). Si un correspond, c'est validé.
Pour les outils CLI, cron jobs et environnements sans HTTP : liez la licence directement à l'adresse MAC de la machine du client (lue depuis /sys/class/net).
Émettez des versions à durée limitée (essai, abonnement, cycle de release). Le loader compare l'horloge système au timestamp embarqué dans le fichier.
Chargée via extension= dans php.ini. PHP-FPM, mod_php, CLI, FrankenPHP — tous supportés.
Une seule .so de ~2,0 Mo après strip (incluant la VM bytecode et le JIT cranelift). Déchiffrement par fichier en moins d'1 ms.
Les fichiers .php ordinaires sont compilés normalement — le loader n'intercepte que les fichiers avec le magic header BinaryPHP, le reste n'est pas touché.
Le loader s'accroche à zend_compile_file, chaque processus PHP
ne déchiffre chaque fichier qu'une fois. Après compilation en opcode Zend,
la vitesse d'exécution est identique à PHP natif.
Avec OPcache, même ce déchiffrement unique est amorti par le cache.
for + % + accumulateur) · plus court = plus rapide · référence : PHP natif
| workload | PHP natif | binaryphp-rs (.bphp · chiffrement complet) |
binaryphp-vm (#[Protected] · VM bytecode) |
|---|---|---|---|
1 million d'itérations hot loop dans une fonction (for + % + accumulateur) |
88,61 ms ± 0,95 |
89,48 ms ± 3,08 |
~115 ms (JIT) · interprété 197,56 ms |
| démarrage à froid — petit fichier (~220 o) | 56,05 ms ± 1,62 |
56,46 ms ± 1,34 |
~bphp (juste un stub, fonction non appelée, VM non démarrée) |
| démarrage à froid — fichier 10 Ko (200 fonctions) | 57,14 ms ± 1,33 |
57,09 ms ± 1,57 |
~bphp (coût VM à l'appel, pas au chargement) |
| OPcache régime établi | identique à natif |
identique à natif |
coût supplémentaire à chaque appel |
| Natif ≈ binaryphp-rs (différence dans la marge d'erreur). binaryphp-vm hot loop environ 1,3× plus lent (cranelift JIT optimise le hot path entier) — en échange, protection au niveau bytecode : même si la clé maître fuit, le contenu des fonctions reste invisible. | |||
Mesuré le 2026-05-05 avec hyperfine, chaque jeu de données 30 exécutions.
Environnement : Debian 12 (kernel 6.5) + PHP 8.2.30 + Rust 1.95.0,
Intel Xeon E5-2680 v4 @ 2.40 GHz (binaryphp.so 548 Ko,
build release + LTO). Le coût de déchiffrement par include équivaut à
taille du fichier / 1 Go/s (accélération matérielle AES-NI),
plus ~50 µs pour HKDF et la vérification de licence. Le coût d'exécution VM
est proportionnel au nombre d'instructions bytecode.
Les optimisations peephole du compilateur ($x++,
$x += k, $x = $x + e, comparaisons entières slot-vs-slot,
$x * imm, x % imm) ont compressé le coût hot loop de ~5×
à ~2,5× en fusionnant les opérations stack LoadVar / StoreVar en une seule op.
Couverture du langage VM :
POO (classes, extends, abstract,
interface, trait + use,
static, constantes de classe, $this,
parent::, self::, méthodes magiques
__construct / __get /
__set / __call) ;
closures function () use (…) et
fonctions fléchées fn () => expr ;
try / catch / finally / throw ;
match, === / !==, ??,
?:, <=>, instanceof ;
générateurs lazy / coroutines (yield avec frame snapshot & resume —
générateurs infinis utilisables, seules les valeurs réellement consommées sont calculées) ;
for / while / foreach / switch / break / continue complets ;
spread ...$args ;
références &$x (paramètres de fonction et built-ins comme
array_push / sort) ;
global ; heredoc / nowdoc ;
~50 fonctions built-in (strlen,
count, trim, explode,
implode, sprintf, md5,
sha1, base64_encode/decode,
array_*, etc.) ;
#[Protected] applicable aux méthodes de classe, $this->prop
lecture/écriture synchronisée automatiquement entre PHP et VM ;
cranelift AOT JIT optimise les hot loops entiers.
.bphp (binaryphp-rs) suffit —
la différence avec PHP natif n'est plus mesurable. #[Protected] (binaryphp-vm)
est réservé aux fonctions les plus sensibles — validation de licence, dérivation de clé, anti-tamper —
moyennant ~2,5× le coût d'exécution, vous obtenez « même si la clé maître fuit, la logique principale reste invisible ».
Avec OPcache, les chemins non protégés sont aussi rapides que PHP natif.
Via Stripe, mensuel ou annuel, annuel automatiquement -20%.
.php ou .zip.zip jusqu'à 100 MoLa version gratuite et les versions payantes utilisent le même moteur d'encodage ! Même AES-256-GCM, même VM bytecode, force de protection rigoureusement identique. Seule différence : les quotas d'utilisation (taille de fichier, droits API, débit batch).
Gratuit, librement redistribuable. Tout hôte qui exécutera un plugin chiffré BinaryPHP doit d'abord installer ceci.
# 1. Copier le .so dans le répertoire d'extensions PHP
$ sudo cp binaryphp.so /usr/lib/php/20220829/
# 2. Activer l'extension
$ echo 'extension=binaryphp.so' | sudo tee /etc/php/8.2/mods-available/binaryphp.ini
$ sudo phpenmod binaryphp
# 3. Redémarrer PHP-FPM (ou votre SAPI)
$ sudo systemctl restart php8.2-fpm
Vérifier que le loader est activé :
$ php -r 'echo binaryphp_version();'
0.9.2
$ php -r 'echo binaryphp_hostname();'
your-domain-or-hostname
$ php -r 'print_r(binaryphp_macs());'
Array ( [0] => aa:bb:cc:dd:ee:ff )
Ou ouvrez n'importe quelle page phpinfo() dans le navigateur — vous y verrez un bloc BinaryPHP dédié, listant la version du loader, la génération master, les formats supportés, l'état de la VM bytecode. Particulièrement pratique pour les environnements sans CLI (cPanel, Plesk, hébergement partagé) :
BinaryPHP support → enabled
Loader version → 0.9.2
Master gen → 2 (rotated 2026-05-06)
File formats → BPHP2/3/4 · HBPH1/2/3 · BVMC1/2/3
Bytecode VM → v3 obfuscation + cranelift JIT
Choisissez la version mineure correspondant à votre PHP (chaque .so est compilé pour son ABI, non interchangeable) :
Exécutez php -v sur votre serveur pour voir la version réelle. macOS / aarch64 / FreeBSD non supportés actuellement.
Pas d'installation CLI, pas de garde de clé maître. Ouvrez l'encodeur, téléversez, configurez la licence, téléchargez le fichier chiffré. C'est tout.
.php → .php)Free accepte .php ou .zip, jusqu'à 1 Mo. Pro jusqu'à 100 Mo ; Ultra via multipart jusqu'à 300 Mo.
Honnêtement : aucun DRM exécutable hors-ligne ne peut garantir « incassable à jamais ». ionCube, Zend Guard, SourceGuardian ont tous été étudiés et cassés.
L'objectif de BinaryPHP n'est donc pas la « sécurité absolue » mythique, mais :
Rendre le coût du cracking largement supérieur au coût de la licence légitime.
Cracker BinaryPHP n'est pas seulement « déchiffrer un fichier ». Un attaquant doit généralement aussi :
Même en cas de succès, ce qu'on obtient n'est généralement pas le code source, mais :
Et BinaryPHP est mis à jour en continu :
Les anciens outils de cracking deviennent rapidement obsolètes.
C'est la philosophie centrale de BinaryPHP :
Ne pas rendre le cracking « impossible », mais « non rentable ».
Pour les programmes tournant sur un serveur web : liaison au domaine. Le loader vérifie d'abord $_SERVER['SERVER_NAME'] (défini par nginx / Apache, non falsifiable côté client), puis fallback sur HTTP_HOST si absent. Les outils CLI utilisent la liaison à l'adresse MAC. On peut remplir les deux ; un seul match suffit.
Non. Le déchiffrement n'a lieu qu'à l'étape de compilation, une fois par fichier. Après compilation, la vitesse d'exécution est identique au PHP natif. Avec OPcache, même ce déchiffrement unique est amorti sur toutes les requêtes suivantes.
Avec l'encodeur SaaS : non. La clé maître reste toujours de notre côté, et ne fuit pas vers votre environnement.
BinaryPHP est une nouvelle version construite de zéro en 2026, basée sur de la cryptographie moderne (AES-256-GCM, HKDF-SHA256), avec la logique métier enveloppée dans notre propre VM bytecode. Toolchain en SaaS, clé maître toujours sur notre serveur, format de fichier avec spec publique.
L'hôte doit installer le loader BinaryPHP au préalable. Le loader est gratuit et librement redistribuable — vous pouvez demander au client de l'installer lui-même (une ligne dans php.ini) ou demander à l'hébergeur une préinstallation.
Le loader intègre trois couches de défense indépendantes :
#[binaryphp\Protected]. Ces fonctions sont compilées en notre propre bytecode (ni PHP, ni opcode Zend), interprétées directement par le loader à l'exécution. Le PHP en clair n'apparaît jamais sur le disque du client.Les algorithmes les plus sensibles sont à exécuter sur votre propre API serveur ; pour le reste, BinaryPHP fournit une protection multicouche, sans avoir à réécrire tout le programme.
Oui. BinaryPHP intercepte le pipeline de compilation PHP, donc include / require fonctionnent normalement — Composer autoload, routeur de framework, systèmes de plugins, tout fonctionne sans problème.
Oui. OPcache reprend le cache des résultats de compilation après notre déchiffrement et compilation ; un seul déchiffrement par cycle d'invalidation.
Spécification publique et stable : header de 52 octets ("BPHP2" magic + version + 16-byte salt + 12-byte IV + 16-byte GCM tag), suivi du chiffrat.
La facturation passe entièrement par Stripe, au choix :
Les abonnements bénéficient d'une garantie de remboursement de 30 jours. Stripe accepte toutes les principales cartes de crédit et de nombreux moyens de paiement régionaux.
Architecturalement non. Nous n'exécutons pas le PHP que vous téléversez ; nous nous contentons de le tokeniser (découpage syntaxique) et de le chiffrer. L'encodeur applique token_get_all() (le lexeur de PHP, pas l'exécuteur) au fichier, sépare HTML et blocs PHP, chiffre chaque bloc PHP en AES et écrit le fichier. Aucun eval, include, ni appel à un shell n'est utilisé dans tout le processus.
L'upload de zip ajoute quatre lignes de défense (vérification avant extraction) :
../, chemins absolus, lettres de lecteur)Chaque tâche d'encodage tourne dans un répertoire temporaire isolé, nettoyé immédiatement après l'envoi de la réponse. Vous pouvez téléverser n'importe quel code malveillant — nous le chiffrons et vous le rendons.
Pour les ISV / SaaS qui revendent des plugins PHP chiffrés. Une fois que le client commande chez vous :
POST vers notre API REST avec le domaine / MAC du client, les paramètres d'encodage, l'URL du webhook.POST du lien de téléchargement vers votre webhook configuré.Les résultats d'encodage restent 72 heures sur R2 puis sont supprimés automatiquement ; les sources que vous téléversez sont supprimées sous 24 heures.
Service mail 10 minutes
« Nous avons d'abord testé BinaryPHP avec la version gratuite, l'impression était bonne. Maintenant nous utilisons Pro pour compiler tout le site, PHPMailer compris. C'est vraiment puissant ! Aucun ralentissement perçu. »
Connectez-vous avec Google et commencez — version gratuite immédiatement utilisable, sans carte bancaire.