#include <stdlib.h>
#include <stdio.h>
#include <string.h>                                                               
#include <unistd.h>                                                                              
#include <sys/ptrace.h>                                                                          
#include <sys/stat.h>
#include <time.h>
#include <pthread.h>
#include <sys/syscall.h>
#include <errno.h>


int tid ;

void *funcionThread (void *parametro) {

	tid = (pid_t) syscall (SYS_gettid);
	return(&tid) ;
};

 
int ispass(char *string) {
 
	char Done[1000] = "AdElanTeHoliw00dFarDelViVaEspaMeVAmosExpoWakaWakaEOSpainFTWArramploCocOsSaSViDAAzuLMariNoHAHAoleTorito";
	
	char Deso[1000] = "OHereDanLaTierraGHENTEwenaZipiZapeEnLaCamCampusMasYmeJor133eYo4389123VieNeNyvANgAVioTuxSHOtOROMeVoYAcOmerUnAPaellaRica";
	
	char Dfixed[1000] ;
	char Fixed[1000] ;
	
	int x ;
	
	for (x=41; x < 59 ; x++) {
	
		sprintf( &Dfixed[x-41], "%c", Done[x] );
		sprintf( &Fixed[x-41], "%c", Deso[x] );
		
		//strcpy (Dfixed, Done[x] );
		
	}
	
	//printf("Hola %s\n", Dfixed) ;
	//printf("Adios %s\n", Fixed) ;
	
	// Un canario para que no hayan parado el proceso 
	
	time_t ahora; 
	
	time_t despues;
	
	ahora = time(NULL);
	
	
	if( strcmp(Fixed, string ) == 0 ){
		
		despues =  time(NULL);
		
		if (despues-ahora > 5) {
			
			printf("Algo raro haces ...\n");
			exit(0) ;
		}
		
		printf("Password Correcto !!!!.\n");
		printf ("Tu Token: %s\n", Dfixed) ;
	
	}
   
	else{
	
	   printf("Meeeeeeeec FAIL.\n");
	
	}
	
	return 1;
}
 
int main(int argc, char *argv[]) {
 
	// Anti  Debug !


        if(close(3) != -1)
        {                 
                printf("Tecnica no valida [01]!!\n");
                _exit(-1);                      
        }                                       


         if(strcmp(argv[0], (char *)getenv("_")))
        {                                                                                                                     
                 printf("Tecnica no valida [02]!!\n");                                                                             
                _exit(-1);                                                                                                    
        }                                                                                                                     


        if(getsid(getpid()) != getppid())
        {                                
                 printf("Tecnica no valida [03]!!\n");
                _exit(-1);                       
        }                                        


        // Fin Anti Debug

	
	if(argc < 2) {

                printf("Suministra un password (9 caracteres)\n");
		printf("uso: %s texto\n", argv[0]);
                _exit (1);

        }

	// Una de ruido a base de lanzar 100 hilos que no hacen nada !
	
	int i ;
	
	for (i=0; i < 100 ; i++) {
		void *status;

		errno= 0 ;

		pthread_t idHilo;

		int error;

		error = pthread_create (&idHilo, NULL, funcionThread, NULL);

		if (error != 0)
		{
			perror ("Warning : Cannot create thread !");
			exit (-1);
		}

		error = pthread_join(idHilo, &status);

		if (error != 0)
		{
			perror ("Warning : Cannot join thread !");
			exit (-1);
		}


	}
	
	
	system("pkill gdb");
	
	ispass(argv[1]);
 
	return 1;
}

