Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 161, средняя оценка - 4.61
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
#1

Перехват и подмена вызываемых функций - C++

09.08.2009, 03:57. Просмотров 19755. Ответов 25
Метки нет (Все метки)

Здравствуйте.

Нужно подменить вызов таких функций как open(), lstat[64](), stat[64](), read(), write(), mkdir(), chdir(), getcwd() для определенного процесса.
Интересует мнение других. Как бы вы реализовали эту задачу.

Спасибо!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2009, 03:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перехват и подмена вызываемых функций (C++):

Перехват пользовательских функций (процедур) - C++
Возможно перехватить API сообщение или функцию, а также любую другую ф-цию вызываемую из библиотеки. Но есть ли возможность перехватить...

Статья на rsdn, перехват API-функций - C++
Разбираю статью на рсдн, а именно Метод 1. Перехват API непосредственной записью в код системной функции. dll вроде скомпилировал, дошел...

Цикл| Подмена переменной - C++ Builder
void __fastcall TForm1::Button1Click(TObject *Sender) { int r0,r1,r2,r3,r4,r5; int e0,e1,e3,e4,e4,e5; int g = 10; int i; ...

Raw socket подмена ip адреса отправителя - C++ Builder
Задача такая надо отправить пакет с другим ip адресом отправителя. Подскажите как это сделать? Слышал что можно это сделать через Raw...

Подмена событий нажатия мыши в TChart - C++ Builder
Доброго времени суток Уважаемые. В TChart`e возможность двигать график сделана правой кнопкой мыши, левой сделать зум. Мне же в...

Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу - C++ Builder
Перегрузка функций, шаблоны функций Функция определения объемов: шара по его радиусу (V=4/3пиR2), конуса по радиусу основания и высоте...

25
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.08.2009, 00:04  [ТС] #16
Или тебе нужно это втихаря делать?

Нет.
Объясняю для чего все это.
Есть чужой проект. В него нужно внести изменения. Но, так как проект этот очень большой и очень глючный(я это знаю ), я не хочу влезать в его коды. Так как потом, меня обвинят в том, что это после моего вмешательства все начало дико глючить. По этой причине я и выбрал такой способ. Вот клиент сильно удивится. Возможно он и надеется что я полезу в коды, для того чтоб бесплатно вылечить глюки.

вот.
0
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
11.08.2009, 00:06 #17
Ну тогда пишется отдельный скрипт-пускач, в нём выставляется переменная и запускается бинарник
Но надо иметь в виду, что подсунуть ты можешь только те функции, которые в бибилиотеке WEAK. Хотя чёрт его знает, можно и GLOBAL'ы переопределять - поэкспериментируй
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.08.2009, 11:15  [ТС] #18
Еще проблемка.
Хочу использовать функции _init(), _fini(). Линкер сообщает:
ld.c.text+0x0): multiple definition of `_init'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o:/build/buildd/glibc-2.9/build-tree/i386-libc/csu/crti.S:15: first defined here
ld.o: In function `_fini':
ld.c.text+0x61): multiple definition of `_fini'
/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crti.o:/build/buildd/glibc-2.9/csu/../sysdeps/generic/initfini.c:109: first defined here
По моему все правильно делаю.

Добавлено через 1 час 43 минуты 32 секунды
Понял в чем дело. Нужно добавить -nostartfiles
0
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
12.08.2009, 12:17 #19
Если хочешь нормально переопределить _init и _fini - надо их оформить в виде стартовых модулей. Плюс там свои тонкости, потому что без этого библиотека нормально не проинициализируется. Описывать слишком долго, а потому не рекомендую их трогать

Вкратце могу сказать, в модуле crti.o надодится начало процедуры _init, в модуеле crtn.o находится её конец, а тело размазано по куче модулей из библиотек. Аналогично с _fini
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.08.2009, 12:29  [ТС] #20
Понял.
Мне в любом случае нужны две функции. Одна для инициализации, другая для очистки.
Эта библиотека переопределяет некоторые функции, ну я выше писал...
Так вот. Помимо переопределения, в ней содержатся некоторые функции, при помощи которых, демон, снабжает ее необходимой информацией(т.е. динамически подгружает, и т.д.).
Т.е. я вместо _init(), _fini() назову их к примеру myinit(), myfinish() и вызову их из него.
Так нормально?

А вообще, что порекомендуете почитать по динамическим библиотекам?

Спасибо!
0
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
12.08.2009, 12:34 #21
Я не понял, кто такой "демон" и откуда это "из него"

Про почитать - я уже писал, что я обходился без литературы, работая с иходниками gnu'того линкера, компилятора, glibc и т.п. А потому просто не знаю, где это может быть внятно написано
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.08.2009, 12:52  [ТС] #22
Цитата Сообщение от Evg Посмотреть сообщение
Я не понял, кто такой "демон" и откуда это "из него"
Описываю процесс:
Есть программа, для которой я хочу подменить некоторые функции. К примеру mkdir(). Программа вызывает эту функцию, передавая ей "~/anypath". Мне нужно, чтоб моя версия mkdir() создала каталог "~/anyprefix_anypath". Но для каждого каталога префикс разный. По этому, в библиотеку я добавил функции которые снабжают ее(мою версию mkdir()) информацией, anypath -> anyprefix. При вызове mkdir(), она(моя версия функции) ищет соответствие полученного аргумента чтоб определить префикс. Для того чтоб снабжать функцию информацией, я написал программу(процесс, в будущем демон) которая посредством динамического связывания, управляет словарем соответствий в динамической библиотеки.

Пока писал, пришел вопрос. А не получится ли так, что создадутся две копии библиотеки?...по моему так и получится.... хз как в Линукс это происходит.
Поправьте пожалуйста.
0
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
12.08.2009, 13:38 #23
А зачем тебе для этого хачить _init?

Про две копии вопрос тоже не понял
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.08.2009, 13:45  [ТС] #24
Цитата Сообщение от Evg Посмотреть сообщение
А зачем тебе для этого хачить _init?
Есть переменные которые нужно проинициализировать. Но это не проблема.
Сделаю так:
Цитата Сообщение от niXman Посмотреть сообщение
вместо _init(), _fini() назову их к примеру myinit(), myfinish() и вызову их из процесса который обновляет таблицу соответствия.
Цитата Сообщение от Evg Посмотреть сообщение
Про две копии вопрос тоже не понял
Т.е. Одна для процесса который обновляет таблицу соответствия, а вторая, та которая подменяет функции.
0
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
12.08.2009, 14:31 #25
Если нужна нестатическая инициализация, то делается это через функцию-конструктор, для этого в gcc есть специальный атрибут

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int G;
 
void __attribute__((constructor))
func (void)
{
  G = 1;
}
 
int
main (void)
{
  printf ("G=%d\n", G);
  return 0;
}
Про две копии. Динамические библиотеки они не только динамические, но ещё и разделяемые. Т.е. если несколько процессов используют одну и ту же библиотеку, то в момент исполнения библиотека физически будет находиться в памяти в количестве одной штуки, а код будет мапироваться в виртуальную память каждого процесса. Это, потятное дело, касается только read-only частей: кода и константных глобальных данных

Если это именно то, что тебя интересовало
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.08.2009, 14:38  [ТС] #26
Понял.
Спасибо!
Скоро буду запускать. Поглядим-ка что из этой идеи получилось
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2009, 14:38
Привет! Вот еще темы с ответами:

Насколько хорошо компилятор производит оптимизацию часто вызываемых функций? - C++
Например есть строчки из кода unsigned long Ly_char4(unsigned char S) { unsigned long Ly(S + 1013904223); Ly = Ly * 1664525 + S +...

Программа для определения функций WinAPI, вызываемых программой с GUI - C++ WinAPI
Хотел бы узнать, какие функции Windows API вызывает программа с GUI. Какие программы позволяют это сделать? Хотелось бы, чтобы в программе...

Перехват и подмена пакетов - HTML, CSS
Не знал где лучше создать тему, попробую тут.(сразу извините, если будет выглядеть бредого, сам в этих делах дуб дубом, не судите строго...

Перехват / подмена потока с микрофона - .NET
Здравствуйте! Во время онлайн-игры появилась задачка, которую хотелось бы поковырять на досуге. Суть такова. У меня есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Yandex
Объявления
12.08.2009, 14:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru