php screw加密与破解
<h1>一、破解工具之php-screw-brute</h1><h2>1、项目地址</h2>
<p> https://github.com/securifybv/php-screw-brute</p>
<h2>2、项目介绍</h2>
<p> 此脚本可以恢复/爆破php screw使用的密钥。PHP Screw使用压缩文件的长度来确定(硬编码)密钥的起始索引。PHP Screw的工作原理是首先使用ZLIB(级别1)压缩PHP文件,然后按位取反,再与密钥进行异或。 因为ZLIB具有固定的头部并且不同文件的起始索引不同,所以可以恢复密钥的一部分, 其余字节可以爆破。 通常,你拥有的文件越多,恢复密钥的速度就越快。 当然,所有文件都必须使用相同的PHP Screw密钥进行加密。 如果你拥有的文件足够多,则可直接恢复密钥而不需要爆破。</p>
<p> 下图1是php文件经过php screw加密后的一个样子,通过开头的“PM9SCREW”字符串得知使用了php screw进行加密。</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730100214368-1115967310.png"></p>
<p style="text-align: center">图1</p>
<h2>3、使用</h2>
<p style="text-align: left"> 下图2是使用方法,解密成功后,会在相同目录下生成以“.plain”为后缀的同名文件。比如待解密的文件是“index.php”,则解密成功后生成“index.php.plain”文件。</p>
<p style="text-align: left"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730100307652-125697300.png"></p>
<p style="text-align: center">图2</p>
<p style="text-align: left"> 写了一个python脚本,用于筛选解密成功的php文件。</p>
<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;">#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import shutil
def main():
src = '/root/Download/demo'
dst = src + '_backup'
shutil.copytree(src,dst) #备份
for root,dirs,files in os.walk(src):
for name in files:
basename, ext = os.path.splitext(name)
oldname = os.path.join(root,name)
newname = os.path.join(root,basename)
if ext == '.php':
os.remove(oldname) #删除原来的加密的PHP文件
if ext == '.plain':
os.rename(oldname,newname) #重命名解密成功的文件 filename.php.plain => filename.php
print('Good job')
if __name__ == '__main__':
main()
</pre>
</div>
<p> </p>
<h1>二、破解工具之screw_decode</h1>
<h2>1、项目地址</h2>
<p> https://github.com/firebroo/screw_decode</p>
<h2>2、项目介绍</h2>
<p> 前提需要有加密之后的文件,和加密的扩展库php_screw.so 打开screwdecode.c找到PM9SCREW,PM9SCREW_LEN和pm9screw_mycryptkey,3个可能被使用者修改,需要用IDA去查找然后替换掉。 pm9screw_mycryptkey是至关重要的,拿不到就解密不了。别的两个可以暴力尝试解决,其实就是读取掉头部n个字节尝试解密。</p>
<h2>3、安装和使用</h2>
<p>安装:</p>
<p>git clone https://github.com/firebroo/screw_decode.git</p>
<p>make</p>
<p>如果以上出错,就看报错然后google,一个是依赖php-devel,一个是依赖zlibc-devel</p>
<p>使用:</p>
<p>sudo ./decode path</p>
<p>说明: 结果保存在同目录,文件名字为原文件名字后面追加.decode, sudo 权限保证可以有chdir和创建文件权限。</p>
<h1>三、IDA获取加密的key</h1>
<h2>1、通过导图查找</h2>
<p> 首先找到php_screw.so文件,然后通过IDA分析(幸好之前跟基友要了份IDA)。加密过程是在pm9screw_ext_fopen函数中实现的,所以只需要到这个函数中去找加密部分即可。</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730100757674-511011515.png"></p>
<p style="text-align: center">图3</p>
<p style="text-align: left">找到pm9screw_ext_fopen函数,双击,如图4所示:</p>
<p style="text-align: left"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730100747246-1375854165.png"></p>
<p style="text-align: center">图4</p>
<p>然后右边的窗口就会如图5所示:</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730100924500-878586286.png"></p>
<p style="text-align: center">图5</p>
<p>很明显,我标黄的就是加密密钥了,双击跳转至其指针保存处:</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101033305-4093141.png"></p>
<p style="text-align: center">图6</p>
<p style="text-align: left">再次双击,跟踪变量,见下图7,打码处就是密钥了。</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101247330-1495760426.png"></p>
<p style="text-align: center">图7</p>
<p style="text-align: left">如下图8,右键,将十六进制的密钥转成十进制的,然后打开screwdecode.c,见下图9,将密钥替换掉,即可使用screw_decode解密。</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101351465-1264190764.png"></p>
<p style="text-align: center">图8</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101506630-901567167.png"></p>
<p style="text-align: center">图9</p>
<h2>2、通过伪代码查找</h2>
<p style="text-align: left">再找到目标函数之后,使用F5,查看伪代码,双击黄标也可以跳转到之前找到的位置。</p>
<p style="text-align: left"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101556025-757216071.png"></p>
<p style="text-align: center">图10</p>
<h1>四、php-screw加密文件</h1>
<h2>1、项目地址</h2>
<p> https://sourceforge.net/projects/php-screw/ 或者</p>
<p> https://github.com/Luavis/php-screw</p>
<h2>2、使用</h2>
<h3>(1)我是在kali-rolling上测试的,提示没有phpize这个命令。</h3>
<p>apt-get install php-dev</p>
<h3>(2)然后解压</h3>
<p>tar –zxvf php_screw-1.5.tar.gz</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101718745-974988760.png"></p>
<p style="text-align: center">图9</p>
<h3>(3) 编译PHP扩展的工具,主要是根据系统信息生成对应的configure文件</h3>
<p>Phpize</p>
<p>./configure</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101903856-1381801159.png"></p>
<p style="text-align: center">图10</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730101933520-1057572364.png"></p>
<p style="text-align: center">图11</p>
<h3>(4)编辑my_screw.h修改pm9screw_mycryptkey密钥的值</h3>
<p style="text-align: left">如图12是默认值。</p>
<p style="text-align: left"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730102005711-474519091.png"></p>
<p style="text-align: center">图12</p>
<h3>(5)此外我们可以编辑php_screw.h修改PM9SCREW 和 PM9SCREW_LEN的值,注意PM9SCREW_LEN的值要小于等于PM9SCREW的长度。如图13是其默认值。</h3>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730102039935-1790693106.png"></p>
<p style="text-align: center">图13</p>
<h3>(5)进行编译</h3>
<p>如图14编译时出错了,在php_screw的目录下以下命令执行即可解决,最后编译成功。</p>
<p style="text-align: left">sed -i "s/CG(extended_info) = 1;/CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;/g" php_screw.c</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730102112405-1359299942.png"></p>
<p style="text-align: center">图14</p>
<h3>(6)将编译好的php_screw.so拷贝到php扩展库目录。</h3>
<p>通过phpinfo()页面查找extension-dir关键字</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730102200310-1510227356.png"></p>
<p style="text-align: center">图16</p>
<p>将编译好的php_screw.so拷贝到php扩展目录。</p>
<p>cp modules/php_screw.so /usr/lib/php/20151012/php_screw.so</p>
<h3>(7)编辑php.ini添加以下一行代码</h3>
<p>extension=php_screw.so</p>
<h3>(8)重启http服务器</h3>
<p>Service apache2 restart</p>
<h3>(9)编译加密工具</h3>
<p>cd tools</p>
<p>make</p>
<p>编译完成后生成screw可执行文件。</p>
<p><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730102313885-2050705593.png"></p>
<p style="text-align: center">图17</p>
<h3>(10)尝试加密一个php文件</h3>
<p>我们写一个phpinfo.php文件内容是<?php phpinfo();?></p>
<p style="text-align: left">然后执行./screw phpinfo.php加密文件,见下图18。</p>
<p style="text-align: left"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730102352235-406213672.png"></p>
<p style="text-align: center">图18</p>
<h3>(11)将加密好的文件拷贝到web目录</h3>
<p>cp phpinfo.php /var/www/html/phpinfo.php</p>
<p style="text-align: center"><img src="https://img2018.cnblogs.com/blog/1718715/201907/1718715-20190730102420585-276056159.png"></p>
<p style="text-align: center">图19</p>
<h3>(12)批量加密php文件</h3>
<p>find /data/php/source -name “*.php” -print|xargs -n1 screw //加密所有的.php文件</p>
<h1>五、参考:</h1>
<p>php_screw的加密和解密探究(二)解密算法与Python实现:</p>
<p>https://www.skactor.tk/2018/03/26/php-screw%E7%9A%84%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86%E6%8E%A2%E7%A9%B6%EF%BC%88%E4%BA%8C%EF%BC%89%E8%A7%A3%E5%AF%86%E7%AE%97%E6%B3%95%E4%B8%8Epython%E5%AE%9E%E7%8E%B0/</p>
<p>php_screw的加密和解密探究(一)编译Screw扩展并测试:</p>
<p>https://www.skactor.tk/2018/03/25/php_screw%E7%9A%84%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86%E6%8E%A2%E7%A9%B6%EF%BC%88%E4%B8%80%EF%BC%89%E7%BC%96%E8%AF%91Screw%E6%89%A9%E5%B1%95%E5%B9%B6%E6%B5%8B%E8%AF%95/</p>
<p>用 phpize 编译共享 PECL 扩展库:</p>
<p>https://www.php.net/manual/zh/install.pecl.phpize.php</p>
<p> <span style="color: rgba(255, 0, 0, 1)"><strong>转载请注明出处。</strong></span></p>
<p style="text-align: left"> </p><br><br>
来源:https://www.cnblogs.com/StudyCat/p/11268399.html
頁:
[1]