微信号:phpgod

介绍:本公众号对PHP开发技术进行全面透析,所含内容适合各个阶段的PHP developer阅读和收藏,既然关注了就一定会有收获.

PHP安全|Decrypt PHP's eval based encry

2017-10-13 20:30 PHP技术大全

  1. 概述

有很多 PHP 脚本的加密是通过把代码进行字符串混淆后放入到 eval 中执行实现的,如 phpjiami、weevely 等。

无论什么语言,对于此种加密的一个通用解法就是 hook 执行函数 ,以 PHP 为例,eval 最终调用的是底层的 zend_compile_string ,只需要提取出调用它时传递的参数就可以实现解密。

hook 的可以通过很多方式实现,比如编写语言扩展、动态调试等。这里所介绍的就是通过动态调试的方法提取函数参数。

2. 原理

Zend 虚拟机启动时,会将 compile_string 赋值给 zend_compile_string :

为了方便可直接将断点下到 compile_string 函数上,跟进它看下函数定义:

参数 source_string 即为动态执行的代码,类型为 zval , zval 定义如下:

所以在调试器中可以通过 ((*(zval *)source_string).value.str).val 打印出代码。

龚老板文章中还有提到 phpjiami 在解密的过程中还会校验 sapi_name :

在调试器环境下这些防护很容易搞定,直接对其赋值就好:

3. 具体实现

具体实现的代码如下:

封了个 Docker 镜像,点击『阅读原文』下载。

最终效果:


 
PHP技术大全 更多文章 Nginx 架构初探 php的垃圾回收机制——引用计数 开源推荐|colly--go语言编写的CPU单核超过1k次请求的web采集利器 MultiHttp:高性能的 PHP 封装的 HTTP Restful 多线程 开源项目|TiddlyWiki 打造轻便个人 Wiki 知识库
猜您喜欢 解析微服务架构(一)单块架构系统以及其面临的挑战 今天企鹅18岁,谢谢你一路相伴 医疗云灾备,灾备了什么? 阿里首次公开麒麟培育计划,将人类历史推进100年! 杭州第一次Spark Meetup月底举行