1

これは単純な sys_call_table フック コードです

#include <asm/unistd.h>
#include <linux/autoconf.h>
#include <linux/in.h>
#include <linux/init_task.h>
#include <linux/ip.h>
#include <linux/kernel.h>
#include <linux/kmod.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/skbuff.h>
#include <linux/stddef.h>
#include <linux/string.h>
#include <linux/syscalls.h>
#include <linux/tcp.h>
#include <linux/types.h>
#include <linux/unistd.h>
#include <linux/version.h>
#include <linux/workqueue.h>

ssize_t *sys_call_table = (ssize_t *)0xc0026e04;

asmlinkage ssize_t (*orig_open)(const char *pathname, int flags);

asmlinkage ssize_t hacked_open(const char *pathname, int flags)
{
    printk(KERN_INFO "SYS_OPEN called : %s\n", pathname);
    return orig_open(pathname, flags);
}

int init_module(void)
{
    orig_open = sys_call_table[__NR_open];      /* line 33 */
    sys_call_table[__NR_open] = hacked_open;    /* line 34 */
    return 0;
}

void cleanup_module(void)
{
    sys_call_table[__NR_open] = orig_open;      /* line 40 */
}

MODULE_LICENSE("GPL");

以下のような警告が出ました

このコードは正常に動作しますが、警告を削除したいです。どのようにできるのか?

/home/tester/tools/lkm/ac: 関数 'init_module' 内:
/home/tester/tools/lkm/ac:33: 警告: 割り当てにより、キャストなしでポインターから整数が作成されます
/home/tester/tools/lkm/ac :34: 警告: 割り当てにより、キャストなしでポインターから整数が作成されます
/home/tester/tools/lkm/ac: 関数 'cleanup_module' 内:
/home/tester/tools/lkm/ac:40: 警告: 割り当てにより、ポインターから整数が作成されますキャストなし

4

2 に答える 2

0

コンパイラーを沈黙させたい場合は、型キャストを追加する必要があります (それが悪い考えであることが多い場合でも、これはコンパイラーがそれを変更する方法です)。

ssize_t *sys_call_table = (ssize_t *)0xc0026e04;

typedef ssize_t (*ftype)(const char *, int);

ftype orig_open;

ssize_t hacked_open(const char *pathname, int flags)
{
    printf("SYS_OPEN called : %s\n", pathname);
    return orig_open(pathname, flags);
}

int init_module(void)
{
    orig_open = (ftype)sys_call_table[__NR_open];
    sys_call_table[__NR_open] = (ssize_t)hacked_open;
    return 0;
}
于 2012-11-10T15:48:44.190 に答える
0

33行目を見ると、問題が表示されます。

orig_open = sys_call_table[__NR_open];

sys_call_table整数へのポインターであると定義しました。それが警告の理由です。他の行と同じ問題。適切に定義sys_call_tableすると、警告は消えます。

ssize_t64ビットシステムで32ビットのみの場合、64ビットアドレスを32ビット整数に切り詰める可能性があるため、少なくともポインターの配列またはポインターへのポインターとして定義する必要があります。

于 2012-11-10T15:49:58.820 に答える