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
'programing' 카테고리의 다른 글
공장 패턴과 전략 패턴의 차이점은 무엇입니까? (0) | 2022.09.26 |
---|---|
'for' 루프 내부의 'for' 루프가 동일한 카운터 변수 이름을 사용할 수 있습니까? (0) | 2022.09.26 |
도커 컨테이너에 mariaDB를 입력하는 방법 (0) | 2022.09.26 |
3가지 다른 점은 (0) | 2022.09.25 |
값 오류:요소가 두 개 이상인 배열의 참값 값이 모호합니다.a.any() 또는 a.all()을 사용합니다. (0) | 2022.09.25 |