0x01 解密环境搭建
操作系统:Ubuntu-20.04.1 x86_64 先前往github下载以下两个项目文件:
xcache可以用第一个项目编译好的 地址:https://github.com/Tools2/Zend-Decoder/releases/download/0.1.1/xcache_x86-64.so
下载好这两个项目后,将以上两个项目进行解压:
$ unzip Zend-Decoder-master.zip
$ unzip xcache-master.zip
当解压完这两个项目后,在执行如下命令安装php:(php5.6)
$ sudo add-apt-repository ppa:ondrej/php -y
$ sudo apt-get update -y
$ sudo apt-get install php5.6-dev -y
如果下载Zend-Decoder项目中编译好的xcache.so文件,下面的编译可以不用进行。 当安装好php后,在前往xcache目录进行xcache的编译:
$ cd xcache-master
当终端位于xcache目录时,执行下面命令:
注意:其中xcache.patch文件是Zend-Decoder-master项目中的
$ patch -p1 < ../Zend-Decoder-master/xcache.patch
然后在执行下面命令:
注意:如果上面php5.6-dev没有安装上,这里的phpize是无法执行的。
$ phpize
$ ./configure --enable-xcache-disassembler
$ sudo make
make后如果和上图相似,没有error等信息,即位make完成。 如果xcache编译失败,可以下载Zend-Decoder项目releases下的xcache_x86-64.so 。 当xcache编译或者下载Zend-Decoder项目中编译好的后,下面还需要前往zend官网下载ZendGuardLoader.so 文件,下载方式如下: zend下载:https://www.zend.com/downloads/zend-guard-loader FAMILY选择:LInux PLATFORM选择:Linux 64-bit (这里根据个人ubuntu位数进行选择) VERSION选择:7.0.0(PHP 5.6)
在下载的时候会让你填写邮件等信息,随便填写即可。
下载好后,文件名为zend-loader-php5.6-linux-x86_64_update1.tar.gz 。 然后对其进行解压:
$ tar -zxvf zend-loader-php5.6-linux-x86_64_update1.tar.gz
然后前往其目录:
$ cd zend-loader-php5.6-linux-x86_64/
然后将其中的ZendGuardLoader.so文件复制到php的lib中:
$ sudo cp ZendGuardLoader.so /usr/lib/php/20131226/
然后在将xcache.so 文件也复制到该目录下:
如果是自己编译的xcache,那么这个so文件在xcache-master/modules目录下
$ sudo cp xcache.so /usr/lib/php/20131226/
确保/usr/lib/php/20131226/ 目录下存在xcache.so 和ZendGuardLoader.so 文件,下面在php.ini中编写如下代码:
最好使用vim打开php.ini文件,因为可以使用G跳到文件末尾处。
$ sudo vim /etc/php/5.6/cli/php.ini
// 添加内容如下:
[Zend]
extension=xcache.so
zend_extension = ZendGuardLoader.so
//:wq 保存退出vim编辑器
当这一步配置好后,在终端执行php,查看是否存在报错信息: 如果如上图没有保存信息,说明部署完成。 如果出现如下图信息说明在复制两个so文件的时候没有复制对位置或者复制少了,具体看报错给予的信息:
0x02 文件解密:
然后在前往Zend-Decoder项目目录,然后使用php执行其项目中的index.php 文件进行解密:
// 如这里我对上一级目录的Kernel.php进行解密
$ php index.php ../Kernel.php
Kernel.php 原始数据: 在线网站识别的加密版本。
0x03 批量解密:
这里是我写的一个批量解密的python脚本,这个脚本会将需要解密文件所在目录进行遍历,对加密的php文件进行解密,非加密或非php文件进行复制,并且会将其目录结构也一并复制过去: 脚本在使用的时候,需要在该脚本目录下创建两个目录,一个是source ,另一个是destination ,其中source 目录是放入你需要解密的文件或者目录,destination 目录是解密后文件的存放位置。
import os
import shutil
decode_php_file_path1 = "index.php"
decode_php_file_path2 = "index2.php"
def dirExist(des_file):
file_dir = "".join([i+"/" for i in des_file.split("/")[:-1]])
if not os.path.exists(file_dir):
os.makedirs(file_dir)
def fileFilter(src_file_dir, des_file_dir):
src_file_list = []
for root, dirs, files in os.walk(src_file_dir):
for file in files:
filename = os.path.join(root, file)
if os.path.splitext(file)[1] == '.php':
src_file_list.append(filename)
else:
des_filename = filename.replace(src_file_dir, des_file_dir)
dirExist(des_filename)
shutil.copy(filename, des_filename)
return src_file_list
def decoder(filename):
cmd1 = "php {} {}".format(decode_php_file_path1, filename)
cmd2 = "php {} {}".format(decode_php_file_path2, filename)
print("\033[36m[*] 正在进行解密:{}".format(filename))
save_name = filename.replace("source", "destination")
info = os.popen(cmd1).read()
if "<?php @Zend;" not in info and "file not foud!" not in info:
dirExist(save_name)
with open(save_name, "w") as f:
f.write(info)
else:
info = os.popen(cmd2).read()
if "<?php @Zend;" not in info and "file not foud!" not in info:
dirExist(save_name)
with open(save_name, "w") as f:
f.write(info)
else:
shutil.copy(filename, save_name)
print("\033[35m[-] 解密失败[{}]\033[0m".format(filename))
if __name__ == '__main__':
f_list = fileFilter("source", "destination")
for f in f_list:
decoder(f)
如我有一个www 目录,其中的php文件采用的是zend5.6加密的,其该目录是一个网站目录,那么这时,只需要将这个www 目录复制到source 目录中,然后执行脚本即可: 如其结构如下: 然后运行脚本: 解密完成后,destination 目录结构如下:
|