Featured image of post PHP本体的C语言源码调试

PHP本体的C语言源码调试

想要看 PHP C语言调试的看过来啦

期望效果

比如某个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);

运行脚本的命令为:

1
php test.php

对于该脚本来说:

  1. 我无法得知file_put_contents()的内部实现流程
  2. 我无法得知php://filter伪协议的具体实现

这些当然可以通过看源码来获取,但是如果能实现对phpdebug,那岂不是美哉

笔者环境

  • 系统: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源码

这里找到你需要的版本的源码

image-20241226120625469

找到后,随便一个(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源码啦

效果

2024年12月26日124913

相关知识补充

源码安装

image-20241226122741890

configure

./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

Dan❤Anan
Built with Hugo
主题 StackJimmy 设计