2019独角兽企业重金招聘Python工程师标准>>>

网上找了一圈,各种名字的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。

[php] view plaincopy

  1. system("d:/dezend/php.exe $file /i /f /tab /stack:160 /string:40960 /level:10-1 /config:d:\\dezend\\config.ini");

/i /f  2个参数一起用,才会读入 config.ini。 说明文档里没有,我是用 文件监视器,监视php.exe运行时,配上不同参数,最后发现加上这 2个参数时, php.exe才读取了 config.ini。

----------------

关于怎么得到更多 config.ini 里字串的一个想法:

1、把 反编译后文件里 _obfuscate_ 这样的字串提取出来

2、把 混淆算法弄成 exe文件,输入一个 字符串文件,每行一个字符,然后程序把混淆后的值跟 我们要求解的进行对比,才有穷举的办法。

3、这样似乎没什么必要,有那么个力气,自己去改个变量名就足够了。

----------------

作者还说:

据我所知,Zend提供的混淆函数(zend_obfuscate_class_name)有Bug,不是严格的一一对应,也就是说不同的函数名混淆后的名字可能是相同的,我就发现一个。这个文件可能就是这个问题,php说有函数重定义,编译阶段就停止了,反编译就进行不了了。

要是人为了制造这样的情况,那么处理后的文件,目前流出来的这个php.exe 就不能被反编译了。  黑刀 提供php的防反编译服务,说是把源码给他,经他处理后,就可以防止被反编译了,不知道是不是利用的这个原理。

[html] view plaincopy

  1. php index.php /i /f /tab /stack:160 /string:40960 /level:10-1

反编译的时候,遇到这种异常,不知道是不是这个原因呢。

[php] view plaincopy

  1. header( "content-type:text/html;charset=UTF-8" );

  2. session_start( );

  3. set_time_limit( 0 );

  4. error_reporting( E_ALL ^ E_NOTICE );

  5. [exception occured]

  6. ================================

  7. Exception code[ C0000005 ]

  8. Compiler[ 009A2DA0 ]

  9. Executor[ 009A2820 ]

  10. OpArray[ 00AABEB8 ]

  11. File< E:\index.php >

  12. Class< main >

  13. Function< main >

  14. Stack[ 00145AD0 ]

  15. Step[ 7 ]

  16. Offset[ 17 ]

  17. LastOffset[ 284 ]

  18. 17  ADD                          [-]   0[0] $Tmp_4 - $Tmp_1 - $Tmp_6

如果加上 /r 参数,可以看到 raw op code ,就是纯执行流程,虽然不能还原源码,但是可以看到一些算法。

转载于:https://my.oschina.net/mickelfeng/blog/301580

zend反编译-dezender 使用相关推荐

  1. 反编译软件dnSpy中修改baml文件

    问题: 使用wpf的visifiref插件,但是会有水印和文本显示,想修改界面去掉文本 you are using the trial version 步骤1: 用反编译软件打开dl文件 步骤2: 搜 ...

  2. Window7 安装开源swf反编译软件JPEXS Free Flash Decompiler(FFdec)实录

    FFdec是一个免费开源的swf反编译软件,在Windows,Linux,Mac上都能用,比那个硕思闪客精灵厚道多了,功能也不比它差,我以后就用FFdec了. 官网地址如下: http://www.f ...

  3. Android如何防止apk程序被反编译

    作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来.Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sd ...

  4. apktoolkit apk反编译没有文件_重新编译mono——修改apk中Assembly-CSharp.dll并重新打包...

    环境: 操作系统:Mac OSX10.12.6 mono版本:unity2017.1.3p4 NDK版本:android-ndk-r10e 一.指导步骤: 1.通过apktool工具反编译apk 2. ...

  5. android 反编译_Box 黑科技——支持手机端反编译

    项目地址: https://github.com/lulululbj/Box 文末扫码获取最新安装包 . 前言 有将近一个月没有更新文章了,一方面在啃 AOSP ,消化起来确实比较慢.在阅读的过程中, ...

  6. Android APK反编译详解(附图)

    这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程. 在此郑重声明,贴出来的目的不是为了去破解人家的软件, ...

  7. 反编译工具jad简单用法

    反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...

  8. 反编译使用yield关键字的方法

    我认为这是一个真命题:"没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员"..NET Reflector强大的地方就在于可以把IL代码反编译成可 ...

  9. 使用reflector对.NET反编译

    reflector的下载地址:https://www.cr173.com/soft/355285.html 反编译后的结果: 转载于:https://www.cnblogs.com/ZaraNet/p ...

最新文章

  1. U^2-Net跨界肖像画,完美复刻人物细节,GitHub标星2.5K+
  2. 电磁场第二章公式总结
  3. 模拟计算机网络中的零比特填充
  4. linux内核链表使用例,Linux设备驱动工程师之路——内核链表的使用
  5. 6.Boost之smartpointer
  6. Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)
  7. 数据库连接池的作用及c3p0的详解(转载他人的--合理掌握学习方式)
  8. java 读取excel wps_安装WPS引发的excel上传问题
  9. struts2配置中因为包名问题遇到的No result defined for action错误
  10. 深入解析ORACLE字符集
  11. html word 打开,HTML以Word或Excel打开
  12. 决策树-Cart算法二
  13. 关于JFreeChart中BarChart柱体宽度设置的问题纪要
  14. 实战Detectron2— 训练人体关键点检测
  15. 计算机网络13--网络应用的体系结构
  16. 无法加入域--隶属于域、工作组选项为灰色
  17. react native 高德定位 react-native-amap-geolocation
  18. 联想服务器bios查看网卡信息,如何通过BIOS检查确认硬盘信息可被正常识别
  19. 蓝桥杯--输出既是回文又是质数的数
  20. 反向数学归纳法的提出与周氏猜测的证明

热门文章

  1. 解决PLSQL Developer 插入中文 乱码问题
  2. tcc-transation源码分析与思考
  3. 行业报告:医疗数据泄露愈发严重,谁之过错?
  4. shell date cal
  5. Java语言的基础知识6
  6. ubuntu保护眼睛的设置
  7. C++ 编码规范建议
  8. C++ IO 格式控制
  9. 【java】Java泛型
  10. poj 1324 Holedox Moving