【发布时间】:2015-01-27 11:19:32
【问题描述】:
是否有方法/插件/插件可以忽略以下子句(对于某些 c/c++ 编译器)?在与预处理器或类似阶段相同的阶段重新排序结构中的成员声明?或许可以在结构声明的前面添加一个关键字,比如 volatile 或类似的东西。
我在想:编译器选项、内置关键字或编程方法。
C99 §6.7.2.1 clause 13 states:
在结构对象中, 非位域成员和单元 哪些位域驻留有地址 增加的顺序 它们被声明了。
C++ 似乎也有类似的子句,我对此也很感兴趣。这两个子句都指定了一个合理的特征,即在以后的声明中具有更大的内存偏移量。但是,出于接口目的或其他目的,我通常不需要知道我的结构的声明顺序。写一些代码就好了:
scrambled struct foo {
int a;
int bar;
};
或者,假设这个结构的顺序并不重要。
scrambled struct foo {
int bar;
int a;
};
因此,每次编译时都会随机交换a 和b 的声明。我相信这也适用于留出堆栈内存。
main() {
scrambled int a;
scrambled int foo;
scrambled int bar;
..
我为什么要问?
我很好奇程序机器人是如何创建的。我看到一些人在运行将要创建 hack 的程序时分析内存偏移量的变化。
似乎过程是:观察内存偏移量并记下给定偏移量的用途。稍后,hack 程序会在这些偏移处将所需的值注入内存。
现在假设每次编译程序时这些内存偏移都会改变。也许它会阻碍或劝阻人们花时间去理解你希望他们不知道的事情。
【问题讨论】:
-
为什么不自己重新排序结构等?而某人在他/她自己的计算机上做什么,而不影响其他任何事情,这与您无关。别理他们。如果它可能伤害(等)其他人,无论如何你都需要额外的安全措施,比变量重新排序更好。
-
可以想象一个扩展,但出于性能原因:它允许成员对齐,成员之间的填充最小。我所知道的任何编译器都没有这样的扩展。
-
@deviantfan 他们可以这样做,只有当他们期望该行为在他们下载的版本之间持续存在时才会影响他们。
-
@ouah 填充可以持续存在,因为我正在考虑在类似预处理器的阶段会重新排序的东西。
-
@Leonardo 如果他们破坏了他们的程序设置或其他什么,这是他们自己的错。我不会太担心这一点。 (如果有人通过更改内存位置来做事,他/她也应该找到剩余的注册表项等)