From fe288136f88452144d2642ad1307c43f186790f6 Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 30 Jul 2025 19:18:53 +0800 Subject: [PATCH] . --- dec_interceptor copy.c | 48 ++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/dec_interceptor copy.c b/dec_interceptor copy.c index d2911cd6..58ac225e 100644 --- a/dec_interceptor copy.c +++ b/dec_interceptor copy.c @@ -2,22 +2,29 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "php_dec_interceptor.h" -#include "main/php_streams.h" // ✅ 必须包含,用于 php_stream 结构 +#include "main/php_streams.h" static zend_op_array* (*original_compile_file)(zend_file_handle *file_handle, int type); static zend_op_array* custom_compile_file(zend_file_handle *file_handle, int type) { - fprintf(stderr, "[hook] file_handle->type = %d\n", file_handle->type); + fprintf(stderr, "[hook] zend_compile_file called\n"); if (file_handle && file_handle->filename) { const char *source_path = file_handle->filename; - php_printf("[dec_interceptor] compiling: %s\n", source_path); + fprintf(stderr, "[hook] filename = %s\n", source_path); + fprintf(stderr, "[hook] file_handle->type = %d\n", file_handle->type); + + // ✅ 只处理 install.php + if (!strstr(source_path, "install.php")) { + fprintf(stderr, "[skip] not install.php, skip dump: %s\n", source_path); + return original_compile_file(file_handle, type); + } char *buffer = NULL; size_t size = 0; - // ✅ 情况1:标准文件句柄 if (file_handle->type == ZEND_HANDLE_FP && file_handle->handle.fp) { + fprintf(stderr, "[info] Detected ZEND_HANDLE_FP\n"); FILE *fp = file_handle->handle.fp; fseek(fp, 0, SEEK_END); size = ftell(fp); @@ -25,12 +32,17 @@ static zend_op_array* custom_compile_file(zend_file_handle *file_handle, int typ if (size > 0 && size < 100 * 1024 * 1024) { buffer = emalloc(size + 1); - fread(buffer, 1, size, fp); - buffer[size] = '\0'; + if (fread(buffer, 1, size, fp) != size) { + fprintf(stderr, "[warn] fread failed on %s\n", source_path); + efree(buffer); + buffer = NULL; + } else { + buffer[size] = '\0'; + } } - // ✅ 情况2:stream 句柄(swoole_loader 加密文件解密后走这个分支) } else if (file_handle->type == ZEND_HANDLE_STREAM && file_handle->handle.stream.handle) { + fprintf(stderr, "[info] Detected ZEND_HANDLE_STREAM\n"); php_stream *stream = (php_stream *)file_handle->handle.stream.handle; php_stream_seek(stream, 0, SEEK_END); @@ -40,12 +52,17 @@ static zend_op_array* custom_compile_file(zend_file_handle *file_handle, int typ if (size > 0 && size < 100 * 1024 * 1024) { buffer = emalloc(size + 1); size_t read_bytes = php_stream_read(stream, buffer, size); - buffer[read_bytes] = '\0'; - size = read_bytes; + if (read_bytes <= 0) { + fprintf(stderr, "[warn] php_stream_read failed: %zu bytes\n", read_bytes); + efree(buffer); + buffer = NULL; + } else { + buffer[read_bytes] = '\0'; + size = read_bytes; + } } } - // ✅ 保存为 .dec.php if (buffer && size > 0) { char output_path[PATH_MAX]; snprintf(output_path, sizeof(output_path), "%s.dec.php", source_path); @@ -54,27 +71,32 @@ static zend_op_array* custom_compile_file(zend_file_handle *file_handle, int typ if (out) { fwrite(buffer, 1, size, out); fclose(out); - fprintf(stderr, "[dump] saved to: %s\n", output_path); + fprintf(stderr, "[dump] saved to: %s (%zu bytes)\n", output_path, size); } else { - fprintf(stderr, "[dump] failed to save: %s\n", output_path); + fprintf(stderr, "[error] failed to open output file: %s\n", output_path); } efree(buffer); + } else { + fprintf(stderr, "[skip] buffer is NULL or size = 0\n"); } + } else { + fprintf(stderr, "[warn] file_handle or filename is NULL\n"); } return original_compile_file(file_handle, type); } - PHP_MINIT_FUNCTION(dec_interceptor) { original_compile_file = zend_compile_file; zend_compile_file = custom_compile_file; + fprintf(stderr, "[init] dec_interceptor loaded\n"); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(dec_interceptor) { zend_compile_file = original_compile_file; + fprintf(stderr, "[shutdown] dec_interceptor unloaded\n"); return SUCCESS; }