期望效果
比如某个php文件内容如下
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
error_reporting(0);
$strr = "<?php exit();";
$r = preg_replace('|[^a-z0-9A-Z+/]|s', '', $strr);
var_dump($r);
$a1 = base64_decode($r);
file_put_contents('php://filter/convert.base64-decode|convert.iconv.UCS-2LE.UCS-2BE/resource=shell.php',$strr);
$a2 = file_get_contents('shell.php');
var_dump($a1 === $a2);
|
运行脚本的命令为:
对于该脚本来说:
- 我无法得知
file_put_contents()
的内部实现流程
- 我无法得知
php://filter
伪协议的具体实现
这些当然可以通过看源码来获取,但是如果能实现对php
的debug
,那岂不是美哉
笔者环境
- 系统:
WSL2 Ubuntu24.04
- IDE:
VScode(WSL 连接)
- 语言环境:
xp
面板安装的php7.0.33
源码安装环境
编译环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# 更新软件版本信息/可选
sudo apt update
# 安装编译依赖
sudo apt install gcc -y &&
sudo apt install make -y &&
sudo apt install openssl -y &&
sudo apt install curl -y
# 如下是可选依赖,怕报错的话就安装上吧
# xml
sudo apt-get install -y libxml2-dev
# pcre
sudo apt-get install -y libpcre3-dev
# jpeg
sudo apt-get install -y libjpeg62-dev
# freetype
sudo apt-get install -y libfreetype6-dev
# png
sudo apt-get install -y libpng12-dev libpng3 libpnglite-dev
# iconv
sudo apt-get install -y libiconv-hook-dev libiconv-hook1
# mycrypt
sudo apt-get install -y libmcrypt-dev libmcrypt4
# mhash
sudo apt-get install -y libmhash-dev libmhash2
# openssl
sudo apt-get install -y libltdl-dev libssl-dev
# curl
sudo apt-get install -y libcurl4-openssl-dev
# mysql
sudo apt-get install -y libmysqlclient-dev
# imagick
sudo apt-get install -y libmagickcore-dev libmagickwand-dev
# readline
sudo apt-get install -y libedit-dev
# 安装PHP扩展
sudo apt-get install -y autoconf automake m4
# 报错解决
# ubuntu 无法找到 iconv
sudo ln -s /usr/lib/libiconv_hook.so.1.0.0 /usr/lib/libiconv.so
sudo ln -s /usr/lib/libiconv_hook.so.1.0.0 /usr/lib/libiconv.so.1
# 还是没解决的话可以尝试其他方式
|
调试环境
gdb
是调试工具,需要安装
/usr/bin/gdbus
不是gdb
1
|
sudo apt-get install gdb
|
PHP 源码安装
下载PHP源码
去这里找到你需要的版本的源码

找到后,随便一个(Windows推荐zip,Linux推荐 tar.gz,其实都行)解压后放在一个目录下即可
例如笔者解压在了/home/dan/download/php-7.0.33
PHP源码下载命令行版
1
2
3
|
wget https://www.php.net/distributions/php-7.0.33.tar.gz
tar -xvf php-7.0.33.tar.gz
cd php-7.0.33
|
编译可Debug的php
进入解压目录后,执行如下命令
1
2
3
4
5
6
7
8
9
10
11
12
|
# 进入目录
cd /home/dan/download/php-7.0.33
# 预编译
# 目的是生成 Makefile
./configure --disable-all --enable-debug --enable-phar --prefix=/home/dan/download/php-7.0.33/debug-build --with-config-file-path=/home/dan/download/php-7.0.33/debug-build/etc
# 编译
make
# 安装
make install
|
编译完后,编译结果都在/home/dan/download/php-7.0.33/debug-build
文件夹下,/home/dan/download/php-7.0.33/debug-build/bin/php
为可执行文件,/home/dan/download/php-7.0.33/debug-build/etc
为配置文件目录
VScode设置
VScode打开/home/dan/download/php-7.0.33
目录,在/home/dan/download/php-7.0.33/.vscode
文件夹中创建一个launch.json
文件(文件夹不存在就手动创建)文件内容如下
launch.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
{
"version": "0.2.0",
"configurations": [
{
"name": "debuug php source",
"type": "cppdbg",
"request": "launch",
"program": "/home/dan/download/php-7.0.33/debug-build/bin/php",
"args": ["-f","/xp/www/172.24.189.19_8845/test.php"],
"stopAtEntry": true,
"cwd": "/xp/www/172.24.189.19_8845",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath":"/usr/bin/gdb"
}
]
}
// /xp/www/172.24.189.19_8845/test.php php脚本文件的全路径
// "cwd" 配置的是php脚本项目的根路径
// "MIMode"/"miDebuggerPath" 均选择gdb
|
配置完成后,就可以快乐的调试php源码啦
效果

相关知识补充
源码安装

./configure
是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。它有很多选项可以配置
在待安装的源码路径下使用命令./configure –help
输出详细的选项列表
make
是用来编译的,它从Makefile中读取指令,然后编译。
make install
是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
其中,--prefix
选项是./configure
配置安装的路径
如果不配置该选项,安装后可执行文件默认放在/usr/local/bin
,库文件默认放在/usr/local/lib
,配置文件默认放在/usr/local/etc
,其它的资源文件放在/usr/local/share
,比较凌乱。
eg
1
|
./configure --prefix=/usr/local/test
|
可以把所有资源文件放在/usr/local/test
的路径中,不会杂乱
Ref
https://www.cnblogs.com/dre0m1/p/17050929.html
https://blog.csdn.net/weixin_43689342/article/details/114628288
https://blog.csdn.net/hiqiming/article/details/105245227