Ik heb het idee dat het allemaal een beetje uit zn proporties/context is gerukt.
Het leuke aan PHP is dat ik een functie kan declaren (laten we zeggen functieBlaat), en daarna moet ik door middel van een string ($a="functieBlaat";) die functie weer aan kunnen roepen: $a();
Verder kun je zelfs variables dmv een string gereferenced worden:
$a="Test";
$b="a";
echo $$b; zal dan "Test" weergeven.
Dit soort trukjes zijn juist de kracht van PHP: het biedt allemaal leuke (en soms handige) constructies, en de ondergang van dit soort optimizers: er zit niets anders op dan voor elke variable bijhouden wat de originele naam is.
Tuurlijk kun je de bovenstaande stukjes wel optimaliseren, maar wat als bij de functie-aanroep $a veranderd wordt door een ge include bestand? of wat als in het volgende stukje $b halverwege vervangen wordt door een of andere rekensom waar user-input in voorkomt ?
Dit alles komt er op neer dat je dus niet alleen bytecode hebt, zoals bij C of een andere low-level taal, maar naast die bytecode ook de variable/functie-namen.
Bytecode op zich is niet zo erg, hier kun je alleen de logica van het programma uithalen: wat het doet. Hiermee kun je dus wel functies terug krijgen (of iets wat op het origineel lijkt), maar niet de functie-naam of variable naam. Kortom, je moet alles goed doorlezen om er uberhaupt achter te komen wat de functie nou precies doet.
Met de toevoeging van variable and functie namen zie je hem waarschijnlijk al aankomen: Je kan de bytecode terugveranderen naar PHP-achtige code, waarbij de functie en variable-namen zijn behouden: prima leesbare code, alleen je comments ontbreken
Kortom: door de manier waarop PHP opgezet is, zal dit probleem er altijd zijn. Je kan geen compleet onkraakbare versleuteling maken, want dan zou je het script niet meer kunnen draaien.
(Toevoeging: Zelfs C-bytecode/ASM kun je meestal nog heel veel informatie uit krijgen. Hoe denk je dat keygenners te werk gaan?)