首页 > 解决方案 > 重命名 Win32 函数以确保 C++ 上的安全性

问题描述

有没有办法使用 #define 重命名像 GetVolumeInformationW() 这样的 win32 函数?

例如: #define abc(LPCWSTR a, LPWSTR b, ...) GetVolumeInformationW(Some argumments..)

为什么要这样做?我想在 IDA 等调试器程序上隐藏函数名称,有什么方法可以做到吗?

语言:C++

标签: c++securityobfuscation

解决方案


使用它没有意义#define,因为这不会影响二进制可执行文件的内容。使用预处理器宏只会影响程序员看到的内容,但不会影响编译器或链接器看到的内容。有关C++ 预处理器如何工作及其与编译器/链接器的关系的信息,请参阅此链接。

如果您不希望函数出现在可执行文件的导入表中,则可以改为使用动态加载函数GetProcAddress。这样,当函数被调用时,反汇编器可能无法确定地址指向的函数。但是,反汇编程序将能够看到您正在使用GetProcAddress某些东西,它只是不知道是什么。使用该功能GetProcAddress可能会使试图破解您的软件的人变得可疑,因为如果您试图隐藏某些东西,这是很常见的做法。

如果您不希望字符串GetVolumeInformationW以明文形式出现在可执行文件中,则可以以某种方式对其进行加密或混淆,例如将其反向存储,然后在将其传递给GetProcAddress. 这只是一个非常简单的例子,说明了它是如何完成的。对每个具有特定密钥的字符使用 XOR(这是^C++ 中的运算符)进行加密,然后再次执行相同的操作来解密,可能是一个更好的解决方案,因为这会使加密的文本不容易识别为文本。


推荐阅读