Giới hạn các thư viện hệ thống mà một chương trình có thể sử dụng


2

Tôi có một chương trình chạy trên Linux. Chương trình gặp sự cố nếu một thư viện cụ thể tồn tại trên hệ thống nhưng chạy bình thường nếu không có thư viện. (Nó dường như chỉ tìm kiếm thư viện trong lần chạy đầu tiên, nhưng không quan tâm nếu nó không thể tìm thấy nó. Nếu thư viện có mặt trong các lần chạy tiếp theo, chương trình dường như bỏ qua nó.)

Tôi muốn giới hạn các thư viện mà chương trình có thể sử dụng trong thời gian chạy. Làm thế nào tôi có thể đạt được điều này?

Những hạn chế và khả năng :

  • Tôi không thể sửa đổi chương trình.
  • Tôi không thể nâng cấp hoặc thay đổi các thư viện hiện có trên hệ thống.
  • Tôi có thể gói chương trình trong một kịch bản shell hoặc gọi nó từ chương trình của riêng tôi.

Chỉnh sửa: Đây là một dẫn xuất sửa đổi của Firefox không được công khai. Thật vậy, như Faheem Mitha nghi ngờ, dường như nó đang tạo ra một cái gì đó trong hồ sơ người dùng. Tôi không chắc nó là gì vào lúc này.


1
"Nếu thư viện có mặt trong các lần chạy tiếp theo, chương trình dường như bỏ qua nó." Điều đó có nghĩa là nó đã lưu một thiết lập ở đâu đó. Tôi đề nghị bạn tìm kiếm cho các thiết lập đó. Các vị trí Unix cổ điển cho thông tin cấu hình bao gồm tệp hoặc thư mục ~ / .prognamerc`.
Faheem Mitha

Nó có thể hữu ích nếu bạn có thể đặt tên chương trình trong câu hỏi.
forapes

Câu trả lời:



2

Cho rằng chương trình ghi nhớ có nên sử dụng thư viện giữa các lần chạy hay không, nó phải lưu trữ thông tin này trong một tệp cấu hình ở đâu đó. Theo đề xuất của Faheem Mitha, cách tốt nhất của bạn là tìm tệp cấu hình đó và tạo nó trước khi chạy chương trình.

Chạy chương trình stracesẽ cho bạn biết những gì nó tải tập tin:

strace -o myprogram.strace -e open,access myprogram

Nếu bạn cần thay đổi cách chương trình hoạt động, thì tình huống này yêu cầu LD_PRELOAD. Bạn sẽ cần tìm thư viện nào gọi (không phải gọi hệ thống!) Chương trình thực hiện để xác định xem có tải tệp không. Các ltracelệnh có thể giúp đỡ. Ví dụ, nếu chương trình gọi dlopen, ghi đè dlopenhàm để trả về lỗi nếu chương trình cố mở thư viện cụ thể đó. Cảnh báo: mã chưa được kiểm tra.

#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int dlopen(const char *filename, int flags) {
    int (*original_dlopen)(const char *, int) = dlsym(RTLD_NEXT, "dlopen");
    if (!strcmp(filename, PATH_TO_HIDE)) {
        return NULL;
    }
    return original_fopen(path, mode);
}

Biên dịch với

gcc -DPATH_TO_HIDE='"libfoo.so"' -O -Wall -fPIC -shared -o hide_libfoo.so hide_library.c -dl

Chạy chương trình như sau:

LD_PRELOAD=./hide_libfoo.so ./myprogram
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.