当我在 php7.0 扩展中挂钩时如何获取函数参数
How to get a function args when I hooked it in a php7.0 exetension
我尝试编写一个 php 扩展来获取函数参数。
<?php system('ls');?>
在这个例子中是 'ls'。
这个函数我hook了zend_set_user_opcode_handler,函数代码是
PHP_MINIT_FUNCTION(hello)
{
zend_set_user_opcode_handler(ZEND_DO_ICALL, do_fcall_handle);
return SUCCESS;
}
static int do_fcall_handle(ZEND_OPCODE_HANDLER_ARGS){
return ZEND_USER_OPCODE_DISPATCH;
}
PHP版本是7.2.5。
在 php7 中,使用 EG(current_execute_data)->call 获取参数名称和值。
static int do_fcall_handle(ZEND_OPCODE_HANDLER_ARGS){
zend_string *funcName = EG(current_execute_data)->call->func->common.function_name;
php_printf("[!] Hooked `%s`, ",ZSTR_VAL(funcName));
int arg_count = EG(current_execute_data)->call->This.u2.num_args;
for(int i=0; i<arg_count; i++){
php_printf("arg%d is `%s`, ", i+1, ZSTR_VAL((EG(vm_stack_top)-(i+1))->value.str) );
}
php_printf("HOOK end;\n");
return ZEND_USER_OPCODE_DISPATCH;
}
我尝试编写一个 php 扩展来获取函数参数。
<?php system('ls');?>
在这个例子中是 'ls'。
这个函数我hook了zend_set_user_opcode_handler,函数代码是
PHP_MINIT_FUNCTION(hello)
{
zend_set_user_opcode_handler(ZEND_DO_ICALL, do_fcall_handle);
return SUCCESS;
}
static int do_fcall_handle(ZEND_OPCODE_HANDLER_ARGS){
return ZEND_USER_OPCODE_DISPATCH;
}
PHP版本是7.2.5。
在 php7 中,使用 EG(current_execute_data)->call 获取参数名称和值。
static int do_fcall_handle(ZEND_OPCODE_HANDLER_ARGS){
zend_string *funcName = EG(current_execute_data)->call->func->common.function_name;
php_printf("[!] Hooked `%s`, ",ZSTR_VAL(funcName));
int arg_count = EG(current_execute_data)->call->This.u2.num_args;
for(int i=0; i<arg_count; i++){
php_printf("arg%d is `%s`, ", i+1, ZSTR_VAL((EG(vm_stack_top)-(i+1))->value.str) );
}
php_printf("HOOK end;\n");
return ZEND_USER_OPCODE_DISPATCH;
}