谁家好人还要写个PHP扩展来解混淆啊!
来日方长,后会有期。
没想到吧,我与PHP混淆法XEND的爱恨纠葛,还在延续。在上集XEND解密(一)里,我用动态调试法解开了XEND最外层的混淆。一般的PHP混淆法,解完第一层混淆后,底下的明文就显露出来了,但XEND第一层混淆解开后,还有轻度的混淆,没有隐藏各种调用入口和函数名的弯弯绕绕了,可就是恶心:str_rot13、eval(base64_decode())和strrev乱飞的一个大几百行PHP文件。
第二层的混淆不复杂,混淆的手段就这三种,但动态调试或者手工还原会非常繁琐。但我当时懒(bushi),没有继续解第二层的混淆。结果,前段时间我收到了网友的交流邮件,这才下定决心解开第二层的混淆。
不求甚解才是进步的最大敌人。
一、HOOK EVAL 大法好!
在第二层的混淆上,既然动态调试和手工解密变得事倍功半了,那么有没有相对高效的第三种方法?讲到这里,我们不得不细细回想PHP的混淆法都有哪些比较泛化的特点。除了各种基于古典密码的字符串移位变形函数,如str_rot13,异或、ord之流,最为人熟悉的应该是可以执行任意代码的高危表达式eval,因为绝大部分的webshell都会把混淆后的代码交给eval执行。
那么,不管是变形到多么面糊模糊的代码,交给eval执行,eval也得把它还原成明文才能执行,这样一想,找个办法把eval的参数打印出来,不就好了吗?
在PHP中,eval这些语言结构,在ZEND里最终会调用zend_compile_string,而如果你到PHP源码里查找这个函数,会在zend.c里找到这句:
  1. zend_compile_string = compile_string;
复制代码
并在zend_compile.h里找到如下声明:
  1. extern ZEND_API zend_op_array *(*zend_compile_string)(zend_string *source_string, const char *filename, zend_compile_position position);
复制代码
不难看出,zend_compile_string就是函数compile_string的函数指针。这个指针是PHP安全研究员、PHP核心开发者Stefan Esser于2006年率先提出的,以便在调用compile_string时执行某些操作,也是这位大佬,在2010年率先提出了通过编写扩展的方式,在zend_compile_string上挂钩子,打印它的参数source_string来获取还原好的明文,还贴心地提供了对应的PHP扩展
二、半吊子PHP扩展开发:更适合PHP8宝宝体质的evalhook
PHP的底层是C,我之前从来没有写过C,也没有接触过PHP内核和ZEND ENGINE,于是抱着学习的心态,开始了跌跌撞撞的PHP内核学习之旅。因为有其他编程语言的底子,看懂C代码并不难;想要参与PHP扩展开发,对新手来说,一开始的难点主要在于理解PHP扩展结构,特别是用于管理PHP扩展生命周期的几个宏,比如:PHP_MINIT,PHP_RINIT,PHP_MSHUTDOWN,和PHP_RSHUDOWN。
我在网上搜了一圈这个扩展,编译好的版本都是5.6的,扩展的源码也是基于PHP5.6。我寻思这PHP版本都进入8时代了,不如就把它按照PHP8的规范改写,顺便也让自己过一遍PHP扩展开发。说干就干!
  1. PHP版本:8.2.22
  2. 操作系统:Linux
复制代码
首先是搭建PHP扩展开发环境,那就得编译安装PHP,并安装apache2,配置apache和PHP通信,以及PHP、PHP-FPM等服务的环境变量。这个网上可以找到教程,就不赘述(踩了蛮多坑的,但如果有人有需要,日后可以写一篇配环境的文章)。
原先的插件源码,也就是evalhook.c,要改动的地方不多,PHP_MINIT_FUNCTION和PHP_MSHUTDOWN_FUNCTION中的控制流程无需变动。这里我不得不说佬就是佬,斯特凡大佬很聪明地定义了一个布尔值evalhook_hooked用于流程控制,使得代码结构很简洁。
主要的改动在zend_compile_string这个指针指向的函数compile_string上。PHP8.2及其之后的8.3版本中,compile_string的参数由2个变为3个,多了一个参数position。同时,斯特凡大佬的插件原先有一个控制台交互功能,读取用户控制台输入Y/N来决定是否执行eval或终止进程,同时他打印输出也是打印在控制台。不过我们的目的是解webshell混淆,而很多webshell呢,内置了检查USER AGENT之类的反调试手段,因此这个打印输出的方式也要改一下,方便我们在WEB环境里查看(这里可以用curl和php内置server在命令行模拟web环境,避开webshell的UA检测,但这又是另一个故事了)。
更改的代码如下:
  1. static zend_op_array *(*orig_compile_string)(zend_string *source_string, const char *filename, zend_compile_position position);
  2. static zend_bool evalhook_hooked = 0;

  3. static zend_op_array *evalhook_compile_string(zend_string *source_string, const char *filename, zend_compile_position position)
  4. {
  5.     int c, len;
  6.     char *copy;
  7.         
  8.     /* Ignore non string eval() */
  9.     if (ZSTR_LEN(source_string) == 0) {
  10.         return orig_compile_string(source_string, filename, position);
  11.     }
  12.         
  13.     len = ZSTR_LEN(source_string);
  14.     copy = estrndup(ZSTR_VAL(source_string), len);
  15.     if (len > strlen(copy)) {
  16.         for (c=0; c<len; c++) if (copy[c] == 0) copy[c] == '?';
  17.     }
  18.         
  19.     php_printf("\n--------- start decoding ------------\n");
  20.     php_printf("%s\n", copy);
  21.     php_printf("--------- end decoding ------------\n");
  22.         
  23.     return orig_compile_string(source_string, filename, position);
  24. }
复制代码
在web环境下打开ote.php,点击view source,即可看到解密效果,第二层的混淆也被解开了:

查看页面源码已经能看到解密后的明文代码

原先第二层依然做了rot13等轻度混淆
参考资料:
逢魔安全实验室(20年之后甚少看到更新)的:解密混淆的PHP程序
腾讯应急响应中心的:浅谈变形PHP WEBSHELL检测



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明:
1、本站提供的资源不拥有任何权利,其版权归原著拥有。
2、保证站内提供的所有可下载资源(软件等等)都是按“原样”提供,本站未做过任何大规则的修改;本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。
3、时光源码平台服务中的任何信息或材料的删除、存储失败、错误提供或未及时提供不承担任何责任。
4、时光源码平台其许可方不对通过时光源码网主题服务得到的或在其上刊登广告所推介的产品或服务、通过由时光源码平台服务提供的任何链接而得到的产品或服务,以及通过在时光源码网平台服务中所提供的任何链接而得到的任何信息或建议做任何担保,对因通过服务下载或访问网上的任何信息或材料而导致的任何伤害不承担任何责任。
5、时光源码平台服务包含的下载资源信息内的所有内容并不反映亦不代表任何时光源码平台之意见。
6、时光源码平台服务包含的下载资源信息内的所有内容并不反映亦不代表任何时光源码平台之意见。时光源码平台作为模板共享网络服务提供者,对非法转载,盗版行为的发生不具备充分的监控能力,但是当版权拥有者提出侵权指控并出示充分的版权证明材料时,时光源码网平台负有移除盗版和非法转载作品以及停止继续传播的义务。
7、时光源码平台对他人在网站上实施的此类侵权行为不承担法律责任,侵权的法律责任概由会员本人承担,向时光源码发布作品的作者视为同意时光源码就前款情况采取的相应措施。
8、时光源码平台在满足前款条件下采取移除等相应措施后不为此向原发布人承担违约责任或其他法律责任,包括不承担因侵权指控不成立而给原发布人带来损害的赔偿责任。
9、本网站所有源码、模板、视频、软件和资料均为软件作者提供和站长从互联网收集整理而来,仅供学习和研究使用,请勿用于其他用途。如果版权拥有者发现自己作品被侵权,请及时向时光源码提出权利通知,将身份证明、权属证明、具体链接(URL)及详细侵权情况证明发往(邮箱:70050550@qq.com)指出,时光源码平台在收到上述法律文件后,在7个工作日内移除相关涉嫌侵权的内容。
梦想这东西和经典一样,永远不会因为时间而褪色,反而更显珍贵。
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系作者