我有一个不寻常的问题需要解决。如何防止使用hexedit / disasm读取应用程序字符串?是否可以编写一些字符串代理类?我不想刻苦地加密它,只是防止简单的替换。
答案 0 :(得分:0)
你还没有说过你的构建系统,但我建议如下:
首先,编写一个包含对strings.list
的文件((STRING_NAME, STRING_CONTENTS)
?)。任何语法,但使其易于解析。也许只是Python代码?
接下来,编写一个读取此文件并生成C ++标头的脚本。假设您的加密" scheme是将字符串写成deinterleaved,因此所有奇数字符位置都存储在一个地方,所有的evens都存储在另一个地方。然后你的脚本可能包含类似
的内容names = []
for line in file:
(name, str) = eval(line)
odds = calculate_odd_chars(str)
evens = calculate_even_chars(str)
print('const char {}_ODDS[] = {!r};'.format(name, odds))
print('const char {}_EVENS[] = {!r};'.format(name, evens))
print('char {}[] = "{}";'.format(name, '\\0' * (len(odds) + len(evens)));
names.append(name)
跟踪名称,然后在脚本的末尾生成如下所示的表:
size_t num_mangled_strings = 10;
const char * mangled_pieces [] = { NAME0_ODDS, NAME0_EVENS, /* ... */ };
const char * unmangled_strings [] = { NAME0, /* ... */ };
这些都可以在一些标题(app_strings.h
?)中结束,并且您希望将其投射到您的构建系统中,以便在您编辑strings.list
时重新生成它。您现在已经在运行时获得了足够的信息来重建所有内容。
编写一些在程序开始时运行的C或C ++代码。这应该迭代mangled_pieces
(两个)和unmangled_strings
和"解密"你的数据。请注意,我通过在上面的初始化程序中填充\ 0字符来确保目标缓冲区足够大。使用\ 0应该有希望确保以bss结束而不是初始化数据。如果空间紧张,你可能会对工会做更多的事情(因为,当然,源和目标数据的大小相同)。
一旦该代码运行,您可以在任何使用字符串常量的地方传递其中一个字符串名称。在运行时,这将指向正确的数据,但应用程序二进制文件将以某种方式破坏它。
请注意,如果您对printf
格式字符串使用此技巧,编译器可能会抱怨,因为他们只是看到您将一些随机字符缓冲区作为printf
格式传递:总是一件可疑的事情......但是如果您正在编写C ++,那么这并不重要,因为我猜您正在使用iostream。
希望这会给你一些想法:虽然我不会过分复杂...