From e93e41ce83da1c0034442db163feb1efad0f4fd9 Mon Sep 17 00:00:00 2001 From: "qcqcqc@wsl" <1220204124@zust.edu.cn> Date: Wed, 16 Apr 2025 11:28:18 +0800 Subject: [PATCH] =?UTF-8?q?execve=E5=9C=A8hook=E6=A8=A1=E5=BC=8F=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=A7=BB=E9=99=A4LD=5FPRELOAD=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E5=8F=98=E9=87=8F=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=90=91=E4=B8=8B?= =?UTF-8?q?=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/execve_interceptor.c | 57 ++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/execve_interceptor.c b/src/execve_interceptor.c index 59f88d9..d3f6c20 100644 --- a/src/execve_interceptor.c +++ b/src/execve_interceptor.c @@ -25,7 +25,33 @@ orig_execve_type orig_execve = NULL; * 拦截系统调用execve, * 在真实调用直接检查配置和创建输出 */ -int execve(const char *filename, char *const argv[], char *const envp[]) { +int execve(const char *filename, char *const argv[], char *const old_envp[]) { + // 移除LD_PRELOAD + + // 计算原环境变量数量 + size_t env_count = 0; + while (old_envp && old_envp[env_count]) { + env_count++; + } + + // 分配新的环境变量数组(最多比原来少一个) + char **envp = malloc((env_count) * sizeof(char *)); + if (!envp) { + perror("malloc"); + return -1; + } + + // 拷贝旧的 envp,跳过 LD_PRELOAD + size_t i = 0; + for (size_t j = 0; j < env_count; j++) { + if (strncmp(old_envp[j], "LD_PRELOAD=", 11) != 0) { + envp[i++] = old_envp[j]; + } + } + + // 确保新数组末尾是 NULL + envp[i] = NULL; + #else /** * 在真实系统调用之前可以调用这个函数, @@ -37,6 +63,7 @@ int enhance_execve(const char *filename, char *const argv[], char *const envp[]) { (void)envp; #endif + // 去除首尾空格 while (*filename && isspace(*filename)) { filename++; @@ -196,33 +223,7 @@ int enhance_execve(const char *filename, char *const argv[], #ifdef HOOK - // 移除LD_PRELOAD - - // 计算原环境变量数量 - size_t env_count = 0; - while (envp && envp[env_count]) { - env_count++; - } - - // 分配新的环境变量数组(最多比原来少一个) - char **new_envp = malloc((env_count) * sizeof(char *)); - if (!new_envp) { - perror("malloc"); - return -1; - } - - // 拷贝旧的 envp,跳过 LD_PRELOAD - size_t i = 0; - for (size_t j = 0; j < env_count; j++) { - if (strncmp(envp[j], "LD_PRELOAD=", 11) != 0) { - new_envp[i++] = envp[j]; - } - } - - // 确保新数组末尾是 NULL - new_envp[i] = NULL; - - return orig_execve(filename, argv, new_envp); + return orig_execve(filename, argv, envp); #else DEBUG_LOG("Ready to exec file: %s", filename); return execve(filename, argv, envp);