当我将它挂钩到php扩展中时如何获取函数名

时间:2017-08-07 14:28:01

标签: php php-internals

我尝试编写一个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;
}

1 个答案:

答案 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));