是否有方法/插件/插件可以忽略以下子句(对于某些c / c ++编译器)?在与预处理器或类似程序相同的阶段对结构中的成员声明进行重新排序?也许通过添加诸如volatile之类的关键字或类似于struct声明前面的关键字。
我当时在想:一个编译器选项,一个内置关键字或一种编程方法。
在结构对象中,非位字段成员和位字段所在的单元的地址按照声明的顺序增加。
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程序将以这些偏移量将所需的值注入内存。
现在假设这些内存偏移量在每次编译程序时都会更改。也许这会阻止或劝阻个人花一些时间去理解您宁愿他们不知道的东西。
运行时融合是最好的方法,那么您只需要发布一个版本即可。如果astruct
具有多个相同类型的字段,则可以改用数组。步骤1.代替具有三个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]];
试图欺骗黑客的另一种方法是包括变数变量,其行为似乎与它们有关系,但如果被篡改,则使程序退出。最后,您可以保留某种校验和或密钥变量的加密副本,以检查它们是否已被篡改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句