0x00 下载资源

  • PHP源码
  • PHP SDK(phpsdk-vs16-x86.bat)
  • vscode

选择自己需要调式的版本,我这里选择的是7.3.4

源码

php-7.3.4-src.zip

调试包

php-debug-pack-7.3.4-nts-Win32-VC15-x64.zip,主要用在vs里面调试的,可选

php sdk

sdk用于构建php

github仓库有vs14-vs16三个版本的sdk,第二个是低php版本的sdk下载地址

image-20220420114210370

对应选择vc版本查询见下文链接

查看自己电脑的环境

控制面版-》卸载

image-20220420114558731

后面发现这里是需要安装Visual Studio

不然会报错Could not determine 'vc15' directory

调式环境

安装VSCode,这里需要安装c/c++扩展

image-20220420114656401

0x01 源码编译

进入php-sdk-binary-tools,直接运行对应的bat文件

image-20220420152245658

切换到源码所在的目录

使用以下命令更新依赖

1
phpsdk_deps --update --branchmaster

image-20220420152916893

然后运行

1
buildconf.bat

image-20220420153136608

选择开启SAPI cli、开启debug模式、开启phar扩展;由于cli是单线程的,方便接下来的调试

1
configure --disable-all --enable-cli --enable-debug --enable-phar

当然这里需要根据自己的需求来,注意其中的依赖关系,比如libxml依赖iconv

1
configure --disable-all --enable-cli --enable-debug --enable-phar --with-iconv --with-libxml --with-dom

然后运行configure,运行后会显示一些php的配置信息

image-20220420164310491

无误后使用nmake执行build,期间可能会有各种警告

提示complete完成build

image-20220420153351460

之后在php源码目录中的x64/Debug_TS就生成了php.exe

测试

image-20220420153516091

0x02 源码调试

打开php源码所在目录

image-20220420153916542

可以在刚才的php.exe的同目录下创建test.php

然后选择一个c文件

image-20220420154014685

然后会生成调试的配置文件.vscode/launch.json,修改它

image-20220420154118144

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "php-7.3 source code debugger",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/x64/Debug_TS/php.exe",
"args": ["test.php"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/x64/Debug_TS/",
"environment": [],
"console": "externalTerminal"
}
]
}

然后打开sapi\cli\php_cli.c,在程序入口main函数打断点

image-20220420154350400

image-20220420154737945

0x03 end