2017-08-07 2 views
1

Ich habe versucht, ein PHP-Modul zu schreiben, das verwendet wird, um zend interne Funktion zu erkennen, die in einer PHP-CGI-Datei aufgerufen wird. Ich mochte den unten gezeigten Code, ich möchte seinen Namen bekommen - 'printf' in meinem Code.Wie bekomme ich einen Funktionsnamen, wenn ich es in eine PHP-Erweiterung sendete

<?php printf("Hello SO!");?> 

Jetzt hakte ich diese Funktion mit einer Funktion namens ‚zend_set_user_opcode_handler'.However, ich bin nicht in der Lage, die Funktion Namen zu erhalten, die süchtig wurde. (Es ist‚printf‘in diesem Beispiel.) Also, was sollte Ich mache, wenn ich das 'printf' in der Funktion hook_handler() erreichen will?

Codes hier.

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; 
} 

Antwort

0

Hey Leute, ich habe die Antwort. Es gibt zwei verschiedene Methoden, um den Namen der Hook-Funktion zu erreichen.

Erstens, wenn PHP5 verwendet wird, ist eine Definition von Makro notwendig, weil die Methode von der PHP-Nebenversion abhängen (weniger als 4 oder nicht).

#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)); 

Zweitens, wenn PHP7 verwendet wird, Parameter von shellhook() ist ZEND_OPCODE_HANDLER_ARGS nicht mehr. Es wird durch zend_execute_data * execute_data ersetzt.

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)); 
Verwandte Themen