Правильный путь , поскольку SAM записывает ранее:
reg Query "HKLM \ Hardware \ Description \ System \ CentralProcessor \ 0" / v "Идентификатор" | find / i "x86"> NUL & amp; & amp; set OS = 32BIT || установите OS = 64BIT
blockquote>, но с / v «Идентификатор» немного правильнее.
при реальной необходимости в решении, Вы могли бы интересоваться руткитом DR, который выполняет просто это, http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2 , статья об этом здесь http://www.theregister.co.uk/2008/09/04/linux_rootkit_released/
Valgrind может использоваться для прерывания любого вызова функции. Если необходимо прервать системный вызов в готовом изделии тогда, это будет бесполезно. Однако, если Вы - попытка прервать во время разработки тогда, это может быть очень полезно. Я часто использовал эту технику для прерывания хеш-функций так, чтобы я мог управлять возвращенным хешем для тестирования.
В случае, если Вы не знаете, Valgrind главным образом используется для нахождения утечек памяти и других связанных с памятью ошибок. Но базовая технология является в основном x86 эмулятором. Это эмулирует Вашу программу и прерывает вызовы к malloc/free и т.д. Хорошая вещь, Вы не должны перекомпилировать для использования ее.
Valgrind имеет функцию, которую они называют Функция, Переносящаяся , который используется для управления перехватом функций. Посмотрите раздел 3.2 из руководство Valgrind для деталей. Можно установить функцию, переносящуюся для любой функции, которую Вы любите. Как только вызов прерывается альтернативная функция, которую Вы обеспечиваете, тогда вызывается.
Почему не может Вы / не хотеть использовать прием LD_PRELOAD ?
Пример кода здесь:
/*
* File: soft_atimes.c
* Author: D.J. Capelis
*
* Compile:
* gcc -fPIC -c -o soft_atimes.o soft_atimes.c
* gcc -shared -o soft_atimes.so soft_atimes.o -ldl
*
* Use:
* LD_PRELOAD="./soft_atimes.so" command
*
* Copyright 2007 Regents of the University of California
*/
#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>
extern int errorno;
int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);
int open(const char * pathname, int flags, mode_t mode)
{
_open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
if(flags & O_CREAT)
return _open(pathname, flags | O_NOATIME, mode);
else
return _open(pathname, flags | O_NOATIME, 0);
}
int open64(const char * pathname, int flags, mode_t mode)
{
_open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
if(flags & O_CREAT)
return _open64(pathname, flags | O_NOATIME, mode);
else
return _open64(pathname, flags | O_NOATIME, 0);
}
Из того, что я понимаю..., это - в значительной степени прием LD_PRELOAD или модуль ядра. Нет большого количества второго плана, если Вы не хотите выполнить его под эмулятором, который может захватить к Вашей функции или действительно кодирует перезапись на фактическом двоичном файле для захвата к функции.
Принятие Вы не можете изменить программу, и не может (или не хотеть к), изменяют ядро, подход LD_PRELOAD является лучшим, предполагая, что Ваше приложение является довольно стандартным и не на самом деле один, это злонамеренно пытается закончить Ваш перехват. (В этом случае Вам будет нужен один из других методов.)
У меня нет синтаксиса, чтобы сделать, это корректно с LKM бесцеремонно, но этой статьей предоставляет хороший обзор того, что необходимо было бы сделать: http://www.linuxjournal.com/article/4378
Вы могли также просто исправить функцию sys_open. Это запускает на строке 1084 из file/open.c с Linux 2.6.26.
Вы могли бы также видеть, не можете ли Вы использовать inotify, systemtap или SELinux, чтобы сделать весь этот вход для Вас без Вас имеющий необходимость создать новую систему.
Если Вы просто хотите к часы , что открыто, Вы хотите посмотреть на ptrace () функция или исходный код командной строки strace утилита. Если Вы на самом деле хотите к прерывание вызов, чтобы, возможно, заставить его сделать что-то еще, я думаю опции, которые Вы перечислили - LD_PRELOAD или модуль ядра - являются Вашими единственными опциями.
Если Вы просто хотите сделать это для отладки целей, изучают strace, который создается в вершине ptrace (2) системный вызов, который позволяет Вам поднимать трубку код, когда системный вызов сделан. Посмотрите часть PTRACE_SYSCALL страницы справочника.
Некоторые приложения могут обмануть strace/ptrace для не выполнения, таким образом, единственная реальная опция, которую я имел, использует systemtap
Systemtap, может прервать набор системных вызовов в случае необходимости из-за его подстановочного соответствия. Systemtap не является C, но отдельным языком. В основном режиме systemtap должен препятствовать тому, чтобы Вы делали глупые вещи, но это также может работать в "опытном режиме", который отступает к разрешению разработчику использовать C, если это требуется.
Это не требует, чтобы Вы исправили свое ядро (Или по крайней мере не был должен), и как только модуль был скомпилирован, можно скопировать его с поля теста/разработки и вставить его (через insmod) в производственной системе.
я должен все же найти применение Linux, которое нашло способ работать вокруг/избегать того, чтобы быть пойманным systemtap.