Không thể vì bảng gọi hệ thống (được gọi sys_call_table
) là một mảng kích thước tĩnh. Và kích thước của nó được xác định tại thời điểm biên dịch bằng số lượng tòa nhà cao tầng đã đăng ký. Điều này có nghĩa là không có không gian cho người khác.
Bạn có thể kiểm tra việc thực hiện ví dụ cho kiến trúc x86 trong arch/x86/kernel/syscall_64.c
tệp, nơi sys_call_table
được xác định. Kích thước của nó là chính xác __NR_syscall_max+1
. __NR_syscall_max
được định nghĩa arch/x86/kernel/asm-offsets_64.c
là sizeof(syscalls) - 1
(đó là số tòa nhà cuối cùng), trong đó syscall
có một bảng với tất cả các tòa nhà.
Một giải pháp khả thi là sử dụng lại một số hiện có (hoặc không dùng nữa nếu kiến trúc của bạn có một, sys_setaltroot
ví dụ) xem số nhà chọc trời với bạn vì điều này sẽ không cần thêm dung lượng trong bộ nhớ. Một số kiến trúc cũng có thể có lỗ hổng trong bảng tòa nhà (như phiên bản 64 bit của x86), do đó bạn cũng có thể sử dụng điều này.
Bạn có thể sử dụng kỹ thuật này nếu bạn đang phát triển tòa nhà mới và chỉ muốn tránh khởi động lại trong khi thử nghiệm. Bạn sẽ phải xác định cuộc gọi hệ thống mới của mình, tìm mục hiện có trong bảng tòa nhà và sau đó thay thế nó từ mô-đun của bạn.
Làm điều này từ mô-đun hạt nhân không phải là nhỏ vì kernel không xuất sys_call_table
sang các mô-đun như phiên bản 2.6 (phiên bản kernel cuối cùng có biểu tượng này được xuất 2.5.41
).
Một cách để giải quyết vấn đề này là thay đổi kernel của bạn để xuất sys_call_table
biểu tượng sang các mô-đun. Để làm điều này, bạn phải thêm hai dòng sau vào kernel/kallsyms.c
( không làm điều này trên các máy sản xuất ):
extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);
Một kỹ thuật khác là tìm bảng năng động. Bạn lặp lại bộ nhớ kernel, so sánh từng từ với một con trỏ với chức năng gọi hệ thống đã biết. Vì bạn biết phần bù của tòa nhà biết này trong bảng, bạn có thể tính địa chỉ bắt đầu của bảng.