【问题标题】:Zend extension, get arguments of echo?Zend 扩展,得到 echo 的参数?
【发布时间】:2011-11-30 11:18:59
【问题描述】:

我们做了一个 Zend 扩展,我们想要写出 zval 的 echo 应该写出的地址,但是我们不知道如何接收它们,因为我们注意到 echo "test" 之间存在差异;和 $a = "测试";回声$a;

.... Some stuff that overrides the echo opcode ....

FILE *tmpfile;
int echo_handler(ZEND_OPCODE_HANDLER_ARGS)
{
    zend_op *opline = execute_data->opline;
    tmpfile = fopen("/tmp/echo.test","a+");
    fprintf(tmpfile,"Echo was called\n");
    fclose(tmpfile);

    return ZEND_USER_OPCODE_DISPATCH;
}

不管是不是变量,我们如何获取参数?

【问题讨论】:

  • 看我的回答。虽然它应该可以工作,但我想知道你需要这个做什么?也许您采用了错误的方法,或者是解决错误问题的正确方法。
  • 好吧,我们正在尝试在模块中实现某种污染,我们的方法如下(对于非常简单的污染) 1. 在执行开始时,获取 $_GET 的 zvals 地址元素 (DONE) 2. 在回显时,获取要回显的 zval 地址的地址,并检查它是否是 _GET zval 之一。 (未完成 - 回声挂钩)这看起来合法吗?
  • 是的,正如您所说,对于非常简单的污染 - 我的解决方案应该有效。在我的(很少的)空闲时间里,我正在做一些相关的事情:一个扩展,它将为 php 脚本提供静态代码分析功能,这对你来说可能也很有趣。
  • 听起来很有趣,它可以在任何地方使用吗?
  • 当然,pecl.php.net/package/meta。它目前还没有做太多,但可能值得关注。

标签: php-internals


【解决方案1】:

echo 的处理程序是

static int ZEND_FASTCALL  ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
    zend_op *opline = EX(opline);

    zval z_copy;
    zval *z = &opline->op1.u.constant;

    if (IS_CONST != IS_CONST &&
        Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL &&
        zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
        zend_print_variable(&z_copy);
        zval_dtor(&z_copy);
    } else {
        zend_print_variable(z);
    }

    ZEND_VM_NEXT_OPCODE();
}

来自Zend/zend_vm_execute.h,正如您所见,它基本上所做的只是调用zend_print_variable()。

挂钩该功能,您应该走在正确的轨道上。

奖励:它也适用于 print 语句。

【讨论】:

  • 现在,我开始迷失在 Zend 代码中,我一直在使用 zend_set_user_opcode_handler(ZEND_ECHO, echo_handler);挂接回声的方法,每次按计划触发,但 opline->op1.op_type 为 4 (IS_VAR),这意味着 op1.u.contant 不会保存 zval 的值,但我想如何从execute_data中检索它...除了源代码之外,是否有任何关于execute_data结构的文档?
  • 编辑:当 op1.op_type 为 IS_VAR 时,我不知道如何从 execute_data 中检索 zval
  • 我还是迷路了:/您提到的处理程序仅适用于 op1.optype 为 IS_CONST 时,但 ZEND_ECHO_SPEC_VAR_HANDLER 使用另一种方式访问​​回声的 zval,但是如果我使用与ZEND_ECHO_SPEC_VAR_HANDLER 它尝试访问一些“随机”数据,因为指针似乎未设置/从未设置。是否可以直接挂钩 ZEND_ECHO_SPEC_VAR_HANDLER 而不是任何回显操作码?
猜你喜欢
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多