1

目的:タスクがシステムコールを実行できる時間を制限したい。したがって、ファイルのtask_structに変数noexec_countを追加します:include / linux / sched.h、like:

int exec_count;/*inserted by KaiwingHo line:861*/

ちなみに、exec_countのデフォルト値は-1です。これは、システムコールに制限がないことを意味します。正の整数を設定すると、タスクがシステムコールを実行できる回数を意味します。0は、システムコールが実行されないことを意味します。タスクによって。

上記から、すべてのタスクのexec_countにデフォルト値-1を設定する必要があります。そして、私はこれをファイル、kernel / fork.cで行います:メソッドcopy_process():

p->pid = pid;
    p->exec_count=-1;/*line:929inserted by KaiwingHo;the value of noexec shows how many times one task can be called
    by method exec();default value is -1;and so on*/
    retval = -EFAULT;

そして、私が知っているように、すべてのシステムコールは最終的にファイルfs / exec.cのメソッドdo_execve()に到達します。したがって、このメソッドに次のように追加します。

/**
 * inserted by KaiwiiHo
 * the usage of the noexec is shown in sched.h line:695
 */
if(!current->exec_count)
goto out_ret;
if(current->exec_count > 0)
current->exec_count--;

そして最後に、次のような独自のシステムコールを追加します。/ ***KaiwiiHoによって挿入されました*タスクのnoexecの値を設定します**/

asmlinkage long sys_noexec(int times)
{
    int ret=current->exec_count;
    if(ret>=-1)
    current->exec_count=times;
    return ret;
}

再コンパイルや再起動など、すべてが正常に実行されます。だから、私は次のようなテストを受けます:

#include <stdio.h>
#include <sys/types.h>
#include <linux/unistd.h>
#include </usr/include/errno.h>

#define __NR_noexec 294

_syscall1(long,noexec,int,times);

int main()
{
    int ret;
    ret=noexec(0);
    printf("exec_count=%d\n",ret);
    int pid;
    pid=fork();
    if(pid>0)
    {
        int val;
        val=noexec(0);
        printf("val:noexec=%d.\n",val);
        int i;
        i=5;

        if(i=fork()>0)
            printf("i can fork()!\n");

    }

    return 0;
}

そして、出力は次のとおりです。

exec_count=-1
exec_count=-1
val:noexec=0.
exec_count=-1
val:noexec=0.
i can fork()!

出力によると、syscall、noexec()は間違いなく有効だと思います。タスクのexec_countは修正されていますが、fork()も呼び出すことができます。したがって、時間を制限できないのではないかと思います。 do_exeve()メソッドに追加したものが有効にならないかどうか。誰でも私に理由を示すことができますか?thx

4

1 に答える 1

2

そして私が知っているように、すべてのシステムコールは最終的に do_execve()ファイル内のメソッドに到達しますfs/exec.c

これは正しくありません。

execve()ここで終了するのはsyscallだけです。

于 2012-02-11T12:54:32.783 に答える