参考文献:

https://xz.aliyun.com/t/2403

前言

两次比赛,两个题目,两种方式,两个程序。

一切PHP的代码终究是要到Zend Engine上走一走的,因此一切PHP的源码加密都是可以被解密的。(不包括OpCode混淆-VMP)

代码混淆

比较恶心人的一种处理方式,也不太算是加密。

单独拿出来是为了说明代码混淆和代码加密是两种方式。

本质是是对变量进行乱七八糟的修改,多用动态函数处理。处理应该没什么难度,就是比较复杂,浪费时间精力。

混淆方式是按照套路随机生成相关动态函数,替换明文函数,然后批量修改变量名。

该法常与代码加密联合使用。

代码加密解密

用PHP代码进行PHP代码的加密,套了层壳。大多数代码加密都进行了一定的代码混淆,不同的加密工具也有不同的混淆。

  • 壳混淆
  • 代码混淆
  • 壳和代码都分别混淆

常见加密工具

  • phpjiami

加密

源码 -> 加密处理(压缩,替换,BASE64,转义)-> 安全处理(验证文件 MD5 值,限制 IP、限域名、限时间、防破解、防命令行调试)-> 加密程序成品,再简单的说:密文源码 + 自解密外壳 == 密文代码

加密方式

  1. 独立加密程序统一对明文代码进行加密处理

解密

加密也好,混淆也罢,终归是要变成Zend Engine能处理的源码,该“加密”方法的的根本是通过把代码解密并通过eval等函数执行代码。

因此,只要用HOOK EVAL大法,将相关可执行代码的函数Hook住就能拿到其中需要执行的数据,也就是我们想要得到的源码。

调用eval等代码执行的函数,最终会调用PHP内核zend_compile_string函数。

通过PHP本身提供的一个HOOK机制,写个插件轻松搞定。

// 声明一个临时的 compile_string 函数
static zend_op_array *(*orig_compile_string)(zval *source_string, char *filename TSRMLS_DC);
// 在 PHP_MINIT_FUNCTION 中替换
orig_compile_string = zend_compile_string;
zend_compile_string = phpjiami_decode_compile_string;
// 在 PHP_MSHUTDOWN_FUNCTION 中恢复
zend_compile_string = orig_compile_string;
// 提取 compile_string 中的代码并保存
static zend_op_array *phpjiami_decode_compile_string(zval *source_string, char *filename TSRMLS_DC)
{int c, len, yes;char *content;FILE *fp = NULL;char fn[512];if (Z_TYPE_P(source_string) == IS_STRING) {len  = Z_STRLEN_P(source_string);content = estrndup(Z_STRVAL_P(source_string), len);if (len > strlen(content))for (c=0; c<len; c++)if (content[c] == 0)content[c] = '?';sprintf(fn, "/tmp/%s.php", zend_get_executed_filename(TSRMLS_C));fp = fopen(fn,"a+");if (fp!=NULL)fprintf(fp, "<?php\n%s\n?>\n\n", content);fclose(fp);}return orig_compile_string(source_string, filename TSRMLS_CC);
}

案例

Challenge: PWNHUB 公开赛 / 傻 fufu 的工作日 Writeup

扩展加密解密

将文本源码进行加密存储,在使用的时候通过扩展实现解密。

常见加密工具

  • pm9screw
  • pm9screw_plus

加密

源码 -> 加密处理(对称/非对称加密、自定义加密)-> 加密成品:密文代码

加密方式

  1. 独立加密程序统一对明文代码进行加密处理
  2. 扩展存在加密解密功能,执行前判断源码是否经过加密处理,如果没有就进行加密

解密

还是那句话,一切的源码都要到Zend Engine上执行,密文也得解密了再执行。那么在最终的执行之前,提取出来就可以了。

因此Hook住zend_compile_file函数就可以了。

但是其中有一个坑点,PHP的扩展是“栈”加载的,也就是先加载的先Hook,后执行。我们需要获取到解密之后的内容,所以需要让“加密”插件先执行,也就是我们的解密插件要先加载。

要实现这个操作,只需要在INI配置文件中先写我们的插件。(不保证)

extension="decode.so"
extension="encrypt.so"

这个方式需要能够加载执行encrypt.so,我觉得这个还是可以实现的。通过一定手段获取到encrypt.so和密文源码以及服务器,中间件相关信息(版本等)。

利用Docker运行一个基本相同的环境应该是可以做到的。

// 声明一个临时的 compile_file 函数
static zend_op_array *(*orig_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);
// 在 PHP_MINIT_FUNCTION 中替换
orig_compile_file = zend_compile_file;
zend_compile_file = phpjiami_decode_compile_file;
// 在 PHP_MSHUTDOWN_FUNCTION 中恢复
zend_compile_file = orig_compile_file;
// 提取 compile_file 中的代码并保存
static zend_op_array *phpjiami_decode_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC){char *buf;size_t size;if (zend_stream_fixup(file_handle, &buf, &size TSRMLS_CC) == SUCCESS) {FILE *ff = NULL;int i=0;php_printf("code size :\n%d\n\nsource code :\n%s\n\n", size, buf);ff = fopen("/tmp/decode.php","a+");if (ff!=NULL)for(i = 0; i <= size; i++)fprintf(ff, "%c", buf[i]);fclose(ff);}return orig_compile_file(file_handle,type TSRMLS_DC);
}

案例

Challenge: SCTF2018 BabySyc - Simple PHP Web Writeup - L3m0n

  • phpinfo

  • login.php

OpCode混淆

一种是比如Swoole Compile的方式,部分脱离了zend虚拟机,对opcode做了混淆,这就比较像是vmp的一种方式。

加密方式

  1. 独立加密程序统一对明文代码进行加密处理(猜测)

解密

我不会啊!emmmmmmm

参考

  1. phpjiami 数种解密方法 - PHITHON
  2. Decrypt php VoiceStar encryption extension - 小鹿师傅
  3. PHPDecode 在线解密工具 - Medici.Yan
  4. Decoding a User Space Encoded PHP Script - Stefan Esser
  5. PHP代码加密技术 郭新华 PHPCON2018 - swoole郭新华

看我如何玩转PHP代码加密与解密相关推荐

  1. PHP代码加密+扩展解密实战

    代码加密+扩展解密实战 这种方案是通过对代码进行加密,然后利用C语音写解密的PHP扩展.破解难度会有提升,但依然是会被破解的. 从网上找过各种代码加密的开源方案. 一旦开源,就不可能保证安全性.毕竟加 ...

  2. Matlab P代码加密与解密

    需求 好多之前师兄师姐或其他前辈留下的matlab p代码,但是运行到现有研究中出现各种报错,师兄师姐也联系不上了,但是研究还得继续,但又不想重新来写,导师要求又很急,因此想到matlab简单加密的P ...

  3. PHP代码加密_解密

    <?php /* @名称:PHP加密/解密 @更新:2009年9月22日 20:23:47 */ function phpencode($code) {$code = str_replace(a ...

  4. Zend Guard6.0使用教程——PHP代码加密

    为什么80%的码农都做不了架构师?>>>    Zend Guard 6可以用于PHP项目的加密与版权控制,防止自己的PHP成功被人盗窃,加密使用过程非常简单,本文详细的介绍了Zen ...

  5. 实用脚本!利用 Python 对 PDF 进行加密、解密操作,代码拿走就用!

    来源/早起Python 本文将分享如何利用 Python 对 PDF 进行加密和解密操作,主要利用到之前多次介绍过的PyPDF2 模块. PDF 加密 在之前的文章PDF合并.拆分.水印.加密中简单提 ...

  6. PHP 文件加密Zend Guard Loader 学习和使用(如何安装ioncube扩展对PHP代码加密)

    一.大体流程图 二.PHP 项目文件加密 下表列出了Zend产品中的PHP版本及其内部API版本和Zend产品版本. 如何加密请往后看 三.如何使用 第一步:确认当前环境 Amai Phalcon 前 ...

  7. php为什么容易解密,PHP代码的加密和解密

    现在常见的对PHP代码进行加密的方式主要分为两大类: Ø 不需要加载php扩展的: Ø 需要加载php扩展的 第一种方式使用方便,不需要对php服务器进行配置,或加载其他模块,因此可以方便地部署在租用 ...

  8. 看我如何用云函数撸一个PC小程序代码包在线解密工具

    前一段时间突发奇想,想白嫖腾讯云云函数的能力来实现无服务模式下 PC 端小程序包的在线解密(注意这里仅仅是做解密). 因为业余时间以捣鼓有意思的东西作为娱乐活动,对于小程序技术这块本身理解也是比较深刻 ...

  9. C#加壳工具做代码加密保护

    当前C# .net语言的应用范围越来越广泛,IIS 的服务器架构后台代码.桌面应用程序的 winform .Unity3d 的逻辑脚本都在使用.C# .net 具备强大的便捷特性,使得开发成本极低.而 ...

最新文章

  1. 微信小程序之录音与播放功能(完整示例demo)
  2. Windows环境下MySQL的zip包精简方法与安装。
  3. JS实现Trim()
  4. 普通卷积armv7-neon指令集实现—QNNPACK
  5. 图的最短路径(一级)
  6. python实现api接口的脚本_Zabbix批量添加主机,Python调用api接口方式【脚本定制】...
  7. Android 保持屏幕常亮
  8. C语言程序设计题解pdf,C语言程序设计题解与上机指导.pdf
  9. 超好玩的vbs代码 (恶作剧代码)
  10. Excel宏的介绍及应用
  11. vue实现完整的购物车功能(包括单选全选,删除商品和结算商品功能)
  12. c语言看门狗指令pic,PIC单片机之看门狗_看门狗定时器工作原理
  13. 2022-01-06至10交易记录
  14. 倒看北斗星---念霍去病
  15. 针对优衣库商品的图片获取(第一张)以及excel图片链接显示成图片
  16. latex 跳转标签_在 LaTeX 中使用交叉引用
  17. 点燃你温暖我 爱心 源码
  18. Oracle EBS 预警系统管理
  19. 出战卡不足_特种部队TCG的不足之处和改进方案
  20. keil中创建lib库,使用lib库

热门文章

  1. OPPO后端开发面试经历
  2. 空气质量监测系统的组成和应用
  3. IT人的纠结:去大公司还是去小公司?
  4. 计算机英语个人陈述,英文计算机专业个人陈述样本
  5. 3a企业信用等级证书有什么用?
  6. 五分钟学会如何用java解析json字符串!
  7. 深入理解JVM(四)JVM的垃圾回收机制
  8. 访问控制的三种模型(DAC、MAC、RBAC)
  9. N33-Week 3-向日葵
  10. 手术麻醉系统管理源码