博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opd-山寨版vld
阅读量:6517 次
发布时间:2019-06-24

本文共 1385 字,大约阅读时间需要 4 分钟。

  hot3.png

起因

  很久以前(大概1年多了)看到鸟哥的《》,然后在Ubuntu上跟着折腾了起来,最后勉强也是跑起来了。最近找回了这份代码,打算在新笔记本上编译,然后问题就接踵而来。

Mac上编译PHP embed sapi

  按Ubuntu上的套路,直接

$ cd php-src/$ ./configure --enable-embed$ make && make install

  编译出libphp5.so, 但是Mac上不认这一套,后来Google到《》才知道要编译成libphp5.dylib。其实按照文章我打上patch执行make提示没有相关规则,继续Google后《》(别吐槽为什么名字一样,其实不是同一篇)。autoconf以后重新configure

$ cd php-src/$ ./configure --enable-embed$ make libphp5.dylib && make install

  到这里动态链接库就编译好了。

PHP相关struct的改变

  到源码目录执行make的时候杯具又发生了

105937_x2Yb_111529.png

  赶紧翻源码看了一下(我系统PHP是brew安装的5.4.24,相应的我下载了5.4.19的源码,但是鸟哥文章中用的是5.3 alpha2 )

typedef struct _znode { /* used only during compilation */ 	int op_type;	union {		znode_op op;		zval constant; /* replaced by literal/zv */		zend_op_array *op_array;	} u;	zend_uint EA;      /* extended attributes */} znode;

已经不在有var这个成员。后来下载了最新的vld源码,看到对应的处理宏发现5.4以后_znode结构都没在用了

#if PHP_VERSION_ID >= 50399# define OPD_ZNODE znode_op# define OPD_ZNODE_ELEM(node,var) node.var# define OPD_TYPE(t) t##_type# define OPD_EXTENDED_VALUE(o) extended_value#else# define OPD_ZNODE znode# define OPD_ZNODE_ELEM(node,var) node.u.var# define OPD_TYPE(t) t.op_type# define OPD_EXTENDED_VALUE(o) o.u.EA.type#endif

接着对着vld修修改改也终于跑起来了,效果大概这样

function foo($str) {    echo $str;}$str = "hello world\n";foo($str);

111141_0iNg_111529.png

 功能上当然不及vld,比如没有把函数,类的内部opcode dump出来什么的。

这只是个PHP embed模式的一个例子,发挥你的想象力应该还会有很多好玩的东西。

源码地址:https://github.com/solupro/opd

转载于:https://my.oschina.net/s01u/blog/200707

你可能感兴趣的文章
images对象实现图片幻灯片
查看>>
Oracle 12c 日常维护
查看>>
CF 445A DZY Loves Chessboard
查看>>
Cobbler简介
查看>>
恢复 git reset -hard 的误操作
查看>>
菜鸟初始代码旅程——修改记录
查看>>
C# WinForm 文件上传下载
查看>>
【javascript】ajax请求 编码问题导致的ie浏览器在输入中文文字后没有内容,而chrome正常搜到文字...
查看>>
Git分支操作
查看>>
Spring Integration概述
查看>>
[SAP ABAP开发技术总结]权限对象检查
查看>>
RDIFramework.NET ━ 9.6 模块(菜单)管理 ━ Web部分
查看>>
Android安全问题 静音拍照与被拍
查看>>
cocos2d-x 3.1.1 学习笔记[13] listen 监听器
查看>>
定制私人博客
查看>>
WTL介绍
查看>>
应用程序框架实战三十四:数据传输对象(DTO)介绍及各类型实体比较(转)
查看>>
放量滞涨,抛出信号
查看>>
BeanFactory not initialized or already closed - call 'refresh' before accessing beans解决办法
查看>>
dSYM 文件分析工具
查看>>