Почему SYS_ENTER_EXECVE ПОЛУЧИТЬ Имя программы через BPF_GET_CURRENT_COMMLinux

Ответить
Anonymous
 Почему SYS_ENTER_EXECVE ПОЛУЧИТЬ Имя программы через BPF_GET_CURRENT_COMM

Сообщение Anonymous »

`Я разрабатываю программирование EBPF. Иногда я не могу получить имя программы, используя execve, но я могу использовать execv и syscall (sys_execve, ...). Конкретный код следующим образом: < /p>

Code EBPF < /li>
< /ol>
static u32 ebpf_getppid(void)
{
struct task_struct *task = (struct task_struct *)bpf_get_current_task();
struct task_struct *parent = (struct task_struct *)BPF_CORE_READ(task, real_parent);

return BPF_CORE_READ(parent, tgid);
}

SEC("tp/syscalls/sys_enter_execve")
int tracepoint__syscalls__sys_enter_execve(struct trace_event_raw_sys_enter *ctx)
{
struct epm_command command = {};
const char *filename = (const char *)BPF_CORE_READ(ctx, args[0]);
const unsigned long *argv_ptr = (const unsigned long *)BPF_CORE_READ(ctx, args[1]);
const unsigned long *envp_ptr = (const unsigned long *)BPF_CORE_READ(ctx, args[2]);
char temp[128] = {0};

for(int i = 0; i < 4; i++){
bpf_printk("args[%d]: 0x%lx\n", i, BPF_CORE_READ(ctx, args));
}

command.process_id = ebpf_getppid();
command.timestamp = bpf_ktime_get_ns();
bpf_get_current_comm(&command.process_name, sizeof(command.process_name));

bpf_probe_read_str(&command.call_prog_name, sizeof(command.call_prog_name), filename);

bpf_printk("Parent Process name: %s\n", command.process_name);
bpf_printk("Call Process name: %s\n", command.call_prog_name);

for(int i = 0; i < 64; i++) {
unsigned long arg_ptr = 0;
__builtin_memset(temp, 0, sizeof(temp));

bpf_probe_read_str(&arg_ptr, sizeof(arg_ptr), &argv_ptr);
if(arg_ptr == 0) {
break;
}
bpf_probe_read_str(temp, sizeof(temp), (void *)arg_ptr);
bpf_printk("argv[%d]: %s\n", i, temp);
}

for(int i = 0; i < 64; i++) {
unsigned long env_ptr = 0;
__builtin_memset(temp, 0, sizeof(temp));

bpf_probe_read_str(&env_ptr, sizeof(env_ptr), &envp_ptr);
if(env_ptr == 0) {
break;
}
bpf_probe_read_str(temp, sizeof(temp), (void *)env_ptr);
bpf_printk("envp[%d]: %s\n", i, temp);
}

bpf_map_update_elem(&epm_execve_map, &command.process_id, &command, BPF_ANY);

return 0;
}
< /code>

Код на уровне пользователя, который не может получить имя программы < /li>
< /ol>
int main() {
char *args[] = {"/usr/bin/ls", "-l", NULL, NULL};
char *envp[] = {NULL};
execve("/usr/bin/ls", args, envp);
return 0;
}
< /code>

Код на уровне пользователя, который может получить имя программы < /li>
< /ol>
int main() {
char *args[] = {"/usr/bin/ls", "-l", NULL, NULL};
char *envp[] = {NULL};
printf("args addr: %p\n", args);
printf("envp addr: %p\n", envp);
execve("/usr/bin/ls", args, envp);
return 0;
}
< /code>
Разница между двумя кодами на уровне приложения состоит в том, что Printf добавляется в печати ARGS и ENVP. Я хотел бы спросить, какая конкретная причина для этого?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... rrent-comm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»