ionCube如何在内部工作?

时间:2016-10-03 05:46:35

标签: php encryption ioncube

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

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

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

1 个答案:

答案 0 :(得分:10)

正如您现在所知,原始代码永远不会获得,处理基于字节码。

这里有一些可能有用的高级别信息。

PHP扩展程序

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

<强>钩

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

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

编码文件

就文件本身而言,这种类型的早期PHP编码工具实质上编译为字节码并将此表单直接序列化为文件。一般来说,开发人员对PHP内部知识和兴趣不大,这种方法提供了良好的保护和出色的性能。当兴趣首次出现在中国黑客组织生成字节码反编译器时,称为“蓝风”#34;在2006年左右,简单地编译为字节码显然已不再可接受。在不同程度上,诸如ionCube之类的工具在字节码周围添加了更多保护,从而妨碍了成功逆向工程的任务。尽管可以采取措施来限制反编译的有效性,即使字节码 被恢复,代码保护的成功仍然主要取决于隐藏必要的解码密钥的能力,以及所有编码工具这种类型的密钥存储在编码文件本身中。

在为ionCube版本9开发代码保护时,一个挑战是解决存储密钥的限制,以及加密代码的能力,无需静态存储所需的解密密钥是明显和必要的下一步。这被添加为名为&#34; Dynamic Keys&#34;的功能。

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

披露:我与ionCube有关。