b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

php语法基础 【原创】PHP魔方加密 手动反编译基于栈的指令(4)

电脑杂谈  发布时间:2018-02-08 12:09:56  来源:网络整理

代码中对循环也做出了判断,如果指针往已经运行过的地方跳转,就是循环了,循环。

同样,我们还是美观地输出一下我们的成果

代码分块输出文本1.jpg

这回,我们的代码已经不需要指令指针这个东西了,顺序执行即可。

这一步,我们需要把已经分块的代码,根据每一个操作指令对栈做出的操作,推算出原本的代码是什么样的。

add              esp, 16
push             (null)
db               [esp], 'is_admin'
call (0)         [esp]
not              [esp]
if               [esp]
    pop
else
    pop
    push             (null)
    link             [esp], [ebp+1]
    push             (null)
    db               [esp], 'Grace'
    ......

add esp,16 申请局部变量,我们要在程序中生成 16 个局部变量的变量名。

/**
 * 分配局部变量
 * @param int $count
 */
protected function _add($count)
{
    for ($i = 0; $i < $count; ++$i) {
        $this->v[] = new Variable('v' . $i);
    }
}

push (null) 这里向栈中压入了一个 null,我们向语法树种压入一个 null 即可

protected function _push()
{
    ++$this->astp;
    $this->ast[$this->astp] = new ConstFetch(new Name('null'));
}

为什么要向语法树中压入 null,而不是向一个栈中压入?

因为我们是解释程序代码,反编译,我们分析指令的用途,把指令对栈的操作,转换为构造语法树的操作。所以不能像栈中压入,虽然我们构造语法树的方式也是用压栈、出栈的方式。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-67089-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 徐坚
      徐坚

      一起围捕拉森号去

    • 晋景公
      晋景公

      而且这次派出的052D也是旧军舰了

    热点图片
    拼命载入中...