Simulando una clave de acceso en C++

Iniciado por Dr. H47, 9 Enero 2011, 05:43 AM

0 Miembros y 1 Visitante están viendo este tema.

Dr. H47

- Aqui les dejo un pequeño código fuente codificado en ´lenguaje c++.

Código que simula una clave de acceso mediante do...while y define.

- Si no se ingresa la clave correcta el programa no da acceso y pide ingresar la clave cuantas veces sea necesario.

- La clave ha sido declarada en una variable tipo entero (int), por lo que si se ingresa una letra o caracter que no sea numerico, la aplicación sale de su ciclo provocando un error infinito.


Código (cpp) [Seleccionar]

// ----------------------------
// DENEGADO.CPP
// Escrito en Turbo C++ 3.0
// Programa que restringe el acceso, si no se teclea la clave correcta.
// utilizando "do..while" y "define".
// ----------------------------

#include <iostream.h>
#include <conio.h>

#define clavetrue 777

int claveacceso;

void main (void)
{
clrscr();
do
{
cout<<"Ingrese la clave de acceso: ";
cin>>claveacceso;
if (claveacceso != clavetrue);
}
while (claveacceso != clavetrue);
cout<<"\n\nAcceso concedido.";
getch();
}

// Eder A. Lopez
// dr.h47@live.com.mx
// Powered by Dr. H47


Ver el código fuente en texto plano.

Bajar source+ejecutable comprimido en .zip

Edu


тαптяα

Siempre decepcionando ZERO...

Esta bien la idea, pero te falla el uso de conio.h es una libreria antigua, bueno lo de siempre, leete esto.

http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html



Littlehorse

Sumado a que no es recomendable utilizar conio, "main" debe declararse "int main". La declaración de "iostream.h" es obsoleta, debe declararse "iostream". Cuidado con las variables globales innecesarias; son una mala practica.

Por otro lado, el código es bastante inseguro:

1) La forma en la que implementas el valor correcto es insegura. Es fácilmente accesible ya sea leyendo el proceso o debuggeando el ejecutable.

2) No limitas los intentos, por lo tanto en ultima instancia se podría hacer fuerza bruta.

Saludos

An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Dr. H47

Gracias por el aviso, servira para tomarlo en cuenta en mis otras practicas.

Saludos.

.mokk.

#5
Pues si he visto el codigo y veo algo que no entiendo aun, porque un if dentro del do while de comparacion que no hace nada ? hehe

Sobre el codigo aqui te lo dejo un poco mejorado, acepta letras pero mostrara mensaje diciendo que solo numeros, por lo que es mejor asi tu programa no crashea, bueno aqui te dejo el codigo y tambien leido lo de LittleHorse intente hacerlo de la mejor forma posible

Código (c++) [Seleccionar]

#include <cstdlib>
#include <iostream>

using namespace std;

#define clavetrue 777

int claveacceso, intento=0, total = 5;
char buffer[100];

int main(int argc, char *argv[])
{
     do
     {
      if(intento>total) {
                     cout << "Has sobrepasado el numero de intentos disponibles el programa cerrara";
                     cin.get();
                     return 0;
                        }
                     
                     
      cout<<"Ingrese la clave de acceso: ";
      fgets(buffer, 99, stdin);
      if(sscanf(buffer, "%d", &claveacceso) != 1)
                        cout << "Error solo numeros porfavor" << endl;
                       

     
      if(claveacceso != clavetrue)
                     cout<<"Intento numero: " << intento << " - Intentos restantes: " << (total-intento) << endl;
      intento++;
     }
     while (claveacceso != clavetrue);
     cout<<"\n\nAcceso concedido.";
     cin.get();
}


Cita de: Littlehorse en 10 Enero 2011, 19:14 PM

1) La forma en la que implementas el valor correcto es insegura. Es fácilmente accesible ya sea leyendo el proceso o debuggeando el ejecutable.


He visto este tema en el cual nose si sea buenoa forma de asegurar mejor nuestra contraseña,
http://gaussianos.com/criptografia-cifrado-de-clave-publica-ii/
Ahi tambien si podrias dar alguna sugerencia en eso seria de gran ayuda mas para proyectos en los que deceemos usar una contraseña y sea mas dificil el poder crackear el programa.

Littlehorse

Es un tema bastante amplio, se pueden hacer muchas cosas. Ofuscar el código agregando operaciones basura, packers, ofuscación mediante VM, cifrados de distintos tipos para el password etc.

Realmente depende del propósito principal del programa (si realiza o no conexiones) pero la regla básica es no almacenar la contraseña en texto plano en ningún lugar del sistema.

En el caso del código, al utilizar un define le pones la tarea muy facil al que debuggea ya que puede ver el valor de la constante a comparar muy fácilmente. Es decir vería algo similar a:

Código (asm) [Seleccionar]
cmp [xxxxxx],00000309

donde 309 en hexadecimal es 777 en decimal.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Garfield07


/*
Eder A. Lopez
dr.h47@live.com.mx
Powered by Dr. H47
++++++++++++
Code in C : Sagrini 2010 : elhacker.net
*/
#include <stdio.h>

int main (int argc, char *argv [])
{
int clave, OK = atoi (argv [1]);
do
{
printf( "Ingrese la clave de acceso: ");
scanf ("%d", &clave);
}
while (clave != OK)
printf ("Acceso concedido !!!\n\n");
return 0;
}


Cita de: .mokk. en 27 Enero 2011, 09:27 AM
He visto este tema en el cual nose si sea buenoa forma de asegurar mejor nuestra contraseña,
http://gaussianos.com/criptografia-cifrado-de-clave-publica-ii/
Pues no, eso es para otra cosa  :P. Criptografía, comunicaciones seguras, pero se podría usar algo como
#define OK 111*7
Evidentemente más entrevesado, para liar a un atacante inexperto...
Otra forma sería guardar la pass en un archivo con privilegios unicamente del que ejecuta el prog... Hay formas de sobra, solo es pensar.

Cita de: Littlehorse en 27 Enero 2011, 17:25 PM
Es un tema bastante amplio, se pueden hacer muchas cosas. Ofuscar el código agregando operaciones basura, packers, ofuscación mediante VM, cifrados de distintos tipos para el password etc.
Realmente depende del propósito principal del programa (si realiza o no conexiones) pero la regla básica es no almacenar la contraseña en texto plano en ningún lugar del sistema.
En el caso del código, al utilizar un define le pones la tarea muy facil al que debuggea ya que puede ver el valor de la constante a comparar muy fácilmente. Es decir vería algo similar a:
Código (asm) [Seleccionar]
cmp [xxxxxx],00000309
donde 309 en hexadecimal es 777 en decimal.
Saludos
De acuerdo, mucho mejor jeje... Ahí esta lo de arriba...

Cita de: Littlehorse en 10 Enero 2011, 19:14 PM
Sumado a que no es recomendable utilizar conio, "main" debe declararse "int main". La declaración de "iostream.h" es obsoleta, debe declararse "iostream". Cuidado con las variables globales innecesarias; son una mala practica.
Por otro lado, el código es bastante inseguro:
1) La forma en la que implementas el valor correcto es insegura. Es fácilmente accesible ya sea leyendo el proceso o debuggeando el ejecutable.
2) No limitas los intentos, por lo tanto en ultima instancia se podría hacer fuerza bruta.
Saludos
Lo de la fuerza bruta se podría hacer de todas formas, solo ejecutar varias veces el programa, aunque sería más lento evidentemente...
Lo demás que se dice en el code...
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

Suerte!


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo