2010-02-07 4 views
2

Если у меня есть целое число, как это в нескольких местах в моем коде ...C: Сокрытие целого

int my_secret = 42; 

... можно ли сделать его более трудно найти, что число в скомпилированной программе ? Я видел, как это делалось со строками, например, сдвигая каждую букву символами x, а затем не меняя их во время выполнения, но я сомневаюсь, что этот метод будет хорошо работать с числами.

+2

как сильно вы защищаете это целое число и от кого вы его защищаете? –

+8

Обычно я предлагаю что-то вроде XORing с 42, но я думаю, что в этом случае это может быть лишним. – Hasturkun

+0

Мне не нужно, чтобы он был очень безопасным, достаточно, чтобы остановить случайного пирата. – igul222

ответ

2

Вы можете сделать это, разделив это значение между двумя переменными. Например, как это:

volatile int my_secret_1 = 20; 
volatile int my_secret_2 = 22; 

, а затем использовать my_secret_1 + my_secret_2 вместо my_secret.

Требуется ключевое слово volatile, потому что большинство (если не все) компиляторов c оптимизируют его в противном случае. В любом случае лучше видеть, какой код ассемблера создается компилятором.

+0

так ... volatile int secret_1 = 13; volatile int secret_2 = 29; int my_secret = secret_1 + secret_2; ... правый? – igul222

+0

Это правильно. Вы можете сделать int my_secret = secret_1 + secret_2; или вы можете просто определить макрос для my_secret, поэтому он заменяется secret_1 + secret_2. – Max

14

Это никогда не работает. Секретные ключи никогда не должны быть в коде. Создание их во время работы. Обфускация, несомненно, вызывает соблазн провидения.

+0

+1. Согласен. Кроме того, в любом случае определенный реверсивный инженер будет работать. – 2010-02-07 16:43:29

+0

«Создание их во время работы». Не могли бы вы прояснить ситуацию? Я понимаю, что обфускация - это плохое долгосрочное решение, но мне просто нужно это, чтобы немного замедлить процесс взлома. – igul222

+3

Хотя я согласен с тем, что обфускация почти по определению не делает невозможным обнаружить что-то о исходном коде, но только делает процесс более сложным ... возможно, OP не требует 100% безопасного решения, и обфускации будет достаточно , В этом случае может произойти вычисление значения для 'my_secret' посредством некоторого вычисления. – stakx

3

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

Конечно, проблема в том, что ни один из этих типов вещей не остановит определенного человека.

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

Таким образом, короткий ответ не беспокоит, что он достаточно запутан для случайного использования.

2

Исходный вопрос в комментарии Хассана является критическим. Это зависит от того, что вы держите в секрете, и почему, насколько много работы - стоит. Вообще говоря, скрывать что-то от кого-то, кто использует программу, которая (в какой-то момент) ставит эти ценности вместе, невозможно сделать навсегда. Однако вы можете сделать это сложнее для злоумышленника.

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

Итак, как секрет, вы хотите, чтобы ваш секрет и сколько работы вы хотели бы попытаться сохранить так?

0

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

Ваш лучший выбор - использовать некоторый автообфускатор, чтобы запутать всю рутину/программу.

1

Как использовать тот комплемент

int secret = ~42; 
printf("%0X %0x" , secret , ~secret); 

отпечатки

FFFFFFD5 42 

EDIT: Или используя макрос

#define OBFUSCATE(X) (~(X)^0xdeadbeef) 

int secret = OBFUSCATE(42); 
printf("%0X %d" , secret ,OBFUSCATE(secret)); 

2152413A 42 
+1

Теперь все, что вам нужно сделать, это найти способ скрыть «0xdeadbeef» от посторонних глаз – Hasturkun

+0

+1 для жизни и т. Д. Я думаю, что у 0xcafebabe та же проблема. :-) – trashgod

+0

, и это будет 42 в скомпилированном двоичном файле благодаря оптимизатору;) –

2

Там нет никакого способа, чтобы полностью скрыть такие секреты от определенных нападающих , но есть способы поднять планку (которая иногда может служить как сдерживающим фактором, так и временной мерой).

Самый простой способ сделать это - применять одноразовые прокладки, такие как XOR.

int pad = 322; 
int secret = 360; 
int value = pad^secret; // This is 42 

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

Обратите внимание, что, хотя это затрудняет для злоумышленников вывод ключа, просматривая скомпилированный код, они все равно могут прикреплять отладчик к выполняемому процессу и вытаскивать вычисленный ключ из памяти. На самом деле есть отладчики (такие как IDA pro), которые делают такие вещи почти тривиальными.

Вам также нужно беспокоиться о том, что ОС выгружает ваш ключ на диск после его вычисления, который можно извлечь довольно тривиально. (Использование чего-то типа mlock() для блокировки страниц в памяти может помочь вам в этом.)

Во всяком случае, это очень сложная проблема, с которой многие разработчики программного обеспечения борются с тем, чтобы реализовать неинтрузивные (например, без проверки ключей сети).

+2

Это не сработает, потому что компилятор оптимизирует 360^322 и заменит его на 42. Таким образом, приложение может быть взломанным путем поиска значение 42 в двоичном формате. И это то, что igul222 пытается избежать. – Max

+0

@Max Это правильно (я не собирался оставлять литералы там). Тем не менее, мой основной момент заключается в том, что вы можете запустить ключ по целому ряду криптографических преобразований (простейшим из которых является XOR), чтобы увеличить обфускацию. – 0xfe

2

Я слышал о людях, использующих самомодифицирующийся код для обфускации. Как говорили другие, кто-то определил достаточно, он все равно может взломать его, но это делает жизнь более жесткой для потенциального злоумышленника, если они даже не смогут увидеть окончательный код в разобранном виде или установить в нем контрольные точки. (Установка точки останова заключается в замене байта памяти на команду INT 3, если эта память будет изменена как часть операции самомодифицирующего кода, точка останова исчезнет, ​​возможно, повредит там инструкции и приведет к еще большему удовольствию.)

По-прежнему можно выполнить одноэтапный код в отладчике. Чтобы частично противодействовать этому, вы можете иногда протестировать IsDebuggerPresent() и привести атакующего к дикой охоте на гусей, если это так. Конечно, это тоже можно противодействовать, например. путем дублирования DLL или даже при необходимости создания драйвера устройства низкого уровня.

+2

Это слишком сложно и потребует много работы. BTW вы можете установить аппаратную точку останова, которая не изменяет никаких байтов в программе. Или даже то, что OllyDbg называет Memory Breakpoint, которое является трюком эмуляции точки останова, изменяя права доступа к странице памяти. В любом случае, я думаю, что плакат хотел очень простой вещи. – Max

+0

Я согласен, что это, наверное, слишком много, подумал, что я упомянул об этом для полноты, потому что в нескольких ответах говорится, что легко демонтировать обфускации посредством разборки. Идея состоит в том, чтобы заставить злоумышленника сделать гораздо больше работы, чем вы. Хорошая мысль об аппаратных отладочных регистрах BTW. –