2010-03-07 26 views
15

Có cách nào để thêm một cuộc gọi hệ thống động, chẳng hạn như thông qua một mô-đun không? Tôi đã tìm thấy những nơi mà tôi có thể ghi đè cuộc gọi hệ thống hiện tại bằng mô-đun bằng cách chỉ thay đổi mảng sys_call_table[] để nhận hàm được ghi đè thay vì nguồn gốc khi mô-đun của tôi được cài đặt, nhưng bạn có thể thực hiện điều này bằng cuộc gọi hệ thống mới và mô-đun không?Nhân Linux - thêm hệ thống gọi tự động qua mô-đun

+0

Tôi luôn luôn nghĩ rằng việc thêm các cuộc gọi hệ thống là một Nono, nhưng đó chỉ là tin đồn. – jdizzle

+1

Có, việc thêm các cuộc gọi hệ thống là vô dụng đối với rootkit :) –

+0

Việc thêm một syscall chắc chắn không được hỗ trợ. Có thể bạn muốn có một giải pháp mới cho vấn đề của mình. Tại sao bạn cảm thấy bạn cần một syscall mới? – stsquad

Trả lời

11

Không, sys_call_table có kích thước cố định:

const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { ...

Điều tốt nhất bạn có thể làm, như bạn có thể đã phát hiện ra, là để intercept cuộc gọi hệ thống hiện có.

+1

Cảm ơn. Vâng, tôi đã quyết định đánh chặn. – Zach

0

Chặn cuộc gọi hệ thống hiện tại (để thực hiện điều gì đó trong hạt nhân) không đúng trong một số trường hợp. Ví dụ, nếu trình điều khiển không gian người dùng của bạn cần thực hiện một cái gì đó trong hạt nhân, hãy gửi một cái gì đó ở đó, hoặc đọc một cái gì đó từ hạt nhân? Thông thường cho các trình điều khiển, đúng cách là sử dụng cuộc gọi ioctl(), chỉ là một cuộc gọi hệ thống, nhưng nó có thể gọi các chức năng hạt nhân hoặc mô-đun trình điều khiển khác nhau - bằng cách truyền các tham số khác nhau thông qua ioctl().

Ở trên là để thực thi mã hạt nhân do người dùng kiểm soát.

Để truyền dữ liệu, bạn có thể sử dụng trình điều khiển procfs hoặc sysfs để nói chuyện với hạt nhân.

PS: khi bạn chặn cuộc gọi hệ thống, thường ảnh hưởng đến toàn bộ hệ điều hành, bạn phải lo lắng về cách giải quyết vấn đề làm việc đó một cách an toàn: nếu ai đó gọi nửa chừng cuộc gọi hệ thống và sau đó bạn sửa đổi/chặn mã?

6

Zach, có nó là tốt: D

Mặc dù sys_call_table có kích thước cố định, trong một số trường hợp có thể có vị trí miễn phí trong bảng

Nhìn liên kết này:
lxr.free-electron. com/nguồn/arch/x86/kernel/syscall_32.c
lxr.free-electrons.com/source/arch/x86/kernel/syscall_64.c

  • Thứ nhất kernel lấp đầy tất cả các vị trí của sys_call_table với một con trỏ đến sys_ni_syscall

  • Tại biên dịch, các tập tin asm/syscalls_32.hasm/syscalls_64.h là tạo ra dựa trên các bảng sau:

lxr.free -electrons.com/source/arch/x86/syscalls/syscall_32.tbl
lxr.free-electrons.com/source/arch/x86/syscalls/syscall_64.tbl

Với một cái nhìn ngắn gọn tại các bảng y Bạn có thể thấy rằng một số vị trí sẽ tiếp tục trỏ đến sys_ni_syscall, ví dụ: vị trí 17, 31, 32, 35, ..., trong syscall_32.tbl vì chúng không được triển khai.

Do đó, nhiệm vụ duy nhất của chúng tôi là xác định các vị trí này và "đăng ký" syscall mới của chúng tôi.

tôi đặt một cái gì đó tương tự trên git tôi
https://github.com/MrN0body/rsysadd

Các vấn đề liên quan