|
|
|
Перехват и подмена вызываемых функций09.08.2009, 03:57. Показов 25969. Ответов 25
Метки нет (Все метки)
Здравствуйте.
Нужно подменить вызов таких функций как open(), lstat[64](), stat[64](), read(), write(), mkdir(), chdir(), getcwd() для определенного процесса. Интересует мнение других. Как бы вы реализовали эту задачу. Спасибо!
0
|
|
| 09.08.2009, 03:57 | |
|
Ответы с готовыми решениями:
25
Программа для определения функций WinAPI, вызываемых программой с GUI
Насколько хорошо компилятор производит оптимизацию часто вызываемых функций? |
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
| 09.08.2009, 20:42 | |
|
Установить переменную LD_PRELOAD. И вообще прочитай man ld.so про работу runtume loader-а.
1
|
|
|
|
|
| 09.08.2009, 23:19 | |
|
Все системные вызовы реализованы в виде WEAK процедур. Т.е. это означает, что их можно подменать (путём заведения GLOBAL символя с таким же именем). Т.е. пишешь динамическую библиотеку, в которой реализована функция с именем "open", затем в переменную окружения LD_PRELOAD прописываешь полный путь до библиотеки, затем запускаешь программу. Для контроля можешь запустить "ldd <prog_name>" чтобы убедиться, что твоя библиотека реально подцепилась.
При этом остаётся возможность обратиться к "настоящему" системному вызову по имени "__open"
2
|
|
|
|
||||||||||||||||
| 10.08.2009, 10:44 | ||||||||||||||||
Сообщение было отмечено как решение
Решение
12
|
||||||||||||||||
|
|
|
| 10.08.2009, 19:59 | |
|
$ readelf -s /lib/libc-2.7.so
glibc - системная библиотека самого низкого уровня, а потому в идеале она вообще ничего не должна импортировать. Реально ld.so является составной частью библиотеки, а потому оттуда импортируются какие-то функции. В печати они в самом начале и помечены UND (undefined) в графе Ndx. При этом если в поле Bind стоит WEAK, то такой символ может и отсуствовать (т.е. он необязательный)
2
|
|
|
|
|
| 10.08.2009, 20:19 | |
|
Этими хреновинами они поддерживают совместимость версий. Т.е. была некая "старая" динамическая glibc, у которой версионный символ для fopen был выставлен в GLIBC_2.0. В какой-то момент там что-то поменялось в реализации, что стало несовместимо со старыми версиями, поэтому они сделали новую реализациюю, пометили её символом GLIBC_2.1 (уже с двумя символнами @) и теперь у них есть динамическая библиотека, которая одновременно работает и со старыми и с новыми бинарниками. При этом в бинарниках, использующих glibc должен быть соотвествующий символ, помеченный как UNDEF
Имя файла libc.so.6 чем-то мне говорит, что у тебя старая версия glibc'ей чтоли. Покажи, что выдаётся по "ls /lib/libc* /lib/ld-linux*" Добавлено через 1 минуту 16 секунд А вообще, если я буду отвечать на такие частные вопросы, врядли у тебя появится какое-то нормальное понимание того, что там происходит. Разве что очень поверхностное. Тебе надо читать, что такое объектный файл, динамическая библиотека, исполняемый файл с точки зрения бинарного формата и как вообще работает линковка
0
|
|
|
|
|||
| 10.08.2009, 20:30 [ТС] | |||
Еще вопрос. Как узнать какие функции вызывает функция "fopen", или другие? Что означают одинарный и двойной подчерки перед названием функции? Добавлено через 4 минуты 0 секунд
![]() Я не новичек. Я программист С/С++ с 10 летним стажем. Т.е. склад ума соответствующий Просто раньше не возникало подобной необходимости.Я очень благодарен Вам за подробные ответы. ![]() Добавлено через 2 минуты 39 секунд Согласитесь, что не каждый день(а может быть и за всю карьеру) приходится подменять стандартные функции. Да и программированием это особо не назовешь, скорее хак
0
|
|||
|
|
||||||||||||||||||||||||||||||||||||||||
| 10.08.2009, 21:07 | ||||||||||||||||||||||||||||||||||||||||
Но в любом случае всё это - системная специфика. Понятно, что программисту с 10-летним стажем это гораздо проще понять, чем новичку, но просто сразу предупреждаю, что у тебя будут ответы на вопросы, но каких-то полезных знаний таким макаром сложно будет приобрести. Ты выполняешь задачу, которая всё-таки требует понимания специфики всего этого дела. К сожалению, с ходу не могу сказать, где и что можно почитать - я как-то по работе в течение нескольких лет с этим общаюсь, а потому это всё опытным путём добывалось. В любом случае на вопросы отвечуДобавлено через 2 минуты 22 секунды > Чуть позже отвечу Просто на работе мы используем немного другие утилиты (самодельные), а потому надо сообразить, как со стандартными работать Добавлено через 12 минут 15 секунд В общем как-то не совсем удобно стандартными gnu'шными утилитами работать, но тем не менее. Смотрим выдачу по readelf -s:
Далее делаем дизассемблер от библиотеки:
Щас напишу ещё один вариант - со статической библиотекой. В теории код там должен быть такой же (хотя в некоторых случаях он различается для статической и динамической версий). Но статическая библиотека представляет собой архив отдельных объектных файлов, а потому там копаться иногда проще Добавлено через 7 минут 14 секунд Смотрим, из каких файлов состоит статическая библиотека, отфильтруем те, у которых есть fopen в названии
Выдираем файл из архива
Добавлено через 4 минуты 12 секунд Пардон, ошибся. Там ещё есть __fopen_maybe_mmap и __fopen_internal. Т.е. всего три процедуры. И надо разбираться, какие из UNDEF'ов растут из каких процедур
Добавлено через 2 минуты 29 секунд А можно вообще сделать дизассемблеирование, и там всё станет понятно
Добавлено через 1 минуту 58 секунд Не, с дизассемблером лажа, там использование внешних имён не подставляется. Так что вычислять надо, как я указал выше - по двум дампам "readelf -s" и "readelf -r"
1
|
||||||||||||||||||||||||||||||||||||||||
|
|
||
| 10.08.2009, 22:45 [ТС] | ||
|
Спасибо
![]() Буду пробовать. Добавлено через 1 час 26 минут 23 секунды
0
|
||
|
|
||
| 11.08.2009, 00:04 [ТС] | ||
![]() Нет. Объясняю для чего все это. Есть чужой проект. В него нужно внести изменения. Но, так как проект этот очень большой и очень глючный(я это знаю ), я не хочу влезать в его коды. Так как потом, меня обвинят в том, что это после моего вмешательства все начало дико глючить. По этой причине я и выбрал такой способ. Вот клиент сильно удивится. Возможно он и надеется что я полезу в коды, для того чтоб бесплатно вылечить глюки.вот.
0
|
||
|
|
|
| 11.08.2009, 00:06 | |
|
Ну тогда пишется отдельный скрипт-пускач, в нём выставляется переменная и запускается бинарник
Но надо иметь в виду, что подсунуть ты можешь только те функции, которые в бибилиотеке WEAK. Хотя чёрт его знает, можно и GLOBAL'ы переопределять - поэкспериментируй
0
|
|
|
|
||
| 12.08.2009, 11:15 [ТС] | ||
|
Еще проблемка.
Хочу использовать функции _init(), _fini(). Линкер сообщает:
Добавлено через 1 час 43 минуты 32 секунды Понял в чем дело. Нужно добавить -nostartfiles
0
|
||
|
|
|
| 12.08.2009, 12:17 | |
|
Если хочешь нормально переопределить _init и _fini - надо их оформить в виде стартовых модулей. Плюс там свои тонкости, потому что без этого библиотека нормально не проинициализируется. Описывать слишком долго, а потому не рекомендую их трогать
Вкратце могу сказать, в модуле crti.o надодится начало процедуры _init, в модуеле crtn.o находится её конец, а тело размазано по куче модулей из библиотек. Аналогично с _fini
0
|
|
|
|
|
| 12.08.2009, 12:29 [ТС] | |
|
Понял.
Мне в любом случае нужны две функции. Одна для инициализации, другая для очистки. Эта библиотека переопределяет некоторые функции, ну я выше писал... Так вот. Помимо переопределения, в ней содержатся некоторые функции, при помощи которых, демон, снабжает ее необходимой информацией(т.е. динамически подгружает, и т.д.). Т.е. я вместо _init(), _fini() назову их к примеру myinit(), myfinish() и вызову их из него. Так нормально? А вообще, что порекомендуете почитать по динамическим библиотекам? Спасибо!
0
|
|
| 12.08.2009, 12:29 | |
|
Помогаю со студенческими работами здесь
20
Создать программу, которая состоит из отдельных функций, вызываемых к методе main () Перехват и подмена пакетов Перехват сетевых пакетов и их подмена Перехват / подмена потока с микрофона Перехват и подмена имени .dll файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|