Bạn có thể xem các biến môi trường được chuyển đến chương trình của mình bằng cách sử dụng lệnh printenv
. Một cách mà chương trình có thể xem xét môi trường của họ là sử dụng cuộc gọi getenv
, vì vậy bạn có thể sử dụng chương trình truy tìm hoặc mẹo LD_PRELOAD
để kết thúc cuộc gọi đó và tìm ra những gì họ đang tìm kiếm.
Tuy nhiên, không phải tất cả các chương trình đều sử dụng getenv
để xem môi trường của chúng. Nếu chương trình sử dụng sau định dạng (không phổ biến) cho chính, nó có thể nhìn vào các biến môi trường thông qua con trỏ envp
:
int main(int argc, char *argv[], char *envp[]) {
/* ... */
}
Ngoài ra, chương trình có thể được tiếp cận với môi trường thông qua các biến environ
.
Có thể bạn sẽ có may mắn bằng cách truy tìm các cuộc gọi getenv, nhưng nó không đảm bảo --- nó khác nhau tùy theo chương trình.
Nguồn
2011-12-13 18:52:21
Một cái gì đó như thế này có vẻ là con đường để đi, nhưng có một vấn đề: Không có cuộc gọi đến getenv, nhưng tôi biết chắc chắn rằng một biến môi trường được truy cập (trong một cuộc gọi thư viện). Tuy nhiên, bằng cách sử dụng strace tôi nhận được "execve ("/usr/bin/xprintidle ", [" xprintidle "], [/ * 41 vars * /])" là cuộc gọi đầu tiên. Điều đó có nghĩa là, các biến không được tìm nạp thông qua getenv? – Jost
Không - 'execve()' luôn là cách các chương trình được thực thi ('execl()' và bạn bè chỉ là trình bao bọc), và đối số thứ ba của nó là một mảng con trỏ của tất cả các biến môi trường. Bạn sẽ thấy cuộc gọi này trong mỗi và mọi strace của một chương trình thực hiện. – fge
Tôi đã đề cập ** ltrace ** not * strace *; Chúng không giống nhau! –