|
|
|
Перехват и подмена вызываемых функций09.08.2009, 03:57. Показов 26104. Ответов 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 файла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|