php – ionCube如何在内部工作?

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

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

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

解决方法:

正如您现在所了解的那样,永远不会获得原始代码,并且处理基于字节码.

以下是一些可能有用的高级信息.

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内部知识和兴趣不大,这种方法提供了良好的保护和出色的性能.当兴趣首次出现在中国黑客组织生成的字节码反编译器中,称为“蓝风”时,2006年左右,简单地编译为字节码显然已不再可接受.在不同程度上,诸如ionCube之类的工具在字节码周围添加了更多保护,从而妨碍了成功逆向工程的任务.尽管可以采取措施来限制反编译的有效性,即使字节码被恢复,代码保护的成功仍然基本上取决于隐藏必要的解码密钥的能力,并且这种类型的所有编码工具都存储这样的密钥在编码文件本身.

在为ionCube版本9开发代码保护时,一个挑战是解决存储密钥的限制,并且加密代码而不在任何地方静态存储必要的解密密钥的能力是明显且必要的下一步.这被添加为名为“动态密钥”的功能.

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

披露:我与ionCube有关.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...