我尝试编写一个PHP模块,用于检测在php cgi文件中调用的zend内部函数。喜欢下面显示的代码,我想得到它的名字 - ' printf'在我的代码中。
<?php printf("Hello SO!");?>
现在我用一个名为&#39; zend_set_user_opcode_handler&#39;的函数挂钩了这个函数。但是,我无法获得被钩住的函数名。(在这个例子中是&#39; printf&#39;那么,如果我想实现那个&#39; printf&#39;在函数hook_handler()?
此处代码。
int shellhook_handler(ZEND_OPCODE_HANDLER_ARGS){
/* What should I do to catch function name here*/
return ZEND_USER_OPCODE_DISPATCH;
}
PHP_MINIT_FUNCTION(shellhook)
{
REGISTER_INI_ENTRIES();
zend_set_user_opcode_handler(ZEND_DO_FCALL, hook_handler);
return SUCCESS;
}
答案 0 :(得分:0)
嘿伙计们我得到了答案。有两种不同的方法来实现钩子函数的名称。
首先,如果使用PHP5,则需要定义宏,因为该方法取决于PHP次要版本(小于4)。
#if (PHP_MAJOR_VERSION == 5) && (PHP_MINOR_VERSION < 4)
# define OP1_CONSTANT_PTR(n) (&(n)->op1.u.constant)
#else
# define OP1_CONSTANT_PTR(n) ((n)->op1.zv)
#endif
zend_op *opline = execute_data->opline;
zval *fname = OP1_CONSTANT_PTR(opline);
php_printf("FunctionName:%s\n",Z_STRVAL_P(fname));
其次,如果使用PHP7,则shellhook()的参数不再是ZEND_OPCODE_HANDLER_ARGS。它由zend_execute_data * execute_data替换。
zend_execute_data *call = execute_data->call;
zend_function *fbc = call->func;
zend_string *fname = fbc->common.function_name;
php_printf("FunctionName:%s\n",ZSTR_VAL(fname));