2011-03-15 37 views
10

... por lo que la navegación de desmontaje no expondrá inmediatamente la contraseña (declarado como una variable estática). Como ejemplo, imagina un programa que tiene un archivo zip adjunto que debe abrir para activos, pero que no es de fácil acceso para miradas indiscretas.¿Es posible ocultar una contraseña definida en el código C++

Sé que es imposible ocultar completamente o proteger ese zip pero tengo curiosidad qué medios están disponibles para al menos mantener a raya a un fisgón casual.

Gracias!

+3

* "... disassembly no expondrá inmediatamente la contraseña (declarada como una variable estática)" * - no se supone que codifique las contraseñas en sus archivos ejecutables. Esa es una vulnerabilidad de seguridad del software. Ver [CWE-798: Uso de credenciales codificadas] (http://cwe.mitre.org/data/definitions/798.html). – jww

Respuesta

11

No, pero hay cosas que usted puede hacer para hacerlo más difícil.

almacenar la contraseña como una serie de números, hacer algunas calcualtions en ellos para generar la contraseña real, almacenar partes de la contraseña en recursos como iconos, etc.

+0

Me gusta este. Esteganografía utilizando los recursos gráficos de la aplicación. –

5

Una solución sería la función XOR la ​​contraseña estática con otra constante o incluso otra cadena. Esto extendería su contraseña entre tantas partes que necesiten combinarse para recuperarla. Una cadena en el binario compilado no muestra la cadena 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' 
} 

Hay un número de maneras de proteger los datos de una inspección superficial, un adversario determinado es harina de otro costal (sólo hay que preguntar a la gente haciendo DRM.)

6

En lugar de la tienda de contraseña real la versión cifrada XOR de la contraseña como variable estática Cuando necesite usarlo, simplemente aplique el descifrado XOR simple para recuperar la contraseña real.

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

+2

+1 ... para contener al 'casual snooper', esto es lo mejor que puedes obtener sin gastar mucho más tiempo de lo que vale. Como dijiste, es completamente imposible ocultar por completo una información que el usuario tiene en su computadora (a menos que el programa carezca de la clave de encriptación). – Damon

12

En resumen, no, habría Cualquier galleta acaba de establecer un punto de interrupción en la función que abre el archivo zip, y obtener la contraseña de la RAM allí.

0

bien por qué almacenar en absoluto? ¿Por qué no tener una segunda aplicación empaquetada que sus primeras encriptaciones se basen en un algoritmo xor? ¡De esa forma no hay necesidad de almacenar la contraseña en absoluto!

Por supuesto, este método es un poco más difícil, pero yo diría que usted se beneficia enormemente de no sólo el uso de este método, pero el aprendizaje de las cosas necesarias para hacer que funcione.

1

Puede xor la contraseña con otra contraseña derivada de algunos datos de su programa, por ejemplo, la posición relativa de un campo (en una estructura/clase empaquetada) relativa al comienzo de la estructura/clase, o tal vez usar algún datos "constantes" (el siglo y el milenio actuales son bastante constantes, para los próximos 89 años :-)), o la conversión de algunos caracteres de una página de códigos a otra, o tal vez la conversión de algunos números para flotar o duplicar (quizás incluso algunas divisiones simples como 2/3, 3/5, 5/7 en el doble se usan como contraseña. Asegúrese de "forzar" al compilador a no optimizarlas (probablemente derivando el número de otras cosas "medibles", como la longitud de algunas cuerdas)). Especialmente el primero es probablemente el más fácil de ocultar: es bastante común "medir" la posición relativa de un campo. Ninguno de estos métodos sobrevivirá a 5 minutos de un hacker ... Solo protegerán contra "espionaje casual con un editor hexadecimal".

24

Si su programa es un programa de Windows, sólo tiene que utilizar "Este programa no se puede ejecutar en modo DOS." como la contraseña Esa cadena está en casi todos los ejecutables de Windows.

Estoy bromeando, ya que es casi tan seguro como XOR-ing la contraseña con una clave que está en otro lugar del programa y no habrá muchos dolores de cabeza para mantenerla.

+3

+1 por hacerme jajaja. – SuperJames

+0

@SuperJames: lo más gracioso es que es tan cierto ... – ninjalj

0

Muestre una imagen con otro código en cursiva al usuario e inserte un cuadro de texto donde el usuario puede ingresar el código que está escrito en la imagen. XOR la ​​contraseña del archivo ZIP con el código en la imagen. El resultado puede implementarse codificado. El programa tiene que XOR el código codificado con la entrada del usuario para obtener el código del archivo ZIP. Opcionalmente, puede verificar el código ingresado utilizando otro código unidireccional.

-1

ofuscar la contraseña con una secuencia de comandos perl. Los hackers aún pueden realizar ingeniería inversa en el código de su máquina ... pero al menos su contraseña no es obvia desde un editor hexadecimal.

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;"; 
     } 
    } 
} 
Cuestiones relacionadas