Wie Opcodes von PHP zu bekommen?
Frage
<?php
$show_value = 123;
echo 'sing_quote'.$show_value;
echo "double_quote{$show_value}";
?>
Der Opcode ist:
1: <?php
2: $show_value = 123;
0 ASSIGN !0, 123
3: echo 'sing_quote'.$show_value;
1 CONCAT 'sing_quote', !0 =>RES[~1]
2 ECHO ~1
4: echo "double_quote{$show_value}";
3 ADD_STRING 'double_quote' =>RES[~2]
4 ADD_VAR ~2, !0 =>RES[~2]
5 ECHO ~2
6 RETURN 1
Lösung
Schauen Sie sich die Vulcan Logic Disassembler Erweiterung PECL - siehe Homepage des Autors für weitere Informationen.
Die Vulcan Logic Disassembler Haken in die Zend Engine und lädt alle OP-Codes (Ausführungseinheiten) eines Skripts. Es wurde als als Beginn einer schriftlichen Encoder, aber ich habe nie die Zeit für Das. Es kann zu sehen, verwendet werden, was los in der Zend Engine.
Nach der Installation können Sie es wie folgt verwendet werden:
php -d vld.active=1 -d vld.execute=0 -f yourscript.php
Siehe auch diese interessante Blog-Post auf Opcode Extraktion und dem PHP-Handbuch Seite mit einer Liste der verfügbaren Opcodes .
Andere Tipps
Parsekit hat parsekit_compile_string () .
sudo pecl install parsekit
var_dump(parsekit_compile_string(<<<PHP \$show_value = 123; echo 'sing_quote'.\$show_value; echo "double_quote{\$show_value}"; PHP ));
Die Ausgabe ist recht ausführlich, so dass Sie es verarbeiten bräuchten Assembler-ähnliches Format zu erhalten.
["opcodes"]=> array(10) { [0]=> array(9) { ["address"]=> int(44682716) ["opcode"]=> int(101) ["opcode_name"]=> string(13) "ZEND_EXT_STMT" ["flags"]=> int(4294967295) ["result"]=> array(8) { ["type"]=> int(8) ["type_name"]=> string(9) "IS_UNUSED" ["var"]=> int(0) ["opline_num"]=> string(1) "0" ["op_array"]=> string(1) "0" ["jmp_addr"]=> string(1) "0" ["jmp_offset"]=> string(8) "35419039" ["EA.type"]=> int(0) } ["op1"]=> array(8) { ["type"]=> int(8) ["type_name"]=> string(9) "IS_UNUSED" ["var"]=> int(0) ["opline_num"]=> string(1) "0" ["op_array"]=> string(1) "0" ["jmp_addr"]=> string(1) "0" ["jmp_offset"]=> string(8) "35419039" ["EA.type"]=> int(0) }