通用加密php文件还原方法

只是技术交流,并没有恶意,请不要滥用此技术。如果有疑问欢迎跟我交流。

前面一篇文章 实战还原PHP加密文件 说到我发现了PHP加密文件方式的不足,所以才有了这篇文章。

背景分析

众所周知 PHP 是一种脚本语言,脚本语言主要是使用解释运行而非编译运行。所以相对于编译型语言(C、C#、C++),它没有直接生成exedll的能力。所以传统型的加密方式加壳它使用不上。

所以PHP的加密方式一般有两种:混淆和加密。

混淆这种严格意义上不算加密,这种代码就像用拼音缩写命名变量的代码,只是你看起来费劲了点。这种不在我们讨论范围。

加密分为两种方式执行:一种是有扩展(Loader)。 另外一种是无扩展。

首先讲讲无扩展的加密方式。这种加密方式非常的无脑,因为他的解密过程是公开的,而且得利用已知的PHP函数。加密之后的代码一般类似下面:

<?php
eval(base64_decode("cGhwaW5mbygpOw=="));

即使看起来非常复杂的:

jm2.jpg

也不过是上面的变式而已。像这种解密形式公开的非常好破解,只要找到 eval 改成 echo 就行

另外一种有扩展方式就比较复杂了。扩展在这里的作用主要是解密跟执行代码,相比无扩展的形式他将解密跟执行的代码隐藏在扩展里,所以破解较为复杂。

这里的扩展一般分为两种类型的:1、提供解密执行函数的。2、直接覆盖 zend_compile_file 实现解析自定义的php文件功能。

第一种最典型的例子就是我上篇文章提到的 zoeeyguard,主要使用了 zend_eval_string 这个函数来执行php代码。

第二种代表的有:Zend Guard 和 松哥的 php-beast

可以说两种破解思路都差不多。可以优先尝试我上一篇文章里面的思路。

当然如果我上一篇没有解决的情况下怎么办呢?

这个时候就需要奉上大杀器了。

你会发现我在前文一直说到两个的函数 zend_compile_file 和 zend_eval_string,有些聪明的phper已经想到了,对!思路还是 只要找到 eval 改成 echo 就行

实战例子

咱们不能光打嘴炮,光说不做。来个例子:

这次咱们拿松哥的 php-beast 来下手。松哥的代码写得非常漂亮,知道 AES DES 解密耗费时间还写了个 Cache 。

1.下载 linux 的 php 源码包(版本最好在5.6跟5.5之间选择一个,7不支持,BTW:7的改动还是挺大的,很多东西都没兼容,Zend Guard 也不支持7。这里我走了弯路。)

2.找到文件 Zendzend_language_scanner.c 中的函数:zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) 大概在500多行的样子,将如下的代码加在前面(代码写得烂,切勿吐槽):

ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
    zend_lex_state original_lex_state;
    zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
    zend_op_array *original_active_op_array = CG(active_op_array);
    zend_op_array *retval=NULL;
    int compiler_result;
    zend_bool compilation_successful=0;
    znode retval_znode;
    zend_bool original_in_compilation = CG(in_compilation);

    /** BEGIN **/
    //加在这里的含义就是每次php编译php源码的时候都把这份源码打印一份
    char *buf;
    size_t size;
    zend_stream_fixup(file_handle, &buf, &size);
    printf("\n#######\nFILE TYPE: %d  FILE NAME: %s CONTENT: %s\n#######\n", (*file_handle).type, (*file_handle).filename, buf);
    /** END **/
  1. 在php文件夹下执行:

//节省点时间
./configure --disable-ipv6 --disable-all
make
make install

4.如果顺利的话PHP已经安装成功了。

5.我们写两个测试文件:
作用是: test.php 执行它去加密 before.php 生成 after.php。

//test.php
<?php
$path = __DIR__ . '/before.php';
$newPath = __DIR__ . '/after.php';
$result = beast_encode_file($path, $newPath, 0, BEAST_ENCRYPT_TYPE_DES);
var_dump($result);
//before.php
<?php
print 'http://wx-app.com.cn/' . PHP_EOL;

7.执行以下 php test.php 接着在执行 php after.php。

下面就看截图吧:

执行加密

after.php 已经看不出源码的样子

执行after.php 成功得到源码

总结

1、没有破不了的密码。我们能做的只是增加破解时间。如果这个破解时间大于一个人的寿命,那么这个加密方式肯定是成功的。
2、对于加密的程序,就像破解者需要了解、猜测编写者的思路一样,编写者也需要去了解破解者的方法、手段。这样才能写出破解难度更高的程序。
3、相比加密我觉得混淆更适合php源代码的“加密”。
4、如果你的php代码想要加密发布出去,最好的方式还是提高收费然后直接源码提供。

广告

如果你觉得好 随便支持一点吧

如果您觉得写的好,随便支持一点吧!

http://wx-app.com.cn 是一个微信小程序的资讯站点。


Q的代码世界
Q的代码世界

吴子棋

562 声望
38 粉丝
0 条评论
推荐阅读
合理的技术栈永远比语言来的重要
知道我的人都知道我是做在线教育,准确的应该说是高中生在线一对一辅导平台。 这个平台最核心的服务应该就是上课服务了,这个上课服务里面包含着什么呢?我来列一下: 白板互动系统(屏幕共享系统) 语音即使通讯...

qpwoeiru964阅读 3.7k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.8k评论 4

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go6阅读 2.9k评论 4

封面图
图片防盗链破解 解决图片防盗链问题 反向代理
当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。

TANKING7阅读 11.8k评论 5

Hyperf 3.0 发布,PHP 新时代
在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。

huangzhhui5阅读 1.5k评论 1

封面图
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 917评论 2

封面图
Ajax实现搜索联想 搜索关键词提醒 无刷新搜索
通过javascript监听搜索框的内容,调用后端即可。(1)javascript监听搜索框的内容(2)把搜索框的关键词传给后端进行搜索(3)搜索到结果,遍历到页面

TANKING1阅读 4.7k

吴子棋

562 声望
38 粉丝
宣传栏