C++ 我们可以用C或C++;?

C++ 我们可以用C或C++;?,c++,c,memory,struct,c99,C++,C,Memory,Struct,C99,是否有一个方法/插件/插件可以忽略以下子句(对于某些c/c++编译器)?要在与预处理器相同或类似的阶段对结构中的成员声明进行重新排序?也许可以在结构声明的前面添加类似volatile或类似的关键字 我在想:编译器选项、内置关键字或编程方法 在结构对象中 非bit现场成员和中的单位 哪些位字段具有地址 按以下顺序增加: 它们已申报 C++似乎有一个类似的子句,我对此也很感兴趣。这两个子句都指定了一个合理的特性,以便在以后的声明中具有更大的内存偏移量。但是,出于接口或其他目的,我通常不需要知道结构

是否有一个方法/插件/插件可以忽略以下子句(对于某些c/c++编译器)?要在与预处理器相同或类似的阶段对结构中的成员声明进行重新排序?也许可以在结构声明的前面添加类似volatile或类似的关键字

我在想:编译器选项、内置关键字或编程方法

在结构对象中 非bit现场成员和中的单位 哪些位字段具有地址 按以下顺序增加: 它们已申报

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;
    ..

我为什么要问

我很好奇程序机器人是如何创建的。我看到一些人在运行程序时分析内存偏移量的变化,而黑客将被创建

看起来这个过程是:观察内存偏移量并记下给定偏移量的用途。稍后,黑客程序将在这些偏移处将所需的值注入内存


现在假设每次编译程序时,这些内存偏移量都会改变。也许这会阻碍或劝阻个人花时间去理解你希望他们不知道的事情。

你的意图是好的,但解决办法不是(对不起)。通常,在每次运行之前都不能重新编译程序。攻击者将侵入已检查的程序。然而,有一个解决方案,叫做。操作系统可能会为您更改加载地址,从而使“面向返回的编程”和“像libc一样返回”变得更加困难。

运行时foxing是最好的方法,然后您只需发布一个版本。如果
struct
具有多个相同类型的字段,则可以使用数组。第一步。使用数组代替包含三个
int
字段的结构

#define foo 0
#define bar 1
#define zee 2

struct abc {
    int scramble [3];
};

...
value = abc.scramble[bar];
第2步,现在使用一个索引数组,该数组在每次程序运行时都是随机的

int abcindex [3];               // index lookup 
int abcpool  [3];               // index pool for randomise

for (i=0; i<3; i++)             // initialise index pool
    abcpool[i] = i;

srand (time(NULL));
for (i=0; i<3; i++) {           // initialise lookup array
    j = rand()%(3-i);
    abcindex[i] = abcpool[j];   // allocate random index from pool
    abcpool[j] = abcpool[2-i];  // remove index from pool
    }

value = abc.scramble[abcindex[bar]];
int-abcindex[3];//索引查找
int abcpool[3];//随机索引池

对于(i=0;我为什么不自己对结构等进行重新排序?某人在他/她的ow计算机上所做的事情,而不影响其他任何事情,这不关你的事。让他们去做吧。如果这会伤害(等)其他人,无论如何,你都需要额外的安全措施,比变量重新排序好得多。可以想象一个扩展可以做到这一点,但出于性能原因:它允许成员之间以最小的填充对齐。据我所知,没有编译器有这样的扩展。@deviantfan如果他们可以这样做,它只会影响如果他们希望在下载的版本之间保持这种行为,就对他们进行ct扫描。@哎呀,填充可以保持,因为我想在预处理器阶段会重新排序。@Leonardo如果他们破坏了程序设置或其他什么,那是他们自己的错。我不会太担心这一点。(如果有人通过更改内存位置进行操作,他/她也应该找到剩余的注册表项等)如果我们说的客户端必须始终连接到服务器并在使用前进行自我更新,这难道不要求攻击者始终动态地提出解决方案吗?如果攻击者在其自己的计算机上本地运行该程序,则您已经丢失了该实例。在不受信任的计算机上没有任何东西是可信的。例如:计算机游戏没有一个是没有破解的。我明白了,所以你的意思是永远不要依赖于缺乏创造力。从我看来,破解一些简单的东西似乎严重依赖于寻找内存偏移量,而让它们改变可能会导致悲伤。我真的对一种实用的劝阻方法感兴趣,而不是制作一个气密的安全系统。谢谢,这是great input。我想知道是否有任何好的库可以以这种方式使用数组进行封装。我想最大限度地减少程序员实施这些实践所需的工作量,同时恶意用户仍然难以规避。防篡改方法将推迟一些但不是全部。熟练的恶意用户将取消对MB的访问修改程序并修补检查。