Перехват библиотечных функций в linux и bsd


         

/Dev/mem - часть 4


Рисунок 3 Midnight Commander не может просмотреть файл /dev/mem

/dev/mem это необычный файл. Если в Midnight Commander'е подвести к нему курсор и нажать <F3> — ни хрена не выйдет (и не войдет)! Тоже самое произойдет если попытаться просмотреть другой файл, представляющий устройство /dev/mem (например, ранее созданный нами /home/kpnc/nezumi). Некоторые источники утверждают, что функция fopen обламывается с открытием /dev/mem и нужно юзать низкоуровневые функции операционной системы: open/read/write. Мыщъх проверил: на KNOPPIX (основан на Debian) и FreeBSD функции fopen/fread/frwite работают нормально, но, возможно, на других системах они ведут себя не так, поэтому не будем высаживаться и сделаем как говорят.

Маленький нюанс — под 4.5 BSD (более свежие версии не проверял) read всегда возвращает позитивный результат даже если море, тьфу, /dev/mem уже кончился, поэтому закладываться на возвращаемое ее значение нельзя.

#include <fcntl.h>

#define PAGE_SIZE    0x1000

int fd;

char buf_page[PAGE_SIZE];

// открываем /dev/mem на чтение и запись

// (подробнее см. "man 2 open")

if ((fd=open("/dev/mem", O_RDWR, 0))==-1) return printf("/dev/mem open error\n");

// перемещаемся в начало (необяз.)

if (lseek(fd, 0, SEEK_SET) == -1) return printf("/dev/mem seek error\n");

// читаем 0x1000 байт в буфер

if (read(fd, buf_page, 0x1000) != 0x1000) return printf("/dev/mem read error\n");

Листинг 5 фрагмент программы, демонстрирующей работу с файлом /dev/mem

Кстати говоря, консольный шестнадцатеричный редактор hexedit из комплекта поставки KNOPPIX показывает /dev/mem вполне нормально, а вот графическая версия khexedit, позаимствованная оттуда же, не показывает ни хрена.

Рисунок 4 редактор khexedit не может просмотреть файл /dev/mem

А давайте проведем небольшой эксперимент! Экспериментирование — это основное занятие мыщъх'ей (после ганжа, конечно). Возьмем какую-нибудь редко используемую библиотечную функцию (например, gets) и отпатчим ее по полной программе, внедрив в начало байт C3h, соответствующей машинной инструкции RETN, а потом вызовем ее и посмотрим получилось ли у нас или нет.




Содержание  Назад  Вперед