Я не уверен насчет AIX, но я сделал это на Linux.
В Linux таблица системных вызовов содержится в массиве sys_call_table
.
Нам нужно сначала узнать адрес этой таблицы. Теперь это сложная вещь, и есть несколько способов сделать это.
Мы можем найти его адрес, посмотрев файл sysmap:
punb200m2labs08vm1:/ # cat /boot/System.map-4.4.21-69-default | grep sys_call_table
ffffffff81600180 R sys_call_table
Следовательно, ffffffff81600180
- это адрес sys_call_table
на моей машине.
В вашем модуле ядра вы можете просто изменить функцию по умолчанию, соответствующую определенному номеру системного вызова (который вы меняете), и назначить ее для своей собственной функции.
например. Предположим, вы хотите перехватить «открытый» системный вызов с номером __NR_open
в Linux. После того, как вы получите адрес sys_call_table сверху, просто назначьте свою функцию на index __NR_open
из sys_call_table
:
sys_call_table[__NR_open] = your_function;
где your_function
реализован вами для перехвата «открытого» системного вызова.
С этого момента каждый открытый системный вызов будет проходить через эту функцию.
Детали в AIX могут отличаться, но общая идея, похоже, будет аналогичной. Вам просто нужно узнать конкретную процедуру AIX для достижения этой цели.