2017-08-07 26 views
1

php cgiファイルで呼び出されるzend内部関数を検出するためのPHPモジュールを作成しようとしました。以下に示すようなコードが好きで、私は自分のコードに 'printf'という名前を付けたい。PHP拡張モジュールで関数名を取得する方法

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

は今、私は名前の関数で、この関数を夢中「zend_set_user_opcode_handler'.However、私は夢中になりました関数名を取得することはできませんよ。(それは 『この例でのprintf』。)だから、何べき関数hook_handler()で 'printf'を達成したいのですか?

ここにコードがあります。

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

私は答えがあります。フックされた関数の名前を達成するには、2つの異なる方法があります。

まず、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)); 
関連する問題