gpt4 book ai didi

c - 如何在可执行代码中嵌入字符串?

转载 作者:太空宇宙 更新时间:2023-11-04 05:45:10 24 4
gpt4 key购买 nike

我有一个字符串文字,它用在我的可执行文件周围的许多不同地方。

让我们这样说:

const char *formatString = "Something I don't want to make obvious: %d";

int format1(char *buf) { sprintf(buf, formatString, 1); }
int format2(char *buf) { sprintf(buf, formatString, 2); }

//...

现在,这个字符串文字在可执行代码中变得非常明显,因为它是按字面嵌入的。

有没有办法通过强制编译器生成汇编指令(例如 mov [ptr + 4], 0x65)指令来创建字符串来避免这种情况,而不是嵌入字面上的字符串?

我不想做任何形式的混淆——我只是想避免在可执行文件中使字符串显而易见。 (我也不想在使用字符串的每个地方都修改我的代码。)

这可能吗?

最佳答案

为避免手动将加密的字符串粘贴到代码中,您可以创建一个标记需要混淆的字符串的宏和一个解密它们的函数:

#define OB(s) dec("START_MARK_GUID" s "\0" "END_MARK_GUID")
const char* dec(const char* s) { ... }
...
const char* s = OB("not easily readable"); // on all strings needed
const char* s = OB("either");

函数必须做两件事:

  1. 如果参数以 START_MARK_GUID 开头,只需返回原始字符串(不带 guid)。这也将允许您使用未混淆的可执行文件,例如调试时。

  2. 如果它以 ENCRYPTED_MARK_GUID 开头,则先去混淆然后返回一个新字符串。在 C 语言中,您必须在这里关心内存生命周期;在 C++ 中,您可以简单地返回 std::string()。

最后,创建一个混淆器程序,它在编译的二进制文件中查找 GUID 并加密它们之间的数据。它只有几行 Python 或类似语言。我还建议在之后修复 EXE 的 CRC,尽管我的程序即使没有它也能工作。

您可以更改具有较少唯一标识符的 guid 以节省一些空间。您还可以改进这一点,使解密只发生一次(例如,在 ENCRYPTED_MARK_GUID 中写入字符串 ID,并通过该 ID 将解密的字符串保存在字典中)。

关于c - 如何在可执行代码中嵌入字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7624635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com