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);