PHP如何扩展和如何在linux底层对php扩展

2024年11月23日 02:02
有1个网友回答
网友(1):

#include
#include
#include
#include
#include
#include

//定义我们自己的connect函数
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t
addrlen){
static int (*connect_linuxc)(int, const struct sockaddr*, socklen_t)=NULL;
unsigned char *ip_char;

//利用 lsym的RTLD_NEXT选项绕过LD_PRELOAD环境变量的connect方法找到c库的函数
if (!connect_linuxc) connect_linuxc=dlsym(RTLD_NEXT,"connect");

ip_char=serv_addr->sa_data;
ip_char+=2;

//192.168.2.3 找到了
if ((*ip_char==192)&&(*(ip_char+1)==168)&&(*(ip_char+2)==2)&&(*(ip_char+3)==3)) {

//简单返回一个权限错误的代码
return EACCES;
}

// 调用真正的connect方法
return connect_linuxc(sockfd,serv_addr,addrlen);

}

编译成so文件

$ gcc -o lp_demo.so -shared lp_demo.c -ldl
测试文件 test.php
file_get_contents("");
?>
使用方法
LD_PRELOAD=lp_demo.so php test.php

这样他将不可能访问的到192.168.2.3这种我们内部的网址。起到一个很好的沙盒作用。
除此之外我们还可以利用fwrite fopen等函数将php对文件系统的读写操作转移到mencache,nosql之类的后端资源当中。
最后,即使我们已经深入了c库的内部,也不意味着我们走到了最底层,在c库下面,还有一堆sys_开头的函数,他们才是内核空间里的真正函数,在此就不在探讨了。