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

C++

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

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

09.08.2009, 03:57. Просмотров 19854. Ответов 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
odip
Эксперт С++
7159 / 3221 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
09.08.2009, 20:42 #2
Установить переменную LD_PRELOAD. И вообще прочитай man ld.so про работу runtume loader-а.
1
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
09.08.2009, 23:19 #3
Все системные вызовы реализованы в виде WEAK процедур. Т.е. это означает, что их можно подменать (путём заведения GLOBAL символя с таким же именем). Т.е. пишешь динамическую библиотеку, в которой реализована функция с именем "open", затем в переменную окружения LD_PRELOAD прописываешь полный путь до библиотеки, затем запускаешь программу. Для контроля можешь запустить "ldd <prog_name>" чтобы убедиться, что твоя библиотека реально подцепилась.

При этом остаётся возможность обратиться к "настоящему" системному вызову по имени "__open"
2
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.08.2009, 04:17  [ТС] #4
Всем спасибо!
Еще один вопрос: Где можно посмотреть реальный пример реализации сей задачи?
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
10.08.2009, 10:44 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
2
3
4
5
6
7
8
9
/* Файл t.c */
#include <unistd.h>
 
int
main (void)
{
  write (1, "abc\n", 4);
  return 0;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* Файл tt.c */
/* Для реализации настоящего вызова в стандартных хидерах
 * описан только вариант write, а __write в интерфейс
 * не выставляется (т.к. это не есть стандарт). данная фича
 * заточена под реализацию glibc на linux'е и не факт,
 * что будет работать на других ОС */
extern int __write (int fd, const char *buff, long len);
 
int
write (int fd, const char *buff, long len)
{
  __write (fd, "trampampam\n", 11);
  __write (fd, buff, len);
}
Код
Собираем нашу читерскую библиотеку
$ gcc tt.c -fPIC -c
$ gcc tt.o -shared -o libshaman.so

Собираем исполняемый файл
$ gcc t.c

Честный запуск файла
$ ./a.out
abc

Читерский запуск файла
$ export LD_PRELOAD=`pwd`/libshaman.so
$ ./a.out
trampampam
abc

Снова честный
$ unset LD_PRELOAD
$ ./a.out
abc
12
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.08.2009, 15:11  [ТС] #6
А glibc, на всех линах имеют одинаковый интерфейс? т.е. имена экспортируемых функций.
1
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
10.08.2009, 16:16 #7
Ну... в пределах нескольких лет развития назад - да. Что было 15 лет назад - хер его знает, но такие древности в данном случае не должны рассматриваться
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.08.2009, 19:45  [ТС] #8
Как узнать имена экспортируемых функций из "libc" ?

Добавлено через 1 минуту 2 секунды
...и импортируемых.
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
10.08.2009, 19:59 #9
$ readelf -s /lib/libc-2.7.so

glibc - системная библиотека самого низкого уровня, а потому в идеале она вообще ничего не должна импортировать. Реально ld.so является составной частью библиотеки, а потому оттуда импортируются какие-то функции. В печати они в самом начале и помечены UND (undefined) в графе Ndx. При этом если в поле Bind стоит WEAK, то такой символ может и отсуствовать (т.е. он необязательный)
2
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.08.2009, 20:11  [ТС] #10
Вот пример из "/lib/libc.so.6"
178: 0005ce20 50 FUNC GLOBAL DEFAULT 11 fopen@@GLIBC_2.1
179: 0010a8a0 138 FUNC GLOBAL DEFAULT 11 fopen@GLIBC_2.0
Почему функций "fopen" две? И что значит "GLIBC_2.1" и "GLIBC_2.0" ?
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
10.08.2009, 20:19 #11
Этими хреновинами они поддерживают совместимость версий. Т.е. была некая "старая" динамическая glibc, у которой версионный символ для fopen был выставлен в GLIBC_2.0. В какой-то момент там что-то поменялось в реализации, что стало несовместимо со старыми версиями, поэтому они сделали новую реализациюю, пометили её символом GLIBC_2.1 (уже с двумя символнами @) и теперь у них есть динамическая библиотека, которая одновременно работает и со старыми и с новыми бинарниками. При этом в бинарниках, использующих glibc должен быть соотвествующий символ, помеченный как UNDEF

Имя файла libc.so.6 чем-то мне говорит, что у тебя старая версия glibc'ей чтоли. Покажи, что выдаётся по "ls /lib/libc* /lib/ld-linux*"

Добавлено через 1 минуту 16 секунд
А вообще, если я буду отвечать на такие частные вопросы, врядли у тебя появится какое-то нормальное понимание того, что там происходит. Разве что очень поверхностное. Тебе надо читать, что такое объектный файл, динамическая библиотека, исполняемый файл с точки зрения бинарного формата и как вообще работает линковка
0
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.08.2009, 20:30  [ТС] #12
Имя файла libc.so.6 чем-то мне говорит, что у тебя старая версия glibc'ей чтоли
Это симлинк на "/lib/libc-2.9.so"

Еще вопрос.
Как узнать какие функции вызывает функция "fopen", или другие?
Что означают одинарный и двойной подчерки перед названием функции?

Добавлено через 4 минуты 0 секунд
А вообще, если я буду отвечать на такие частные вопросы, врядли у тебя появится какое-то нормальное понимание того, что там происходит. Разве что очень поверхностное. Тебе надо читать, что такое объектный файл, динамическая библиотека, исполняемый файл с точки зрения бинарного формата и как вообще работает линковка

Я не новичек. Я программист С/С++ с 10 летним стажем. Т.е. склад ума соответствующий Просто раньше не возникало подобной необходимости.
Я очень благодарен Вам за подробные ответы.

Добавлено через 2 минуты 39 секунд
Согласитесь, что не каждый день(а может быть и за всю карьеру) приходится подменять стандартные функции.
Да и программированием это особо не назовешь, скорее хак
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
10.08.2009, 21:07 #13
Цитата Сообщение от niXman Посмотреть сообщение
Это симлинк на "/lib/libc-2.9.so"
Понятно, видимо старое имя для совместимости оставлено

Цитата Сообщение от niXman Посмотреть сообщение
Еще вопрос.
Как узнать какие функции вызывает функция "fopen", или другие?
Что означают одинарный и двойной подчерки перед названием функции?
Чуть позже отвечу

Цитата Сообщение от niXman Посмотреть сообщение
Я программист С/С++ с 10 летним стажем
Значит всё гораздо проще Но в любом случае всё это - системная специфика. Понятно, что программисту с 10-летним стажем это гораздо проще понять, чем новичку, но просто сразу предупреждаю, что у тебя будут ответы на вопросы, но каких-то полезных знаний таким макаром сложно будет приобрести. Ты выполняешь задачу, которая всё-таки требует понимания специфики всего этого дела. К сожалению, с ходу не могу сказать, где и что можно почитать - я как-то по работе в течение нескольких лет с этим общаюсь, а потому это всё опытным путём добывалось. В любом случае на вопросы отвечу

Цитата Сообщение от niXman Посмотреть сообщение
Да и программированием это особо не назовешь, скорее хак
Да и сам ты всё прекрасно понимаешь, о чём я написал выше

Добавлено через 2 минуты 22 секунды
> Чуть позже отвечу

Просто на работе мы используем немного другие утилиты (самодельные), а потому надо сообразить, как со стандартными работать

Добавлено через 12 минут 15 секунд
В общем как-то не совсем удобно стандартными gnu'шными утилитами работать, но тем не менее. Смотрим выдачу по readelf -s:

Код
   177: 00059220    50 FUNC    GLOBAL DEFAULT   11 fopen@@GLIBC_2.1
Сие означает, что функция находится в файле по адресу 0x59220 и имеет размер 50 (десятичное число) байт

Далее делаем дизассемблер от библиотеки:

Код
$ objdump -d /lib/libc-2.7.so > DD
Далее в файле ищем адрес 59220. Но не имя fopen, потому как зачастую в библиотеках одна и та же процедуры может иметь несколько имён. В моём случае в выдачу дизассемблера попало имя _IO_fopen. В дизассемблере у меня печатаются глобальные имена, к которым обращается процедура fopen. При этом по дизассемблеру видно, что реально код выползает за размеры 50 байт, но также видно, что начиная с 50-го байта идёт пачка nop'ов а потом хрен не пойми чего. Если разбираешься в intel'овском ассемблере, то наверное сможешь и понять, что там делается и откуда дёргается

Щас напишу ещё один вариант - со статической библиотекой. В теории код там должен быть такой же (хотя в некоторых случаях он различается для статической и динамической версий). Но статическая библиотека представляет собой архив отдельных объектных файлов, а потому там копаться иногда проще

Добавлено через 7 минут 14 секунд
Смотрим, из каких файлов состоит статическая библиотека, отфильтруем те, у которых есть fopen в названии

Код
$ ar t /usr/lib/libc.a | grep fopen
iofopen.o
iofopen64.o

Выдираем файл из архива

Код
$ ar x /usr/lib/libc.a iofopen.o   
$ ls iofopen.o 
iofopen.o
Смотрим, какие символы присутсвуют в объектнике

Код
$ readelf -s iofopen.o 

Symbol table '.symtab' contains 23 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 SECTION LOCAL  DEFAULT    1 
     2: 00000000     0 SECTION LOCAL  DEFAULT    3 
     3: 00000000     0 SECTION LOCAL  DEFAULT    4 
     4: 00000000     0 SECTION LOCAL  DEFAULT    5 
     5: 00000000     0 SECTION LOCAL  DEFAULT    7 
     6: 00000000     0 SECTION LOCAL  DEFAULT    8 
     7: 00000000    63 FUNC    GLOBAL DEFAULT    1 __fopen_maybe_mmap
     8: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_wfile_jumps_maybe_mma
     9: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_file_jumps_maybe_mmap
    10: 00000040   196 FUNC    GLOBAL DEFAULT    1 __fopen_internal
    11: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND malloc
    12: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_wfile_jumps
    13: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_no_init
    14: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_file_jumps
    15: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_file_init
    16: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_file_fopen
    17: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND _IO_un_link
    18: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND free
    19: 00000110    34 FUNC    GLOBAL DEFAULT    1 _IO_new_fopen
    20: 00000110    34 FUNC    GLOBAL DEFAULT    1 __new_fopen
    21: 00000110    34 FUNC    WEAK   DEFAULT    1 _IO_fopen
    22: 00000110    34 FUNC    WEAK   DEFAULT    1 fopen
Всё, что UNDEF - это по сути использование extern'ов. 4 последних - это то, что экспортируется в этом объектнике: символы GLOBAL и WEAK, но не LOCAL (в данном случае их просто нет). Причём видим, что у всех 4 символов совпадает адрес. Т.е. физически мы имеем процедуру, точка входа в которую имеет 4 метки с разными именами, а потому все UNDEF'ы расту из этой процедуры

Добавлено через 4 минуты 12 секунд
Пардон, ошибся. Там ещё есть __fopen_maybe_mmap и __fopen_internal. Т.е. всего три процедуры. И надо разбираться, какие из UNDEF'ов растут из каких процедур

Код
$ readelf -r iofopen.o 

Relocation section '.rel.text' at offset 0x690 contains 13 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0000001e  00000801 R_386_32          00000000   _IO_wfile_jumps_maybe_
0000002b  00000801 R_386_32          00000000   _IO_wfile_jumps_maybe_
00000039  00000901 R_386_32          00000000   _IO_file_jumps_maybe_m
00000063  00000b02 R_386_PC32        00000000   malloc
00000088  00000c01 R_386_32          00000000   _IO_wfile_jumps
000000a0  00000d02 R_386_PC32        00000000   _IO_no_init
000000aa  00000e01 R_386_32          00000000   _IO_file_jumps
000000b2  00000f02 R_386_PC32        00000000   _IO_file_init
000000c9  00001002 R_386_PC32        00000000   _IO_file_fopen
000000e9  00001102 R_386_PC32        00000000   _IO_un_link
000000f1  00001202 R_386_PC32        00000000   free
0000012c  00000a02 R_386_PC32        00000040   __fopen_internal
000000e1  00000702 R_386_PC32        00000000   __fopen_maybe_mmap

Relocation section '.rel.eh_frame' at offset 0x6f8 contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
0000001c  00000101 R_386_32          00000000   .text
0000004c  00000101 R_386_32          00000000   .text
Здесь расписаны места, где торчат ссылки на символы (relocation, хз как по русски называется). Например, malloc используется по адресу 0x63, а из предыдущего дампа можно понять, что этот адрес принадлежиьт процедуре __fopen_internal, потому как её стартовый адрес 0x40, а размер 196

Добавлено через 2 минуты 29 секунд
А можно вообще сделать дизассемблеирование, и там всё станет понятно

Код
$ objdump -d iofopen.o 

iofopen.o:     file format elf32-i386

Disassembly of section .text:

00000000 <__fopen_maybe_mmap>:
   0:	55                   	push   %ebp
   1:	89 e5                	mov    %esp,%ebp
   3:	8b 55 08             	mov    0x8(%ebp),%edx
   6:	f6 42 3c 01          	testb  $0x1,0x3c(%edx)
   a:	74 23                	je     2f <__fopen_maybe_mmap+0x2f>
   c:	f6 02 08             	testb  $0x8,(%edx)
   f:	74 1e                	je     2f <__fopen_maybe_mmap+0x2f>
  11:	8b 42 68             	mov    0x68(%edx),%eax
  14:	85 c0                	test   %eax,%eax
  16:	7e 1b                	jle    33 <__fopen_maybe_mmap+0x33>
  18:	c7 82 94 00 00 00 00 	movl   $0x0,0x94(%edx)
  1f:	00 00 00 
  22:	8b 42 58             	mov    0x58(%edx),%eax
  25:	c7 80 b8 00 00 00 00 	movl   $0x0,0xb8(%eax)
  2c:	00 00 00 
  2f:	5d                   	pop    %ebp
  30:	89 d0                	mov    %edx,%eax
  32:	c3                   	ret    
  33:	c7 82 94 00 00 00 00 	movl   $0x0,0x94(%edx)
  3a:	00 00 00 
  3d:	eb e3                	jmp    22 <__fopen_maybe_mmap+0x22>
  3f:	90                   	nop    

00000040 <__fopen_internal>:
  40:	55                   	push   %ebp
  41:	89 e5                	mov    %esp,%ebp
  43:	83 ec 24             	sub    $0x24,%esp
  46:	8b 45 08             	mov    0x8(%ebp),%eax
  49:	89 5d f4             	mov    %ebx,-0xc(%ebp)
  4c:	89 75 f8             	mov    %esi,-0x8(%ebp)
  4f:	8b 75 10             	mov    0x10(%ebp),%esi
  52:	89 7d fc             	mov    %edi,-0x4(%ebp)
  55:	8b 7d 0c             	mov    0xc(%ebp),%edi
  58:	89 45 f0             	mov    %eax,-0x10(%ebp)
  5b:	c7 04 24 60 01 00 00 	movl   $0x160,(%esp)
  62:	e8 fc ff ff ff       	call   63 <__fopen_internal+0x23>
  67:	85 c0                	test   %eax,%eax
  69:	89 c3                	mov    %eax,%ebx
  6b:	0f 84 84 00 00 00    	je     f5 <__fopen_internal+0xb5>
  71:	8d 80 98 00 00 00    	lea    0x98(%eax),%eax
  77:	89 43 48             	mov    %eax,0x48(%ebx)
  7a:	8d 83 a4 00 00 00    	lea    0xa4(%ebx),%eax
  80:	89 44 24 0c          	mov    %eax,0xc(%esp)
  84:	c7 44 24 10 00 00 00 	movl   $0x0,0x10(%esp)
  8b:	00 
  8c:	c7 44 24 08 00 00 00 	movl   $0x0,0x8(%esp)
  93:	00 
  94:	c7 44 24 04 00 00 00 	movl   $0x0,0x4(%esp)
  9b:	00 
  9c:	89 1c 24             	mov    %ebx,(%esp)
  9f:	e8 fc ff ff ff       	call   a0 <__fopen_internal+0x60>
  a4:	c7 83 94 00 00 00 00 	movl   $0x0,0x94(%ebx)
  ab:	00 00 00 
  ae:	89 1c 24             	mov    %ebx,(%esp)
  b1:	e8 fc ff ff ff       	call   b2 <__fopen_internal+0x72>
  b6:	89 74 24 0c          	mov    %esi,0xc(%esp)
  ba:	89 7c 24 08          	mov    %edi,0x8(%esp)
  be:	8b 45 f0             	mov    -0x10(%ebp),%eax
  c1:	89 1c 24             	mov    %ebx,(%esp)
  c4:	89 44 24 04          	mov    %eax,0x4(%esp)
  c8:	e8 fc ff ff ff       	call   c9 <__fopen_internal+0x89>
  cd:	85 c0                	test   %eax,%eax
  cf:	74 14                	je     e5 <__fopen_internal+0xa5>
  d1:	89 5d 08             	mov    %ebx,0x8(%ebp)
  d4:	8b 75 f8             	mov    -0x8(%ebp),%esi
  d7:	8b 5d f4             	mov    -0xc(%ebp),%ebx
  da:	8b 7d fc             	mov    -0x4(%ebp),%edi
  dd:	89 ec                	mov    %ebp,%esp
  df:	5d                   	pop    %ebp
  e0:	e9 fc ff ff ff       	jmp    e1 <__fopen_internal+0xa1>
  e5:	89 1c 24             	mov    %ebx,(%esp)
  e8:	e8 fc ff ff ff       	call   e9 <__fopen_internal+0xa9>
  ed:	89 1c 24             	mov    %ebx,(%esp)
  f0:	e8 fc ff ff ff       	call   f1 <__fopen_internal+0xb1>
  f5:	8b 5d f4             	mov    -0xc(%ebp),%ebx
  f8:	31 c0                	xor    %eax,%eax
  fa:	8b 75 f8             	mov    -0x8(%ebp),%esi
  fd:	8b 7d fc             	mov    -0x4(%ebp),%edi
 100:	89 ec                	mov    %ebp,%esp
 102:	5d                   	pop    %ebp
 103:	c3                   	ret    
 104:	8d b6 00 00 00 00    	lea    0x0(%esi),%esi
 10a:	8d bf 00 00 00 00    	lea    0x0(%edi),%edi

00000110 <_IO_new_fopen>:
 110:	55                   	push   %ebp
 111:	89 e5                	mov    %esp,%ebp
 113:	83 ec 0c             	sub    $0xc,%esp
 116:	8b 45 0c             	mov    0xc(%ebp),%eax
 119:	c7 44 24 08 01 00 00 	movl   $0x1,0x8(%esp)
 120:	00 
 121:	89 44 24 04          	mov    %eax,0x4(%esp)
 125:	8b 45 08             	mov    0x8(%ebp),%eax
 128:	89 04 24             	mov    %eax,(%esp)
 12b:	e8 fc ff ff ff       	call   12c <_IO_new_fopen+0x1c>
 130:	c9                   	leave  
 131:	c3                   	ret
По поводу символов, начинающихся на знак подчерка. По соглашениям (это вроде бы в стандарте прописано) символы, начинающиеся с подчерка зарезервированы для системных нужд и пользователь невправе создавать в своём приложении глобалы с именами, начинающимися на подчерк. Это гарантирует, что наличие нестандартных глобальных имён в библиотеке не будет конфликтовать с пользовательскими именами

Добавлено через 1 минуту 58 секунд
Не, с дизассемблером лажа, там использование внешних имён не подставляется. Так что вычислять надо, как я указал выше - по двум дампам "readelf -s" и "readelf -r"
1
niXman
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.08.2009, 22:45  [ТС] #14
Спасибо
Буду пробовать.

Добавлено через 1 час 26 минут 23 секунды
Читерский запуск файла
$ export LD_PRELOAD=`pwd`/libshaman.so
$ ./a.out
При экспортировании LD_PRELOAD, функции из этой библиотеки будут использовать все вновь запущенные процессы этого пользователя? Не хотелось бы...
0
Evg
Эксперт CАвтор FAQ
18258 / 6383 / 440
Регистрация: 30.03.2009
Сообщений: 17,666
Записей в блоге: 28
10.08.2009, 23:09 #15
Если нужно только для одного процесса, то пишется так:

$ LD_PRELOAD=`pwd`/libshaman.so ./a.out

Или тебе нужно это втихаря делать?
0
10.08.2009, 23:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2009, 23:09
Привет! Вот еще темы с ответами:

Насколько хорошо компилятор производит оптимизацию часто вызываемых функций? - 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
Здравствуйте! Во время онлайн-игры появилась задачка, которую хотелось бы поковырять на досуге. Суть такова. У меня есть...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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