主要是對上一篇文章中php_again
這道題的補充。
cd /usr/local
wget https://www.php.net/distributions/php-8.2.2.tar.gz
tar -zxvf php-8.2.2.tar.gz && cd php-8.2.2
注意帶enable-debug
apt-get install build-essential autoconf automake libtool libsqlite3-dev pkg-config libjpeg-dev libpng-dev libxml2-dev libbz2-dev libcurl4-gnutls-dev libssl-dev libffi-dev libwebp-dev libonig-dev libzip-dev
./configure --prefix=/usr/local/php --sysconfdir=/etc/php/8.2 --with-openssl --with-zlib --with-bz2 --with-curl --enable-bcmath --enable-gd --with-webp --with-jpeg --with-mhash --enable-mbstring --with-imap-ssl --with-mysqli --enable-exif --with-ffi --with-zip --enable-sockets --with-pcre-jit --enable-fpm --with-pdo-mysql --enable-pcntl --enable-debug
make && make install
cd /usr/bin
ln -s /usr/local/php/bin/php php8.2
cp /usr/local/php-8.2.2/php.ini-development /usr/local/php/lib/php.ini
cp /etc/php/8.2/php-fpm.conf.default /etc/php/8.2/php-fpm.conf
cp /etc/php/8.2/php-fpm.d/www.conf.default /etc/php/8.2/php-fpm.d/www.conf
apt-get update
apt install gdb
偵錯php中 生成 system_id的兩個函數(zend_startup_system_id,zend_finalize_system_id),分別在 mian.c檔案的第2237行
和第2288
行
cd /usr/local/php/bin
#即php可執行檔案目錄
先在這兩處打斷點
接下來執行 run 一個php檔案。
step 單步進入該函數。
n下一步
print var 列印變數
該函數執行完後,context
的值是。(因為enable-debug了,所以NTS後還有一個debug,正常情況下是沒有的)
跳出該函數後,輸入 c
進入下一個斷點。
同樣 step單步跳入。可以看到第二個 if語句是進去了,hooks的值為 "\x02"
接下來是個 for迴圈,一個都沒進去,所以 context
的值沒有更新。最後 context
的值是。
把 debug去掉放 python跑一下。
這下跑的結果是正確的。
zend_compile_file
和 compile_file
是不一樣的。讓我們看看發生了什麼。
watch zend_compile_file
編譯時開啟 dtrace
並且,環境變數中有 USE_ZEND_DTRACE
時才會進入這個if 。 所以這個時候 zend_compile_file
是等於 compile_file
的。
在phar.c中還會改變一次。之後就會呼叫 zend_finalize_system_id
.
額,原始碼看不懂,就跟著看了下變數資訊,主要簡單瞭解下如何使用gdb偵錯。