c++ - 重命名 Win32 函数以确保 C++ 上的安全性
问题描述
有没有办法使用 #define 重命名像 GetVolumeInformationW() 这样的 win32 函数?
例如:
#define abc(LPCWSTR a, LPWSTR b, ...) GetVolumeInformationW(Some argumments..)
为什么要这样做?我想在 IDA 等调试器程序上隐藏函数名称,有什么方法可以做到吗?
语言:C++
解决方案
使用它没有意义#define
,因为这不会影响二进制可执行文件的内容。使用预处理器宏只会影响程序员看到的内容,但不会影响编译器或链接器看到的内容。有关C++ 预处理器如何工作及其与编译器/链接器的关系的信息,请参阅此链接。
如果您不希望函数出现在可执行文件的导入表中,则可以改为使用动态加载函数GetProcAddress
。这样,当函数被调用时,反汇编器可能无法确定地址指向的函数。但是,反汇编程序将能够看到您正在使用GetProcAddress
某些东西,它只是不知道是什么。使用该功能GetProcAddress
可能会使试图破解您的软件的人变得可疑,因为如果您试图隐藏某些东西,这是很常见的做法。
如果您不希望字符串GetVolumeInformationW
以明文形式出现在可执行文件中,则可以以某种方式对其进行加密或混淆,例如将其反向存储,然后在将其传递给GetProcAddress
. 这只是一个非常简单的例子,说明了它是如何完成的。对每个具有特定密钥的字符使用 XOR(这是^
C++ 中的运算符)进行加密,然后再次执行相同的操作来解密,可能是一个更好的解决方案,因为这会使加密的文本不容易识别为文本。
推荐阅读
- javascript - 接收错误:使用节点 js 将标头发送到客户端后无法设置标头
- java - 连接多个数据库
- grafana - Grafana 7.4.3 /var/lib/grafana 在 AWS ECS - EFS 中不可写
- c - 打印时字符串数组歌曲列表未显示在命令屏幕上
- r - 在排除标点符号的同时匹配 R 中的正则表达式
- html - HTML CSS 悬停模糊,但我不想模糊按钮
- node.js - 如何在 Node.js 中正确更新我的 Postgres 数据库?
- python - 为什么我在熊猫数据框中得到“NAN”作为计数?
- node.js - 如何从第三方电报机器人聊天中获取消息历史记录?
- python - 使用 gensim word2vec 的 2 个列表之间的单词相似度