阅读88 返回首页    go Php编程


Decrypt PHP's eval based encryption with debugger

概述

有很多 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. 具体实现

具体实现的代码如下:

最后更新:2017-10-13 21:17:00

  上一篇:go PHP是最好的语言
  下一篇:go 九张图读懂 PHP、Python、Ruby 三大语言的差异