簡體   English   中英

如何用共享庫替換可執行 C++ 程序的函數?

[英]How to replace a function of an executable C++ program by a shared library?

我想實現一個共享庫 ( change_func1 ) 來替換 !!! 中的一個函數 ( func1() ) EXECUTABLE !!!,這樣打印出另一個文本(例如“Hello Universe!”)而不是“Hello World!”。

到目前為止,這是我的源代碼:

change_func1.hpp

#ifndef _CHANGE_FUNC1_HPP
#define _CHANGE_FUNC1_HPP

#include <stdint.h>
#include <sys/mman.h>
#include <iostream>

namespace change_func1
{
    void func1(void);

    void hijack_func1(void);
}

#endif /* _CHANGE_FUNC1_HPP */

change_func1.cpp

#include "change_func1.hpp"

namespace change_func1
{
    void func1(void)
    {
        std::cout << "Hello Universe!" << std::endl;
    }

    void hijack_func1(void)
    {
        // ...
    }
}

主程序

#include <iostream>

#include "change_func1.hpp"

void func1(void)
{
    std::cout << "Hello World!" << std::endl;
}

int main(void)
{
    change_func1::hijack_func1();

    func1();

    return 0;
}

以下是 g++ 編譯器的說明:

g++ -Wall -Wextra -shared -fPIC change_func1.cpp -o change_func1.so -ldl
g++ -Wall -Wextra -c main.cpp
g++ -o main main.o change_func1.so -ldl

使用以下命令,主可執行文件中的函數func1()被另一個打印出“Hello Universe!”的函數替換。

$ LD_LIBRARY_PATH=. LD_PRELOAD=$PWD/change_func1.so ./main
Hello Universe!

將可執行文件中的函數替換為具有共享庫的另一個函數以便打印出另一個文本的最佳和最簡單的方法是什么?

我的機器有 Linux x86。

我希望有人能幫助我解決我的問題。

不幸的是,主可執行文件中定義的符號優於所有其他定義(包括來自LD_PRELOAD定義)。 因此,您將無法通過LD_PRELOAD攔截可執行文件中的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM