contraseña disimulada con *

Iniciado por neo_from_cs_matrix, 22 Agosto 2011, 01:23 AM

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

neo_from_cs_matrix

hola q tal, este ejemplo lo saque de google, es sobre algo que estaba haciendo, estaba tratando de ocultar el ingreso de una clave por medio de convertir lo que se teclea en * (osea hasteriscos)
no compila en codeblocks, pero compila en visual studio. lo que necesito que me ayuden es en la parte de _asm porque es una forma de evitar el uso de getch de conio y usar esamblador  :xD
sino corresponde diganme que muevo el tema a el foro de ASM
lo que pasa que tira error en esa parte


#include <windows.h>
#include <stdio.h>

typedef unsigned char tiny;

tiny GETCH(void);

int main(void)
{
tiny input;
tiny *ptr;
char password[20];
int count;
system("cls"); // too lazy not to cheat here
count = 0;
printf("enter your password: ");
do
{
input = GETCH();
if(input == '\xD') break; // enter pressed?
putc('*', stdout);
ptr = &input;
password[count] = *ptr;
count++;
}while(count < 20);

password[count++] = '\0'; // terminate the string
printf("\nyour password: %s\n", password);

return 0;
}

tiny GETCH(void)
{
tiny key;

_asm
{

start:
mov ah,0
int 0x16
cmp al,0
je start ; don't process special keys
mov key,al
}

return key;
}




lapras

#2
Hola. Tu pregunta es muy interesante. Googleando me encontre esto que te ayudara seguro:
http://www.espaciolinux.com/foros/programacion/leer-una-pulsacion-del-teclado-t5147.html
El codigo es este.
Código (cpp) [Seleccionar]
/***
* kpress.c
*
* (c) 2004 ackbar
*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termio.h>
#include <sys/ioctl.h>

#define STDINFD  0
#undef getc

char inkey(void);

int main() {
 char c;
 printf("Presione una tecla: ");
 c=inkey();
 printf("Codigo ASCII de la tecla presionada: [%d] Caracter: [%c]\n",c,c);
 return 0;
}

char inkey(void) {
 char c;
 struct termio param_ant, params;

 ioctl(STDINFD,TCGETA,&param_ant);

 params = param_ant;
 params.c_lflag &= ~(ICANON|ECHO);
 params.c_cc[4] = 1;

 ioctl(STDINFD,TCSETA,&params);

 fflush(stdin); fflush(stderr); fflush(stdout);
 read(STDINFD,&c,1);

 ioctl(STDINFD,TCSETA,&param_ant);
 return c;
}
/* EOF: kpress.c */


Yo aun no lo entiendo del todo pero puedes sutituir el codigo ensamblador por la funcion inkey(). Las libreria que usa son estandar.
тαптяαпсє esa sintaxis no es AT&T y por lo tanto no compila ni de coña en gcc xD.
La desventaja del codigo ensamblador es que depende del pc en use se use.
La función inkey() podra ser usada en cuanquier pc por que ademas de ser C, usa librerias estandar no como getch() de conio.h
Voy aver si consigo entender la definicion de la función inkey.
Muy buena prugunta neo_from_cs_matrix.

lapras

Perdón. termio.h no es estandar. Tal vez por eso al compilar no habeis podido. Ya os dire.

neo_from_cs_matrix

rescate este codigo 100% de la libreria standard



#include <windows.h>
#include <stdio.h>

#include <iostream>
#include <stdexcept>
#include <string>
#include <windows.h>
using namespace std;

string getpassword( const string& prompt = "Enter password> " )
  {
  string result;

  // Set the console mode to no-echo, not-line-buffered input
  DWORD mode, count;
  HANDLE ih = GetStdHandle( STD_INPUT_HANDLE  );
  HANDLE oh = GetStdHandle( STD_OUTPUT_HANDLE );
  if (!GetConsoleMode( ih, &mode ))
    throw runtime_error(
      "getpassword: You must be connected to a console to use this program.\n"
      );
  SetConsoleMode( ih, mode & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT) );

  // Get the password string
  WriteConsoleA( oh, prompt.c_str(), prompt.length(), &count, NULL );
  char c;
  while (ReadConsoleA( ih, &c, 1, &count, NULL) && (c != '\r') && (c != '\n'))
    {
    if (c == '\b')
      {
      if (result.length())
        {
        WriteConsoleA( oh, "\b \b", 3, &count, NULL );
        result.erase( result.end() -1 );
        }
      }
    else
      {
      WriteConsoleA( oh, "*", 1, &count, NULL );
      result.push_back( c );
      }
    }

  // Restore the console mode
  SetConsoleMode( ih, mode );

  return result;
  }

int main()
  {
  try {

    string password = getpassword( "Enter a test password> " );
    cout << "\nYour password is " << password << endl;

    }
  catch (exception& e)
    {
    cerr << e.what();
    return 1;
    }

  return 0;
  }



Karman

mi versión simplificada  :xD

#include <windows.h>
#include <stdio.h>

char *getpass(char *pass,unsigned int length){
  DWORD num,modo,i=0;
  HANDLE input=GetStdHandle(STD_INPUT_HANDLE);
  HANDLE output=GetStdHandle(STD_OUTPUT_HANDLE);
  GetConsoleMode(input,&modo);
  SetConsoleMode(input,modo&~(ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT));
  do{
    ReadConsole(input,&pass[i],1,&num,NULL);
    if(pass[i++]=='\r')break;
    WriteConsole(output,"*",1,&num,NULL);
  }while(i<length);
  pass[i]=0;
  WriteConsole(output,"\n",1,&num,NULL);
  SetConsoleMode(input,modo);
  return pass;
}

int main(void){
  char pass[32]={0};
  printf("ingrese clave: ");
  getpass(pass,sizeof(pass));
  puts(pass);
  return 0;
}


S2

lapras