网上找了一圈,各种名字的zend反编译软件,核心就是 40,960 字节 的 php.exe。
当时我是从 mmscn.org 上下载到的。论坛上说,php.exe 原创就是 mmscn.org,后来被俄国人偷去了,改名换姓,说是俄国人首发的。作者说的:
原理其实比较简单,网上也有很多介绍。主要是在php源代码的基础上,在zend_execute_scripts函数中,zend_compile_file与zend_execute之间插入我们的函数,然后把EG(active_op_array)解密并且反编译成源代码。当然,这项工作是比较繁杂的。因为zend optimizer对这个指令数组处理过(主要是优化和加密),并且我们只能通过php源代码和测试案例推测它的处理规律。
php.exe 读入zend 过的 php 文件,经过处理,还原出了源码,但是如果 文件 在zend加密的时候选择了变量、函数、类名 混淆,那么php.exe得到的就是混淆后的名字,一般都是乱码(含有回车、换行等字符),php.exe 为了让还原后的代码可视化,统一把那些混淆的名字进行了base64_encode 处理,处理后的名字有三个字符:= + / 不符合php变量名规范,于是把 = 替换成 \xFF ,把 / 替换成 \x7F ,把 + 替换成 _ 。 大家用winhex 打开 dezend后的文件,就会看到这3个字符。
----------------
config.ini 的原理:
Zend Engine v2.3.0 之前 函数、类、变量的混淆函数算法 是固定的。所以在 config.ini 里放入一些 php的内部函数等字符串, php.exe 执行的时候,从 config.ini 读取这些字符串,然后按照混淆算法处理,得到了其对应的混淆后的值; php.exe 在反编译理的时候,得到了一个混淆的名字,就可以对应找出其 明文。 这跟其他的字典破解密码的方法一样。
上面是我猜测的,当时在论坛没有看到这方面的说法。 为了验证这点,我把 header 从config.ini 里删掉,然后反编译,文件里对应 header 的位置变成了 _obfuscate_d1x0cApj ,再加回去,再反编译一次,对应位置又变成了 header 。经过测试, config.ini 里的字串大小些没有影响,字串Header,反编译后文件里对应位置是 Header ;字串是 header,dezend文件里对应位置就是 header。
所以收集到的 config.ini 里的字符串越多, 反编译出来的 源码里的 _obfuscate_ 名字就会越少。
----------------
Mr.Dezend 那个 GUI 在解单个文件时,挺好的,但是如果文件夹里文件数较多时,他就不能列出文件来,待解文件里就一片空白。 用 php 写个程序,遍历全部文件,然后调用php.exe命令行来dezend。
- system("d:/dezend/php.exe $file /i /f /tab /stack:160 /string:40960 /level:10-1 /config:d:\\dezend\\config.ini");
----------------
关于怎么得到更多 config.ini 里字串的一个想法:
1、把 反编译后文件里 _obfuscate_ 这样的字串提取出来
2、把 混淆算法弄成 exe文件,输入一个 字符串文件,每行一个字符,然后程序把混淆后的值跟 我们要求解的进行对比,才有穷举的办法。
3、这样似乎没什么必要,有那么个力气,自己去改个变量名就足够了。
----------------
作者还说:
据我所知,Zend提供的混淆函数(zend_obfuscate_class_name)有Bug,不是严格的一一对应,也就是说不同的函数名混淆后的名字可能是相同的,我就发现一个。这个文件可能就是这个问题,php说有函数重定义,编译阶段就停止了,反编译就进行不了了。
要是人为了制造这样的情况,那么处理后的文件,目前流出来的这个php.exe 就不能被反编译了。 黑刀 提供php的防反编译服务,说是把源码给他,经他处理后,就可以防止被反编译了,不知道是不是利用的这个原理。
- header( "content-type:text/html;charset=UTF-8" );
- session_start( );
- set_time_limit( 0 );
- error_reporting( E_ALL ^ E_NOTICE );
-
- [exception occured]
-
- ================================
- Exception code[ C0000005 ]
- Compiler[ 009A2DA0 ]
- Executor[ 009A2820 ]
- OpArray[ 00AABEB8 ]
- File< E:\index.php >
- Class< main >
- Function< main >
- Stack[ 00145AD0 ]
- Step[ 7 ]
- Offset[ 17 ]
- LastOffset[ 284 ]
- 17 ADD [-] 0[0] $Tmp_4 - $Tmp_1 - $Tmp_6