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 镜像,点击『阅读原文』下载。
最终效果:
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论