【问题标题】:How does ionCube work internally?ionCube 如何在内部工作?
【发布时间】:2016-10-03 05:46:34
【问题描述】:

ionCube 以加密格式存储 php 文件,它作为 php 扩展安装,但我想知道的是,当我从非加密 php 文件请求加密 php 文件时,php 编译器如何执行它。

它是否将加密文件发送到 ionCube 服务器并获取原始文件并进行编译,或者还有其他内容。

表示我们的服务器和 ionCube 之间的通信方式。我猜是通过 curl 但我想知道它是如何工作的。

【问题讨论】:

  • 您的意思是您想要对其操作有一个高层次的了解,对吧?低层次的解释太宽泛了。适用于任何 Stack Exchange 站点。官方文档不是已经回答了吗?
  • 看了ionCube的general description,可以说两者都可以。 “简单”执行将 php 文件编译为字节码(混淆而不是加密),但也有这样的:“9.0 版包括动态和外部密钥的新功能,进一步保护已编译的字节码。” 这似乎就是你要问的。

标签: php encryption ioncube


【解决方案1】:

您现在可能已经了解到,原始代码永远不会获得,并且处理是基于字节码的。

这里有一些可能会有所帮助的高级信息。

PHP 扩展

PHP 有两种类型的扩展,module 扩展,例如通常包装外部 API 并通过新的 PHP 函数公开其功能的 CURL,以及 PHP engine 扩展。尽管区别并不是一成不变的,但引擎扩展往往会与 PHP 的编译器和执行引擎交互,尽管它们也可能会添加新的 PHP 函数。 ionCube 是一个引擎扩展,它还为其 API 添加 PHP 函数并支持 ionCube24,尽管也可以使用 dl() 作为模块扩展安装。两种模块都是共享库,php.ini文件中的一行用于为PHP添加扩展,PHP利用OS函数将库动态链接到正在运行的进程中。

挂钩

PHP 具有允许扩展拦截源文件处理的编译和执行阶段的内部挂钩。扩展可能会使用这些简单地在常规处理之前或之后执行额外的步骤,或者完全替换通常的处理。 ionCube Loader 使用 compile hook 在 PHP 引擎编译文件之前检查文件,如果文件是 ionCube 文件,则接管处理文件的任务。读取 ionCube 文件或正常编译的结果最终是字节码,但是 ionCube 字节码是非标准的,在第 9 版中,在对文件进行初始处理后,它可能仍然被加密或由于其他原因不可用。由于标准执行引擎无法处理 ionCube 字节码,如果从 ionCube 编码文件中读取编译代码,Loader 还使用执行挂钩来接管编译代码的执行。 Loader 的另一个任务是允许为某些旧版本的 PHP 生成的文件在新版本上运行,并且在必要时,Loader 对编译的代码执行动态转换,以使其可用于正在运行的任何版本的 PHP。 PHP 内部结构会不时发生重大变化,最近一次也是 PHP 5 和 7 之间的变化最为显着,这使得这对最终用户体验来说是一项具有挑战性但又很重要的任务。

ionCube 文件的处理不需要与外部服务器通信,但是从版本 9 开始,代码可以使用加密密钥进行保护,加密密钥仅在 PHP 应用程序本身在运行时创建时才存在,并且应用程序开发人员可以编写 PHP 代码,使外部调用以在需要时获取用于构造解密密钥的数据。

编码文件

就文件本身而言,这种类型的早期PHP编码工具本质上是编译成字节码,并将这种形式直接序列化为文件。一般开发人员对 PHP 内部知识和兴趣很少,这种方法提供了良好的保护和出色的性能。大约在 2006 年左右,当中国一个名为“Blue Wind”的黑客组织开始对生产字节码反编译器产生兴趣时,简单地编译成字节码显然不再可接受。在不同程度上,ionCube 等工具随后在字节码周围添加了更多保护,以阻碍成功进行逆向工程的任务。尽管可以采取措施限制反编译的有效性,即使字节码被恢复,但代码保护的成功仍然从根本上取决于隐藏必要解码密钥的能力,以及所有编码工具这种类型的将这样的密钥存储在编码文件本身中。

在改进 ionCube 版本 9 的代码保护过程中,一个挑战是解决存储密钥的限制,以及加密代码的能力在任何地方静态存储必要的解密密钥 > 是显而易见且必要的下一步。这是作为称为“动态键”的功能添加的。

希望这能让您深入了解 ionCube 以及在某些方面类似工具的工作原理。有关引擎扩展实现的更详细知识,我建议查看 PHP OpCache 的源代码以及 Derick Rethans Xdebug。

披露:我与 ionCube 有关。

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 2010-10-14
    • 2013-09-28
    • 2012-08-01
    • 2011-12-10
    • 2018-02-10
    • 2014-09-29
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多