如何剥离多个符号?

逆向工程 可执行 职能 符号
2021-06-16 08:34:35

我注意到,即使从我的可执行文件中去除符号后,类名及其方法仍然包含在可执行文件的末尾。

例如:

#include <iostream>

using namespace std;

class Clingons
{
public:
    void clingForever()
    {
        cout << "Qapla" << endl;
    }
};

int main(int argc, char *argv[])
{
    Clingons cling;

    cling.clingForever();

    return 0;
}

然后编译并链接:

g++ cling.cpp -o cling

现在,当我使用十六进制编辑器查看生成的“cling”文件的底部时,我可以看到“Clingons”类名称及其方法。我也可以在调试时看到这个信息..

即使在我剥掉它们之后:

strip -x cling

我仍然可以看到相同的信息。

那么为什么当我使用上面的命令时这些信息没有被删除?除了手动,有没有办法剥离(或破坏)这些信息?

使用的 GCC 版本是 i686-apple-darwin10-llvm-g++-4.2 (GCC) 4.2.1

这只是一个例子。我的真实项目涉及 Qt 框架。

3个回答

您可能正在使用 RTTI。尝试使用 option 编译您的代码-fno-rtti

更新:这真的是 RTTI。

我不知道它究竟是如何工作的,但我成功地删除了这些字符串,如下所示:

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp
$ strip executable

(这是在https://stackoverflow.com/questions/1931626/how-to-really-strip-a-binary-in-macos 上找到的

尝试将您的程序编译为静态程序集,并使用编译器对其进行剥离。您不会在生成的可执行文件中找到任何“紧贴”引用。

$ g++ -static -s cling.cpp -o cling

$ ls -l cling*
-rwxr-x--- 1 lornix lornix 1,313,792 Jun 22 19:19 cling*
-rw-r----- 1 lornix lornix       222 Jun 22 19:16 cling.cpp

$ strings -a cling | grep -ic cling
0

工具箱ELFKicker有一个名为的实用程序sstrip,可以将 ELF 可执行文件剥离到骨骼。

但是,您似乎使用的是 Mach-O 可执行格式。因此,我建议查看源代码sstrip并构建自己的剥离器。

您还可以查看Mach-O 命令源代码strip并获得灵感。而且,这个Python 脚本strip_save_dsym也可能会给出一些提示。

最后,这里有一些 ELF 和 Mach-O 格式之间的比较: