Tôi đang viết một công cụ. Một phần của công cụ đó sẽ là khả năng ghi lại các tham số của các cuộc gọi hệ thống. Được rồi tôi có thể sử dụng ptrace
cho mục đích đó, nhưng ptrace
thì khá chậm. Một phương pháp nhanh hơn mà tôi nghĩ đến là sửa đổi glibc. Nhưng điều này là khó khăn, như gcc kỳ diệu chèn của riêng mình được xây dựng trong các chức năng như hệ thống gọi wrappers hơn bằng cách sử dụng mã được xác định trong glibc. Sử dụng -fno-builtin
cũng không giúp ích ở đó. Vì vậy, tôi đã nghĩ ra ý tưởng viết một thư viện được chia sẻ, bao gồm mọi trình bao bọc cuộc gọi hệ thống, chẳng hạn như mmap
và sau đó thực hiện ghi nhật ký trước khi gọi hàm bao bọc cuộc gọi hệ thống thực tế. Ví dụ mã giả của những gì tôi mmap
sẽ giống như được đưa ra dưới đây.Đây có phải là cách hay để chặn cuộc gọi hệ thống không?
int mmap(...)
{
log_parameters(...);
call_original_mmap(...);
...
}
Sau đó, tôi có thể sử dụng LD_PRELOAD để tải lên thư viện này. Bạn có nghĩ ý tưởng này sẽ hoạt động không, hoặc tôi đang thiếu một cái gì đó?
Nó có thể sẽ không hoạt động đối với các tệp thực thi được liên kết tĩnh. Và nó sẽ không làm việc cho các tập tin thực thi làm syscalls mà không đi qua libc. –
Bạn có muốn chặn mỗi khi một cuộc gọi sys thực tế được thực hiện (tại mỗi 'int 0x80'), hoặc tại mỗi cuộc gọi đến một hàm xử lý thư viện? – Chris
Tôi nghĩ rằng nó có thể sẽ chậm. Đó là cơ bản chính xác những gì valgrind làm cho thiết bị của nó, và mặc dù là một công cụ rất nổi tiếng và phát triển, nó vẫn giết chết hiệu suất. Tôi nghĩ rằng nếu có một cách nhanh hơn, nó sẽ được sử dụng đã có. Tôi đoán là bạn đánh giá thấp chức năng khai thác gỗ sẽ tốn bao nhiêu, và không có cách nào xung quanh đó. – zebediah49