3

我正在尝试使用 LD_PRELOAD。

原版.cpp

void myPuts() {  
    puts ("Hello myPuts");  
}  
int main() {  
    myPuts();  
    return 0;  
}

黑客攻击.cpp

void myPuts() {  
    std::cout >> "Hello hacked myPuts";  
}

我编译 original.cpp:

g++ original.cpp

和 hacked.cpp:

g++ -shared -fPIC hacked.cpp

我尝试:

LD_PRELOAD=./hacked.so ./original.out

应该看到字符串“Hello hacked myPuts”,由“Hello myPuts”出现。(如果我尝试“覆盖” puts 函数,它可以正常工作)

我错过了什么?

4

2 回答 2

6

来自 man ld.so

LD_PRELOAD

以空格分隔的其他用户指定的 ELF 共享库列表,这些库要在所有其他共享库之前加载。这可用于选择性地覆盖其他共享库中的函数。

如果 myPuts 在链接到主应用程序的共享库中,它将起作用,但当 myPuts 存在于应用程序中并且未在外部库中解析时则不会。

于 2011-02-03T10:17:19.350 回答
3

你应该有:

主文件

int main() {  
    myPuts();  
    return 0;  
}

原版.cpp

void myPuts() {  
    puts ("Hello myPuts");  
}  

黑客攻击.cpp

void myPuts() {  
    std::cout << "Hello hacked myPuts";  
}

全部编译:

g++ -shared -fPIC original.cpp -o liboriginal.so
g++ -shared -fPIC hacked.cpp -o libhacked.so
g++ main.cpp -loriginal -o main.out

并使用:

LD_PRELOAD=./libhacked.so ./main.out
于 2011-02-03T10:19:32.787 回答