programing

PHP의 opcode를 얻는 방법

newsource 2022. 9. 26. 23:02

PHP의 opcode를 얻는 방법

  <?php
      $show_value   = 123;
      echo 'sing_quote'.$show_value;
      echo "double_quote{$show_value}";

  ?>

opcode는 다음과 같습니다.

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

Vulcan Logic Disassembler PECL 확장을 확인하십시오. 자세한 내용은 저자 홈페이지를 참조하십시오.

Vulcan Logic Disassembler는 Zend Engine에 후크하여 스크립트의 모든 opcode(실행 유닛)를 덤프합니다.인코더의 시작이라고 쓰여져 있었지만, 그럴 시간이 없었습니다.Zend Engine에서 무슨 일이 일어나고 있는지 확인하는 데 사용할 수 있습니다.

인스톨 하면, 다음과 같이 사용할 수 있습니다.

php -d vld.active=1 -d vld.execute=0 -f yourscript.php

opcode 추출에 관한 이 흥미로운 블로그 투고와 사용 가능한 opcode를 나열한 PHP 매뉴얼 페이지를 참조하십시오.

Parsekit에는 parsekit_compile_string()이 있습니다.

sudo pecl install parsekit
var_dump(parsekit_compile_string)(< PHP)\$show_value = 123;'sing_sing'을 에코합니다.\$show_value;echo "double_syslogs$show_value",PHP));

출력은 매우 상세하기 때문에 어셈블러와 같은 포맷을 얻으려면 처리를 해야 합니다.

["opcodes"]=>어레이(10) {[0]=>어레이(9) {["주소"]=>int(44682716)["opcode"]=>int(101)["opcode_name"]=>문자열(13) "ZEND_EXT_STMT"["contract"]=>int(4294967295)["결과"]=>어레이(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_UNSED"["var"]=>int(0)["opline_num"]=>string (1) "0"["op_array"]=>string (1) "0"["jmp_addr"]=>string (1) "0"["jmp_mp"]=>string(8) "35419039"["EA.type"]=>int(0)}

https://3v4l.org/ 를 사용하면 코드를 실행하고 opcode도 볼 수 있습니다.

주의: Vulcan Logic Disassemblyler(VLD) 출력이 자동으로 표시되지만 버전 드롭다운에서 "지원되는 모든 버전"이 선택되어 있는 경우에만 표시됩니다.

이하에 간단한 예를 나타냅니다(후세를 위해 참조).https://3v4l.org/Gt8fd/vld

코드:

<?php
$arr = [1, 2, 3, 4];
print_r(array_map(fn(int $i): int => $i * $i, $arr));

결과:

Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/Gt8fd
function name:  (null)
number of ops:  10
compiled vars:  !0 = $arr
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    2     0  E >   ASSIGN                                                   !0, <array>
    3     1        INIT_FCALL                                               'print_r'
          2        INIT_FCALL                                               'array_map'
          3        DECLARE_LAMBDA_FUNCTION                                  '%00%7Bclosure%7D%2Fin%2FGt8fd%3A3%240'
          4        SEND_VAL                                                 ~2
          5        SEND_VAR                                                 !0
          6        DO_ICALL                                         $3      
          7        SEND_VAR                                                 $3
          8        DO_ICALL                                                 
          9      > RETURN                                                   1

Function %00%7Bclosure%7D%2Fin%2FGt8fd%3A3%240:
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/Gt8fd
function name:  {closure}
number of ops:  6
compiled vars:  !0 = $i
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
          0  E >   RECV                                             !0      
          1        MUL                                              ~1      !0, !0
          2        VERIFY_RETURN_TYPE                                       ~1
          3      > RETURN                                                   ~1
          4*       VERIFY_RETURN_TYPE                                       
          5*     > RETURN                                                   null

End of function %00%7Bclosure%7D%2Fin%2FGt8fd%3A3%240

Generated using Vulcan Logic Dumper, using php 8.0.0

언급URL : https://stackoverflow.com/questions/1795425/how-to-get-opcodes-of-php