Можем ли мы зашифровать порядок объявления в C или C ++?

Существует ли метод / плагин / аддон, чтобы игнорировать следующее предложение (для некоторых компиляторов c / c ++)? Чтобы изменить порядок объявления членов в структуре на том же этапе, что и препроцессор или аналогичный? Возможно, добавив ключевое слово типа volatile или что-то похожее на начало объявления структуры.

Я думал: опция компилятора, встроенное ключевое слово или метод программирования.

C99 §6.7.2.1 пункт 13 гласит:

Внутри объекта структуры
члены без битовых полей и единицы в
какие битовые поля имеют адреса
это увеличение в порядке, в котором
они объявлены.

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

Почему я спрашиваю?

Мне было любопытно посмотреть, как создавались программные боты. Я наблюдал, как некоторые люди анализируют смещения памяти на предмет изменений во время работы программы, для которой будет создан хак.

Кажется, процесс таков: наблюдайте за смещениями памяти и запишите цель для данных смещений. Позднее хакерские программы будут вводить нужные значения в память с такими смещениями.

Теперь предположим, что эти смещения памяти меняются каждый раз при компиляции программы. Может быть, это будет мешать или отговаривать людей, чтобы они нашли время, чтобы понять что-то, что вы предпочли бы, они не знают

4

Решение

Фоксинг во время выполнения — лучший способ, тогда вам нужно выпустить только одну версию. Где struct имеет несколько полей одного типа, вместо этого вы можете использовать массив. Шаг 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]];

Другой способ попытаться обмануть хакера состоит в том, чтобы включить переменные отговорки, которые ведут себя так, как будто они имеют к этому какое-то отношение, но заставляют программу завершиться, если вмешиваются. Наконец, вы можете сохранить какую-то контрольную сумму или зашифрованную копию ключевых переменных, чтобы проверить, не были ли они подделаны.

1

Другие решения

Ваше намерение хорошо, но решение не (извините). Обычно вы не можете перекомпилировать вашу программу перед каждым запуском. Злоумышленник взломает проверенную программу. Тем не менее, есть решение под названием ASLR. Операционная система может изменить адрес загрузки для вас, что затруднит «возвратно-ориентированное программирование» и «возврат к libc как хаки».

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector