5

これが私のカーネルモジュールの関数で、後の段階でinsmodコマンドを使用して挿入します。make私は取り組んでいます goldfish (2.6.29)

asmlinkage long our_sys_read(unsigned int fd, char  *buf, size_t count)
{
      printk("------->> our_sys_read getuid() ---------- %d\n", getuid());

      return original_call_read(fd,buf,count);
}

システムコールをトラップして、どのユーザーがこれらのシステムコールを行ったかを調べたい。しかし、「make」を実行すると、次のエラーがスローされます。

/home/mohsin/LKM/trapcall.c:245: error: implicit declaration of function 'getuid'

任意の提案をいただければ幸いです。

4

4 に答える 4

6

あなたはおそらくこれを使うことができます:

 #include <include/linux/cred.h>

 static int getuid()
 {
     return current_uid();
 }

credは「credentials」を表し、このマクロは現在アクティブな資格情報のユーザーIDを返します。ただし、「現在のユーザーID」は、Linuxでは複数の意味を持つ可能性があることに注意してください。

[dan3は明らかに、これを見つけるために私が行ったほど多くのコードを掘り下げる必要はありませんでした-または彼は私の前から始めました!]

于 2012-12-31T14:44:24.743 に答える
6

2日間を費やした後、私はついにシステムコールを行ったプロセスのuidを取得する方法を理解しました。私の解決策が機能しない場合、他のいずれかが機能するように、さまざまなリンクで見つけたすべての提案を提供します。

1)マットに言われたように、

#include <include/linux/cred.h>

 static int getuid()
 {
     return current_uid();
 }

この関数を呼び出してuidを取得しますが、-943124788などのような負の数が得られました。

2)

uid_t credd_uid ;
const struct cred *cred = current_cred();
credd_uid = current->cred->uid; 

大きな負の数のような同じ出力。

3)

uid_t struct_uid;
struct user_struct *u = current_user();

struct_uid = get_uid(u);

4)実用的なソリューション

それは実際にここに与えられています。

i)関数プロトタイプを次のように上部に宣言します

asmlinkage int (*getuid_call)();

ii)init_module()関数に次の行を追加します

/*getuidのシステムコールを取得します*/

  getuid_call = sys_call_table[__NR_getuid];

iii)トラップされたシステムコール関数で関数を呼び出して、次のようなuidを取得します

uid_t uid = getuid_call();
于 2013-01-03T07:47:20.637 に答える
5

linux / cred.hで定義されているcurrent_uid()を呼び出す必要があります(2.6以降、以前はcurrent-> uidでした)。クレデンシャルについてはカーネルドキュメントを参照してください

電流はマクロです、ところで。

于 2012-12-31T14:34:17.580 に答える
1

getuidsyscallフックを使用せずにUIDを取得する:

#include "linux/cred.h"

static inline uid_t get_uid(void) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
#include "linux/uidgid.h"
    // current_uid() returns struct in newer kernels
    return __kuid_val(current_uid());
#else
    return 0 == current_uid();
#endif
}

linux/uidgid.hまた、を直接呼び出さないように、ROOT uid/gidを定義する便利なマクロとインライン比較関数を探す必要があります__kuid_val()

たとえば、一般的な使用法は、ユーザーがrootであるかどうかを確認することです。

static inline bool is_root_uid(void) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
#include "linux/uidgid.h"
    // current_uid() returns struct in newer kernels
    return uid_eq(current_uid(), GLOBAL_ROOT_UID);
#else
    return 0 == current_uid();
#endif
}
于 2018-05-11T21:03:18.930 に答える