Ответ 1
Нет, но есть вещи, которые вы можете сделать, чтобы сделать это сложнее.
Сохраняйте пароль как серию цифр, делайте некоторые расчеты на них, чтобы генерировать фактический пароль, хранить части пароля в таких ресурсах, как значки и т.д.
... чтобы просмотр разборки не сразу отображал пароль (объявлялся как статическая переменная). В качестве примера представьте себе программу, в которую есть прикрепленный файл zip, который он должен открыть для активов, но недоступен для любопытных глаз.
Я знаю, что невозможно полностью скрыть или защитить этот почтовый ящик, но мне любопытно, какие средства доступны, по крайней мере, для того, чтобы удержать случайного snooper.
Спасибо!
Нет, но есть вещи, которые вы можете сделать, чтобы сделать это сложнее.
Сохраняйте пароль как серию цифр, делайте некоторые расчеты на них, чтобы генерировать фактический пароль, хранить части пароля в таких ресурсах, как значки и т.д.
Если ваша программа является программой Windows, просто используйте "Эта программа не может быть запущена в режиме DOS". как пароль. Эта строка находится почти в каждом исполняемом файле Windows.
Я только наполовину шучу, потому что он, вероятно, почти такой же безопасный, как XOR-ввод пароля с ключом, который находится в другом месте программы, и там будет довольно много нулевых головных болей, поддерживающих его.
Короче говоря, нет, любой взломщик просто установил точку останова для функции, которая открывает zip файл, и получите там пароль из памяти.
Вместо фактического хранения пароля зашифрованная версия XOR пароля является статической. Когда вам нужно его использовать, вы просто применяете простое дешифрование XOR для получения фактического пароля.
Одним из решений будет xor статический пароль с другой константой или даже с другой строкой. Это расширит ваш пароль из-за того, что многие части необходимо объединить, чтобы вернуть их. Строки на скомпилированном двоичном файле не показывают строку pw.
#include <stdio.h>
char pw[8] = {124, 109, 127, 127, 123, 99, 126, 104};
int main(int argc, char** argv) {
for (int i = 0; i < 8; i++) {
pw[i] = pw[i] ^ 12;
}
printf("%s\n", pw); // => 'password'
}
Существует несколько способов защиты данных от случайной проверки, определенный противник - это совсем другое дело (просто попросите людей сделать DRM.)
Вы можете использовать пароль с другим паролем, полученным из некоторых данных вашей программы, например относительную позицию поля (в упакованной структуре/классе) относительно начала структуры/класса или, возможно, использовать некоторые "постоянные" данные (текущее столетие и тысячелетие являются довольно постоянными, в течение следующих 89 лет:-)) или преобразование некоторых символов из одной кодовой страницы в другую или, возможно, преобразование некоторых чисел в плавающие или двойные (возможно, даже некоторые простые деления, такие как 2/3, 3/5, 5/7 в двойном использовании в качестве пароля. Обязательно "вынудите" компилятор не оптимизировать их (возможно, выведите число из других "измеримых" вещей, например, длину некоторых строки)). Особенно первый из них, вероятно, проще всего спрятать: довольно часто "мерить" относительное положение поля. Ни один из этих методов не выдержит 5 минут хакера... Они будут защищать только от "случайного отслеживания с помощью шестнадцатеричного редактора".
Ну зачем вообще хранить его? Почему у вас нет второго упакованного приложения, в котором ваши первые шифровки основаны на алгоритме xor? Таким образом, нет необходимости хранить пароль вообще!
Конечно, этот метод немного сложнее, но я бы сказал, что вам очень полезно не только использовать этот метод, но и изучить необходимые вещи, необходимые для его работы.
Покажите изображение с другим курсором курсивом для пользователя и вставьте текстовое поле, в котором пользователь может ввести код, написанный на картинке. XOR пароль ZIP файла с кодом на картинке. Результат может быть реализован жестко. Программа должна XOR жестко закодированный код с вводом пользователя для получения кода ZIP файла. Необязательно, вы можете проверить введенный код с помощью другого однонаправленного кода.
обфускать пароль с помощью perl script. Хакеры могут по-прежнему обрабатывать ваш машинный код... но по крайней мере ваш пароль не является очевидным из шестнадцатеричного редактора.
obfuscate_password("my_password434");
sub obfuscate_password($) {
my $string = shift;
my @c = split(//, $string);
push(@c, "skip"); # Skip Null Terminator
# using memset to clear this byte
# Add Decoy Characters
for($i=0; $i < 100; $i++) {
$ch = rand(255);
next if ($ch == 0);
push(@c, chr($ch));
}
my $count1 = @c;
print " int x1, x2, x3, x4, x5;\n";
print " char password[$count1];\n";
print " memset(password, 0, $count1);\n";
my $count2 = 0;
my %dict = ();
while(1) {
my $x = int(rand($count1));
$y = obfuscate_expr($count1, $x);
next if (defined($dict{$x}));
$dict{$x} = 1;
last if ($count2+1 == $count1);
if ($c[$x] ne "skip") {
#print " $y\n";
print " $y password[x4] = (char)" . ord($c[$x]) . ";\n";
}
$count2++;
}
}
sub obfuscate_expr($$) {
my $count = shift;
my $target = shift;
#return $target;
while(1) {
my $a = int(rand($count*2));
my $b = int(rand($count*2));
my $c = int(rand($count*2));
next if (($a == 0) || ($b == 0) || ($c == 0));
my $y = $a - $b;
#print "$target: $y : $a - $b\n";
if ($y == $target) {
#return "$a - $b + $c";
return "x1=$a; x2=$b; x3=$c; x4=x1-x2+x3; x5= +=x4;";
}
}
}