内部应用程序串编码

时间:2015-11-27 03:56:05

标签: c++ algorithm

我有一个不寻常的问题需要解决。如何防止使用hexedit / disasm读取应用程序字符串?是否可以编写一些字符串代理类?我不想刻苦地加密它,只是防止简单的替换。

1 个答案:

答案 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。

希望这会给你一些想法:虽然我不会过分复杂...