Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: neo_from_cs_matrix en 22 Agosto 2011, 01:23 am



Título: contraseña disimulada con *
Publicado por: neo_from_cs_matrix 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;
}



Título: Re: contraseña disimulada con *
Publicado por: тαптяα 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 (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)


Título: Re: contraseña disimulada con *
Publicado por: lapras 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.


Título: Re: contraseña disimulada con *
Publicado por: lapras 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.


Título: Re: contraseña disimulada con *
Publicado por: neo_from_cs_matrix 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;
  }


Título: Re: contraseña disimulada con *
Publicado por: тαптяα en 24 Agosto 2011, 19:55 pm
Resuelto pues.


Título: Re: contraseña disimulada con *
Publicado por: Karman 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


Título: Re: contraseña disimulada con *
Publicado por: lapras en 26 Agosto 2011, 11:41 am
windows.h tampoco es estandar