C приведение указателей - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь напечатать первый байт, если функция в ядре. Я хочу напечатать функцию «filldir». Я нашел его в ядре, используя / proc / kallsyms

это код (адрес ffffffff812e6020) -

    ffffffff812e6020:       e8 0b b9 91 00          callq  0xffffffff81c01930
    ffffffff812e6025:       55                      push   %rbp
    ffffffff812e6026:       48 89 e5                mov    %rsp,%rbp
    ffffffff812e6029:       41 57                   push   %r15

Я нашел тот же адрес (я так думаю), используя этот код в моем модуле ядра -

    typedef unsigned long psize;
    (psize *) filldir;

    filldir= (void *)kallsyms_lookup_name("filldir");
    printk("rooty: sys_call_table found at %p\n", filldir);

и получил - 000000001663973a, я не знаю, почему есть разница, я попытался привести его к long и unsigned long, но результат тот же.

поэтому мой первый вопрос : почему есть разница? Я почти уверен, что это тот же адрес, который напечатан по-другому ... как я могу получить правильное значение?

Мой второй вопрос , я пытаюсь напечатать первый байт функции (e8), но я понятия не имею, как это сделать.

я попробовал эти варианты -

    printk("%x", *filldir);
    printk("%x", *(unsigned char*)filldir); 
    printk("%x", (unsigned char*)filldir[0]); 

, но ни один из них не сработал, никогда не получал e8.

Как я могу напечатать первый байт функция, когда у меня есть указатель на функцию?

1 Ответ

0 голосов
/ 25 марта 2020

Что касается вашего первого вопроса (почему разница), спецификатор формата %p хешируется перед печатью, чтобы предотвратить утечку адреса. Правильный формат %px [1]. Приведение параметров за пределы строки формата не повлияет на это.

Что касается второго, второй вариант должен быть допустимым. Другие могут работать в некоторых средах, но не определено, что они должны делать.

Вы можете попробовать в пользовательском пространстве:

#include <stdio.h>

int square(int num) {
    return num * num;
}

int main() {
    printf("%x\n", *(unsigned char *)square);
    return 0;
}

[1] https://www.kernel.org/doc/html/latest/core-api/printk-formats.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...