我们可以加扰C或C ++的声明顺序吗?

列昂纳多

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

我当时在想:一个编译器选项,一个内置关键字或一种编程方法。

C99§6.7.2.1第13条规定:

在结构对象中,非位字段成员和位字段所在的单元的地址按照声明的顺序增加。

C ++似乎有一个类似的子句,对此我也很感兴趣。这两个子句都指定了一个合理的功能,以便在以后的声明中具有更大的内存偏移量。但是,出于接口目的或其他目的,我通常不需要知道我的结构的声明顺序。编写一些类似以下的代码会很好:

scrambled struct foo {
    int a;
    int bar;
};

或者,假设顺序与该结构无关紧要。

scrambled struct foo {
    int bar;
    int a;
};

因此,每次编译时都要声明ab随机交换。我相信这也适用于预留堆栈内存。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我们可以在C中的#define指令中声明变量吗?

我们可以在C中与变量一起声明一个函数吗?

我们可以在签名的APK中找到我们的C ++代码吗?

我们可以在C ++函数内部包含函数吗?

我们可以在Python中使用C代码吗?

我们可以限制C ++中的用户输入吗?

我们可以在C中实现继承吗

我可以按声明顺序对枚举的案例进行排序吗?

我们可以声明不带参数的朋友功能吗?

我们可以在类中声明密封方法吗

C ++:使用声明和指令的顺序会影响选择吗?

我们可以使用Objective-C类别来扩展C ++类吗?

当涉及数组时,我们可以安全地从C ++调用C API函数吗?

在C ++中,我们可以使用{}进行C样式转换吗?

我们可以在C ++代码中使用像coremotion这样的iOS框架吗

我们可以在 C++ 中观察对变量的读/写/对变量的读/写吗

我们可以使用c写入Word文件吗?

我们可以用C ++中的非模板类“包装”模板类吗?

我们可以在Objective-C中创建nullable / nonnull属性吗?

什么是限制指针,我们可以在C指针的号码吗?

我们可以在C ++中的类中定义哈希码方法吗

我们可以在C语言中使用指针类型转换整数值吗?

我们可以在ruby 2.7.0中安装C gem吗

我们可以在C语言中将(void *)0称为void指针吗?

C# LINQ:我们可以从 GroupBy 返回相同的实例而不是做新的吗?

Android可以发出对我们的本机C代码的调用吗?

我们可以使用 c:set 分配“空”值吗?

我们可以在C#中使用Struct作为引用类型吗?

我们可以在 C++17 中检测到“平凡的可重定位性”吗?