Autor
|
Tema: contraseña disimulada con * (Leído 2,521 veces)
|
neo_from_cs_matrix
Desconectado
Mensajes: 35
|
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 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; }
|
|
|
En línea
|
|
|
|
|
lapras
|
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.htmlEl codigo es este. /*** * 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,¶m_ant); params = param_ant; params.c_lflag &= ~(ICANON|ECHO); params.c_cc[4] = 1; ioctl(STDINFD,TCSETA,¶ms); fflush(stdin); fflush(stderr); fflush(stdout); read(STDINFD,&c,1); ioctl(STDINFD,TCSETA,¶m_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.
|
|
« Última modificación: 23 Agosto 2011, 21:18 pm por tuket »
|
En línea
|
|
|
|
lapras
|
Perdón. termio.h no es estandar. Tal vez por eso al compilar no habeis podido. Ya os dire.
|
|
|
En línea
|
|
|
|
neo_from_cs_matrix
Desconectado
Mensajes: 35
|
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; }
|
|
|
En línea
|
|
|
|
тαптяα
Desconectado
Mensajes: 1.151
Sic utere tuo ut alienum non laeda
|
Resuelto pues.
|
|
|
En línea
|
|
|
|
Karman
|
mi versión simplificada #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}; getpass(pass,sizeof(pass)); return 0; }
S2
|
|
|
En línea
|
|
|
|
lapras
|
windows.h tampoco es estandar
|
|
|
En línea
|
|
|
|
|
|