elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  contraseña disimulada con *
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: contraseña disimulada con *  (Leído 1,759 veces)
neo_from_cs_matrix

Desconectado Desconectado

Mensajes: 35


Ver Perfil
contraseña disimulada con *
« en: 22 Agosto 2011, 01:23 am »

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

Código:
#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

тαптяα


Desconectado Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: contraseña disimulada con *
« Respuesta #1 en: 22 Agosto 2011, 08:43 am »

Prueba a compilarlo con GCC (DevC++), depende de cada compilador necesitaba una notación..busca sobre como mezclar C y ASM en Google.

http://www.google.es/#sclient=psy&hl=es&biw=1366&bih=655&source=hp&q=mix+c+with+asm&pbx=1&oq=mix+c+with+asm&aq=f&aqi=&aql=&gs_sm=e&gs_upl=638l4212l0l4708l14l10l0l0l0l0l445l2320l0.5.3.1.1l10l0&bav=on.2,or.r_gc.r_pw.&fp=fb1234466e10fcdb


En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: contraseña disimulada con *
« Respuesta #2 en: 23 Agosto 2011, 21:15 pm »

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
  1. /***
  2. * kpress.c
  3. *
  4. * (c) 2004 ackbar
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <unistd.h>
  10. #include <termio.h>
  11. #include <sys/ioctl.h>
  12.  
  13. #define STDINFD  0
  14. #undef getc
  15.  
  16. char inkey(void);
  17.  
  18. int main() {
  19.  char c;
  20.  printf("Presione una tecla: ");
  21.  c=inkey();
  22.  printf("Codigo ASCII de la tecla presionada: [%d] Caracter: [%c]\n",c,c);
  23.  return 0;
  24. }
  25.  
  26. char inkey(void) {
  27.  char c;
  28.  struct termio param_ant, params;
  29.  
  30.  ioctl(STDINFD,TCGETA,&param_ant);
  31.  
  32.  params = param_ant;
  33.  params.c_lflag &= ~(ICANON|ECHO);
  34.  params.c_cc[4] = 1;
  35.  
  36.  ioctl(STDINFD,TCSETA,&params);
  37.  
  38.  fflush(stdin); fflush(stderr); fflush(stdout);
  39.  read(STDINFD,&c,1);
  40.  
  41.  ioctl(STDINFD,TCSETA,&param_ant);
  42.  return c;
  43. }
  44. /* EOF: kpress.c */
  45.  

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

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: contraseña disimulada con *
« Respuesta #3 en: 24 Agosto 2011, 09:03 am »

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 Desconectado

Mensajes: 35


Ver Perfil
Re: contraseña disimulada con *
« Respuesta #4 en: 24 Agosto 2011, 18:42 pm »

rescate este codigo 100% de la libreria standard

Código:

#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 Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: contraseña disimulada con *
« Respuesta #5 en: 24 Agosto 2011, 19:55 pm »

Resuelto pues.
En línea

Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: contraseña disimulada con *
« Respuesta #6 en: 25 Agosto 2011, 05:38 am »

mi versión simplificada  :xD

Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. char *getpass(char *pass,unsigned int length){
  5.  DWORD num,modo,i=0;
  6.  HANDLE input=GetStdHandle(STD_INPUT_HANDLE);
  7.  HANDLE output=GetStdHandle(STD_OUTPUT_HANDLE);
  8.  GetConsoleMode(input,&modo);
  9.  SetConsoleMode(input,modo&~(ENABLE_ECHO_INPUT|ENABLE_LINE_INPUT));
  10.  do{
  11.    ReadConsole(input,&pass[i],1,&num,NULL);
  12.    if(pass[i++]=='\r')break;
  13.    WriteConsole(output,"*",1,&num,NULL);
  14.  }while(i<length);
  15.  pass[i]=0;
  16.  WriteConsole(output,"\n",1,&num,NULL);
  17.  SetConsoleMode(input,modo);
  18.  return pass;
  19. }
  20.  
  21. int main(void){
  22.  char pass[32]={0};
  23.  printf("ingrese clave: ");
  24.  getpass(pass,sizeof(pass));
  25.  puts(pass);
  26.  return 0;
  27. }

S2
En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: contraseña disimulada con *
« Respuesta #7 en: 26 Agosto 2011, 11:41 am »

windows.h tampoco es estandar
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
no puedo conectarme a una red con contraseña sabiendo la contraseña
Redes
phoeboo 2 3,997 Último mensaje 24 Junio 2010, 06:47 am
por zhyzura
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines