Передать переменную в системных вызовах в C - PullRequest
2 голосов
/ 10 ноября 2019

Я пытаюсь выполнить специальный системный вызов для моего курса по ОС, следуя приведенным ниже инструкциям по ссылке: https://uwnthesis.wordpress.com/2016/12/26/basics-of-making-a-rootkit-from-syscall-to-hook/

Версия моего ядра - 5.3.9. Это мой код: Мой .c файл (находится в /usr/srclinux-5.3.9):

#include <linux/syscalls.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/string.h>
#include "pname.h"
asmlinkage long sys_process_name(char* process_name){
    /*placeholder to print full string to tty*/
    char name[32];
    strcpy(name, process_name);

    /*tasklist struct to use*/
    struct task_struct *task;

    /*tty struct*/
    struct tty_struct *my_tty;

    /*get current tty*/
    my_tty = get_current_tty();

    /*<sched.h> library method that iterates through list of processes from task_struct defined above*/
    for_each_process(task){
        printk("Task name: %s.\n",task->comm);
        printk("Task ID: %ld.\n",task->pid);
        printk("Task for compare: %s.\n", name);
        printk("\n");
        /*compares the current process name (defined in task->comm) to the passed in name*/
        if(strcmp(task->comm, name) == 0){
        printk("Process Found!\n");
        /*convert to string and put into name[]*/
        sprintf(name, "PID = %ld\n", (long)task_pid_nr(task));
        /*show result to user that called the syscall*/
        (my_tty->driver->ops->write) (my_tty, name, strlen(name)+1);
        }
    }
    return 0;
}

Мой .h файл:

asmlinkage long sys_process_name(char*process_name);

Мой Makefile:

obj-y := pname.o

Я включил этот системный вызов в мои syscalls_64.tbl и syscalls.h.

После успешной компиляции приведенного выше кода я попробовал этот код для проверки syscall testPname.c:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <string.h>
int main(){
char name[32];
puts("Enter process to find");
scanf("%s",name);
strtok(name, "\n");
long int status = syscall(335, name); //syscall number 335 and passing in the string.}
printf("System call returned %ld\n", status);
return 0;
}

Но когда я положил кучу printk в файл pname.c и заметил, что char * имя_процесса никогда не передавалось из моего testPname в системный вызов, поэтому strcmp никогда не достигался. Я пытался найти способ передачи параметра в системный вызов, но не смог его туда найти.

...