在编译时随机化struct成员顺序

时间:2017-10-27 23:39:30

标签: c++

这个问题其实更多是出于好奇,因为我不想亲自实现这个目标。我正在逆转并将源代码转换回主要用C ++编写的游戏。

这个游戏有很多结构用于表示实体,例如单位,等级和什么不是。现在,其中一些结构,随着它们发布的每个新补丁,都会让它们的成员完全重新安排,看起来是随机顺序。

例如,版本1.10上的给定结构将如下所示:

struct DrlgLevel
{
    int a;
    int b;
    int c;
    int d;
    int e;
};

然后在版本1.11上,相同的结构看起来像这样:

struct DrlgLevel
{
    int c;
    int a;
    int b;
    int e;
    int d;
};

使用这些结构的功能通常在版本之间没有变化,我很确定这种随机化的唯一目的是使其更难逆转,对逆向工程进行一些混淆。

所以现在,我的实际问题是,有没有办法告诉编译器这样做,或者可能是在预处理器级别,或者是他们在每个新补丁上手动执行的操作?听起来它可以很容易地为编译器完成,但我搜索并试图查看各种编译选项,但找不到任何东西。

感谢。

2 个答案:

答案 0 :(得分:3)

编译器而言,它并不是一个非常有用的功能,但它可以通过一些非常简单的预处理来完成。

首先,将其分为两个文件,一个非随机订单输入文件和包含随机订单等效项的原始文件:

randomOrder.h.in:
    int a;
    int b;
    int c;
    int d;
    int e;
<your actual file containing the structure>:
    struct DrlgLevel {
        #include "randomOrder.h"
    };

然后,在实际编译步骤之前(即,在编译使用该头文件的任何代码之前),运行一个脚本,该脚本将从randomOrder.h.in创建它:

shuf randomOrder.h.in >randomOrder.h

如果你在没有shuf的平台上,你仍然可以它,你只需找到可以完成工作的等效工具,例如Windows中的PowerShell(或sort -Rawk如果您的* nix发行版遗失shuf,原因有些奇怪)。或者您可以尝试为您的平台找到 shuf可执行文件并使用它。

但是使用的工具并不重要,事实上你可以在编译代码之前可靠地重复构造一个随机排序的字段列表。

答案 1 :(得分:0)

这是一个可怕的想法。如果您这样做,除非您从单个源文件编译所有内容,否则目标文件将如何链接?

如果你真的想要这个,你必须在每次编译之前更改包含结构定义的headder文件,如果真的需要,可以编写脚本

相关问题