遇到个加密的PHP文件,把decode过程写下来


早上有朋友让我帮忙看一个PHP文件,里面都是乱码,改动任何一个字符就会中止运行。

文件只有一行,以下是部分内容:

中间省略一堆字符编码,最后的内容是

2Kx9yHSQyO/D+5+fnPf+v/BSrlfeg=')));return;?>5e813...32位MD5....3f6


一开始使用ZendStudio+Xdebug跟踪了一遍,发现对于这种压缩在一行的代码,调试根本无力啊!断点都无从下起。

搞了半天还是没效果,干脆手工解决吧。

简单的看了一下,只是把变量名用一些比较特殊的字符替代,用编辑器打开,把几个重复出现的关键字替换一下,就能看出大概了。

其中还用到了一个自定义函数,这段函数已经在文件开头提供了,就是“蜖棁ㄔ┄蕷”。

function 蜖棁ㄔ┄蕷($A,$B="")
{
	$A=base64_decode($A);
	if(empty($A)) return "";
	if($B==""){return ~$A;}
	else
	{
		$D=strlen($A);$B=str_pad($B,$D,$B);$str=$A^$B;return $str;
	}
}

经过几次简单的替换可以知道每个字段内保存的是什么内容了


首先从eval函数入手,后面跟着的应该是2个解密函数,函数名保存在数组里。类似

<?php
$arr['B']='base64_decode';
$arr['G']='gzuncompress';
//调用的时候可以这样用
eval($arr['G']($arr['B']('一大堆乱码')))


解出来就能看到修改后就不能运行的关键代码:

	$A=file_get_contents('origin.php');
	@substr($A,-32)==md5(substr(substr($A,0,-32).'另外一个<span style="font-family: Arial, Helvetica, sans-serif;">32位MD5</span>',6))||die();

注释掉后继续执行后面的代码:


又是一个eval,在解密……

由于解密出来的文件有乱码,不能直接用Copy&Paste,必须以二进制写入一个文件,再经过一些替换、解密,再写入一个文件……总共经过5轮解密,最后得到源文件。


最后整理了一下写了个正则搞定这个文件,直接解除这个文件。

<?php
	$B='base64_decode';
	$G='gzuncompress';
	function A($A,$B="")
	{
		$A=base64_decode($A);
		if(empty($A)) return "";
		if($B==""){return ~$A;}
		else
		{
			$D=strlen($A);$B=str_pad($B,$D,$B);$str=$A^$B;return $str;
		}
	}
	$s=file_get_contents('origin.php');
	//第1次匹配
	preg_match('/\]\(\'(.+?)\'\)/',$s,$r1);
	$s=$G($B($r1[1]));
	
	//第2次匹配
	preg_match('/\]\(\'(.+?)\'\)/',$s,$r2);
	$s=A($B($r2[1]));
	
	//第3次匹配
	preg_match('/\]\(\'(.+?)\'\)/',$s,$r3);
	$s=($B($r3[1]));
	
	//第4次匹配
	preg_match('/\]\(\'(e.+?)\'\)/',$s,$r4);
	$s=$G($B($r4[1]));
	
	//第5次匹配
	preg_match('/\]\(\'(e.+?)\'\)/',$s,$r5);
	$s=(A($B($r5[1])));
	file_put_contents('code.php',$s);

	echo 'Done!';


相关代码:http://download.csdn.net/detail/sbdx/8616319

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  一个PHPer的惨痛教训   经过一段时间的学习,相信大家已经能编出一些像模像样的PHP程序了,但因为PHP是明码的脚本语言,如何保护自己的程序就提到了日程上来。记得我有个非常好的朋友曾经向我大倒苦水,原来他加了半个月的夜班,给别人开发了一套PHP程序,结果遇到了奸商,人家收了源代码说是先测试,然后就消失不见了,电话打不通,QQ也永远不在线了。   仔细想来,使用PHP开发的程序,都是源代码,辛辛苦苦出来,任何人都可以拿去随便用随便改,这确实是个头疼的问题。现在大家都在说要保护知识产权,看来得找个方法保护PHP源代码。翻遍PHP手册也没有找到解决方法,不过还好,终于让我在网上找到了一个PHP保护神——Zend Guard。   Zend Guard的作用,就是用编译处理的方式来保护PHP源代码免于被反编译查看、未经授权的定制修改、未经许可的使用和重新发布等。而且,它是PHP的东家Zend公司开发的,是完全为PHP量身定做的保护神。   下面,请大家就和我一起来学习使用Zend Guard,加密保护我们的PHP源代码吧。      实战:加密PHP源代码   首先,我们把PHP保护神请回家,从http://downloads.phpchina.com/zend/guard/5.0.0/ZendGuard-5_0_0.exe(快车代码为:CF0802TSWC01)下载后,运行安装包,一路点击Next(下一步)即可安装好。接下来让我们准备一个简单的PHP程序test.php,用来测试能否被Zend Guard保护起来。test.php的代码如下:      phpinfo();   ?>   打开Zend Guard,从File(文件)菜单点击,新建一个项目,如图1所示。点击Next进入目录和文件添加界面,因为我们只是测试一个文件,所以点Add File将test.php添加进来,再点击Finish(完成)即可生成项目。      这时,Zend Guard会自动打开新建立的项目,在界面的左边列出项目中的文件,右边列出项目的相关信息。现在,我们就可以将源代码编译了。点击右边Links(链接)中的Encode(编译),界面最下面的Console(控制台)窗口显示“The operation has completed successfully.”,意思为编译已经完成。   现在再去加密文件保存的目录中,会看到其中也有一个test.php,它是否和原来的test.php一样呢?用编辑软件打开它,可以看到它不再是原来的内容了,如图2所示。注意:自己一定要保存好原始代码,不然丢失了,连你自己也没有办法查看和修改的。      接下来测试一下加密的代码,从浏览器访问加密后的PHP程序,哎呀,出错了,不能运行,并显示如图3所示的信息。原来,使用Zend Guard加密后的PHP程序,还需要一个搭档—Zend Optimizer,才能正常执行并提升效率。可从http://downloads.phpchina.com/zend/optimizer/3.3.0/ZendOptimizer-3.3.0a-Windows-i386.exe下载安装(快车代码:CF0802TSWC02)。安装过程中,“Choose the php.ini folder”这一步表示设置系统上PHP的配置文件php.ini的位置,“Choose the Web server's root folder”这一步表示设置Web服务器软件所在的位置。安装完成以后,用记事本打开php.ini,在最后我们会看到类似下面的配置信息:      [Zend]   zend_extension_manager.optimizer_ts="E:\Program Files\Zend\ZendOptimizer-3.3.0\lib\Optimizer-3.3.0"   zend_extension_ts="E:\Program Files\Zend\ZendOptimizer-3.3.0\lib\ZendExtensionManager.dll"   这就表示Zend Optimizer已经安装成功了,我们可以重新启动Web服务器软件,让Zend Optimizer生效即可。注意:如果所使用的服务器已经安装过或者包含了Zend Optimizer,就不用再次安装了。   现在再次从浏览器访问加密后的PHP程序试试,果然可以正常运行了,从显示的信息中,我们可以看到Zend Optimizer的信息(见图4)。      知其所以然   解析Zend Guard加密原理      让我们看看如图5所示的流程,就可以对Zend Guard的保护原理一目了然了。通过Zend Guard将PHP源代码编译为加密代码,然后通过加载了Zend Optimizer的PHP执行即可。分发给别人的程序,是加密后的代码,可以执行,但是没有源代码,别人也就无法查看和修改了。因而,我们可以在程序中加入适当的代码,用来检测系统的当前时间,看是否超过了预先设置的期限,如果超过了,就退出程序不让继续执行。如此一来,奸商再也不能白白获得我们的劳动成果了。      Zend Guard的工作原理和Java类似,编译后的PHP程序就像编译好的Java二进制代码,需要JVM的支持才能运行,Zend Optimizer可以看作是PHP的虚拟机。Zend Guard与Zend Optimizer相互配合,就能完成编译加密和执行编译后代码的工作。   在上面展示的图片中,License管理的方面属于更为深层的使用,可以用来生成许可文件,从而通过选择不同的许可模式来限制程序的使用,例如同时使用的用户数、时间限制、网络分段或者特定的服务器等。有兴趣的读者可以查看Zend Guard自身所带的帮助文件,来了解具体的用法。      高手论道   要想练PHP神功,   还得通LAMP经脉   在很多招聘PHP人才的信息中,我们时常会看到要求熟悉LAMP,那么什么是LAMP呢?      LAMP是Linux、Apache、MySQL、PHP(有时也指Perl或者Python)四者合一的简称。Linux是最强大的开源操作系统,Apache是最强大的开源Web服务器软件,MySQL是最流行的开源数据库系统,PHP是最流行的开源Web开发语言。1998年Michael Kunze在电脑杂志C'T撰的文章中首次使用了缩略语LAMP。它所组成的各组件都是开源软件,因此很方便自由地获取,并且性能良好功能强大,导致这些组件的广泛使用,并不断完善发展,与J2EE和.Net商业软件形成三足鼎立之势,受到整个IT界的关注。      既然我们要学好PHP,那么LAMP中的其他三项都是不可或缺的,只有四者结合,才能练就PHP神功!因为PHP与MySQL是完美搭档,我们的程序要想做得好,就必须考虑到数据库的灵活使用。要想让PHP程序发挥最大的作用,这需要靠Apache的有力支持和稳定的运行。而这一切,在Linux操作系统上,才能完美演绎。
PHP的`pack`函数是一个二进制数据打包函数,用于把数据按指定格式转换成二进制字符串。它并不是一个加密函数,不能直接用于加密源码文件。 如果你需要对PHP源码文件进行加密,可以使用一些第三方工具或者自己编加密脚本实现。以下是一个简单的PHP源码加密示例: ```php <?php // 加密函数 function encrypt($data, $key){ $encrypted_data = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $key); return base64_encode($encrypted_data); } // 解密函数 function decrypt($data, $key){ $encrypted_data = base64_decode($data); return openssl_decrypt($encrypted_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $key); } // 加密源码文件 $source_file = 'test.php'; $encrypted_file = 'test_encrypted.php'; $key = 'my_secret_key'; $data = file_get_contents($source_file); $encrypted_data = encrypt($data, $key); file_put_contents($encrypted_file, '<?php /* Encrypted */ ?>' . $encrypted_data); // 解密源码文件 $encrypted_data = substr(file_get_contents($encrypted_file), 19); // 去除 '<?php /* Encrypted */ ?>' $data = decrypt($encrypted_data, $key); file_put_contents($source_file, $data); ``` 这个示例使用了AES-128-CBC加密算法对源码文件进行加密,并使用一个密钥作为加密参数。加密后的数据通过Base64编码后存储到文件中,解密时则需要先解码再使用相同的密钥进行解密。请注意,这种简单的加密方式并不足以保证源码的安全性,仅供学习和参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值