Можно ли скрыть пароль, определенный в коде C ++ - PullRequest
10 голосов
/ 15 марта 2011

... так что при просмотре дизассемблирования пароль не будет сразу открыт (объявлен как статическая переменная). В качестве примера представьте себе программу, к которой прикреплен zip-файл, который она должна открывать для ресурсов, но которая недоступна для посторонних глаз.

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

Спасибо!

Ответы [ 9 ]

24 голосов
/ 15 марта 2011

Если ваша программа является программой Windows, просто используйте «Эта программа не может быть запущена в режиме DOS». как пароль. Эта строка есть почти в каждом исполняемом файле Windows.

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

12 голосов
/ 15 марта 2011

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

11 голосов
/ 15 марта 2011

Нет, но есть вещи, которые вы можете сделать, чтобы сделать это сложнее.

Сохраните пароль в виде последовательности чисел, выполните некоторые вычисления для них, чтобы сгенерировать действительный пароль, сохраните части пароля в таких ресурсах, как значки и т. Д.

6 голосов
/ 15 марта 2011

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

http://en.wikipedia.org/wiki/XOR_cipher

5 голосов
/ 15 марта 2011

Одним из решений было бы переписать статический пароль другой константой или даже другой строкой. Это распространило бы ваш пароль между тем количеством частей, которое необходимо объединить, чтобы вернуть его. Строки в скомпилированном двоичном файле не показывают строку 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.)

1 голос
/ 15 марта 2011

Вы можете переписать пароль с другим паролем, полученным из некоторых данных вашей программы, например, относительной позиции поля (в упакованной структуре / классе) относительно начала структуры / класса, или, возможно, использовать некоторые "постоянные данные (текущий век и тысячелетие довольно постоянны, в течение следующих 89 лет :-)), или преобразование некоторых символов из одной кодовой страницы в другую, или, возможно, преобразование некоторых чисел во всплывающие или двойные (возможно, даже некоторыев качестве пароля используются простые деления, такие как 2/3, 3/5, 5/7 в двойном формате. Обязательно «заставляйте» компилятор не оптимизировать их (возможно, получая число из других «измеримых» вещей, таких как длина некоторыхстроки)).Особенно первый, вероятно, легче всего скрыть: довольно часто «измеряют» относительное положение поля.Ни один из этих методов не выживет в течение 5 минут после взлома ... Они будут защищать только от «случайного слежения с помощью шестнадцатеричного редактора».

0 голосов
/ 28 марта 2016

обфусцируйте пароль скриптом perl. Хакеры все еще могут перепроектировать ваш машинный код ... но по крайней мере ваш пароль не очевиден из шестнадцатеричного редактора.

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;";
       }
    } 
}
0 голосов
/ 07 марта 2015

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

0 голосов
/ 15 марта 2011

Ну зачем вообще его хранить? Почему бы не иметь второе упакованное приложение, которое ваше первое шифрует на основе алгоритма xor? Таким образом, нет необходимости хранить пароль вообще!

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

...