Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
return 0;
}
Поля структуры struct kma_struc заполняются следующими значениями:
n поле size – требуемый размер блока памяти;
n поле флаг – спецификатор GFP_KERNEL. Для версий ядра 2.4.9 и выше это значение составляет 0x1f0;
n поле mem – в этом поле будет сохранен указатель на начало блока памяти длиной size, выделенного в адресном пространстве ядра (возвращаемое функцией kmalloc значение);
n поле kmalloc – адрес функции kmalloc.
Адрес функции kmalloc необходимо найти. Сделать это можно несколькими способами. Самый простой путь – считать этот адрес из файла System.map или определить с помощью отладчика gdb (print &kmalloc). Если в ядре включена поддержка модулей, адрес kmalloc можно определить при помощи функции get_kernel_syms(). Этот вариант будет рассмотрен далее. Если же поддержка модулей ядра отсутствует, то адрес функции kmalloc придется искать по опкоду команды вызова kmalloc – аналогично тому, как было сделано для таблицы sys_call_table.
Функция kmalloc принимает два параметра: размер запрашиваемой памяти и спецификатор GFP. Вызов этой функции выглядит следующим образом:
push GFP_KERNEL
push size
call kmalloc
Для поиска опкода воспользуемся отладчиком и дизассемблируем любую функцию ядра, в которой есть вызов функции kmalloc.
Загружаем отладчик:
gdb -q /usr/src/linux/vmlinux
Дизассемблируем функцию inter_module_register. Неважно, что делает эта функция, главное, в ней есть то, что нам нужно – вызов функции kmalloc:
disass inter_module_register
Сразу обращаем внимание на следующие строки:
0xc0110de4 <inter_module_register+4>: push $0x1f0
0xc0110de9 <inter_module_register+9>: push $0x14
0xc0110deb <inter_module_register+11>: call 0xc0121c38 <kmalloc>
Это и есть вызов функции kmalloc. Сначала в стек загружаются параметры, а затем следует вызов функции. Значение 0xc0121c38 в вызове call является адресом функции kmalloc. Первым в стек загружается спецификатор GFP (push $0x1f0). Как уже упоминалось, для версий ядра 2.4.9 и выше это значение составляет 0x1f0. Найдем опкод этой команды:
x/xw (inter_module_register+4)
В результате получаем:
0xc0110de4 <inter_module_register+4>: 0x0001f068
Если мы найдем этот опкод, то сможем вычислить адрес функции kmalloc. На первый взгляд, адрес этой функции является аргументом инструкции call, но это не совсем так. В отличии от функции system_call, здесь за инструкцией call стоит не адрес kmalloc, а смещение к нему относительно текущего адреса. Убедимся в этом, определив опкод команды call 0xc0121c38:
x/xw (inter_module_register+11)