php opcode还原
导读:PHP Opcode还原简介PHP Opcode还原是一种逆向工程技术,它可以将PHP代码从编译后的opcode指令还原成可读的PHP源代码。通俗解释就是如果我们想看看别人的PHP程序到底实现了什么功能,但是又不知道源代码是怎么写的,这时候...
PHP Opcode还原简介PHP Opcode还原是一种逆向工程技术,它可以将PHP代码从编译后的opcode指令还原成可读的PHP源代码。通俗解释就是如果我们想看看别人的PHP程序到底实现了什么功能,但是又不知道源代码是怎么写的,这时候就需要使用opcode还原技术了。与常规的代码分析不同,opcode还原可以直接看到程序被编译成的指令,更直接地分析程序运行的机理。举个例子,假设有如下PHP代码:``````如果我们用opcode阅读器来查看它,会得到类似下面这样一串看不懂的指令:```L1: subl $36, %espL2: movl 8(%ebp), %eaxL3: movl %eax, (%esp)L4: movl 12(%ebp), %eaxL5: movl %eax, 4(%esp)L6: call _Z3fooiiL7: movl %eax, (%esp)L8: call _Z5printSsL9: addl $36, %espL10: movl $0, %eaxL11: leaveL12: ret```对于这样的代码,普通开发者根本看不出程序实现了什么功能。但是如果像下面这样对它还原,就可以直观地看到源代码实现是什么:```function foo($num1, $num2) {
$sum = $num1 + $num2;
if ($sum >
10) {
return "the sum of num1 and num2 is large than 10";
}
else {
return "the sum of num1 and num2 is smaller than 10";
}
}
echo foo(5, 7);
```可以看到,函数foo()接收两个参数,将它们相加,并根据加和的大小返回不同的字符串。如果不使用opcode还原技术,我们可能需要手动分析汇编指令,并且还可能难以解决底层指令的如何映射到PHP代码的问题。如何使用PHP Opcode还原PHP Opcode还原的操作很简单,只需要使用PHP_OPCODE_HANDLER_EXT扩展或者Zend Dump就可以实现。这里,我们以Zend Dump为例,详细介绍如何使用PHP Opcode还原。首先,需要打开Zend Extension Manager才能使用Zend Dump。在php.ini文件中加入以下行:```zend_extension=/path/to/extension_dir/opcache.soopcache.enable=1opcache.enable_cli=1```启动php之后,使用以下命令可以启动Zend Dump:```php -dzend_extension=opcache.so -ddump_passes=+ZDUMP_FILE -ddump_dir=/path/to/output some_script.php```其中,dump_dir的值就是你还原后的PHP源代码输出目录。当然,如果只是查看某个函数的opcode指令,也可以使用Zend Dump。例如,想要查看函数foo()的opcode,可以在PHP代码中加上以下行:```zend_compile_string("foo()", "");
```运行程序之后,在输出目录就可以找到像下面这样的文件:```filename=op_array_dumper--1580443381-bne.bin```打开这个文件,就可以看到类似下面这样的PHP源码:```file:///Users/xxxxxx/Development/PHP/licenserecognition/13.php| return "the sum of num1 and num2 is smaller than 10"73 >
RETURN '1:5';
CV0=$num1;
CV1=$num2```其中的73就是opcode指令在PHP代码中对应的行数。通过这个文件,我们可以很方便地查看任何PHP代码实际执行的指令。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: php opcode还原
本文地址: https://pptw.com/jishu/561082.html
