Bem, faz um bom tempo que meu amigo blackfalcon me pediu um simples md5 cracker que gerasse uma wordlist e depois comparasse.
Eu tinha começado a codar, fiz ele gerar a wordlist e já ia começar a faze-lo quebrar os hashs pedidos por tables.. mas ai eu fiquei sem tempo.
Há um tempo atrás eu pensei.. "eu to com aquela porcaria mal acabada no meu HD, vo termina ela logo".
Mas assim que eu olhei o código eu pensei "putz, que bagunça que eu fiz" lolz.
E resolvi codar outro md5 cracker mas dessa vez com um algoritmo mais inteligente que quebre os hashs md5 sem precisar de word list.. não quebra-lo totalmente, mas parcialmente e com o mínimo de ciclos possíveis... deixando uma série pequena/minúscola de possibilidades de senhas pra quem usar o programa.
Bem, eu estou chegando a um algoritmo sustentável mas eu percebi que se eu quiser terminar isso esse ano, eu vou precisar de ajuda de alguem inteligente que tenha um bom conhecimento de C/C++ ou ASM e um bom conhecimento do pseudo algoritmo do hash MD5 ou tenha paciencia de me escutar explicando e me ajude a chegar à uma solução.
Se alguem quiser me dar essa força é só mandar mp.. vo deixar o código inacabado do antigo md5 cracker por wordlisting aqui pra se alguem quiser.. fuiz
.cpp
/*-------
Coder: B.L.A.C.K.W.I.N².E.R
Contato: deadlyconcience57@hotm~
--------*/
#include "hashmd5.h"
/*|-Variaveis-|*/
MD_FIVE mFive; //obj MD_FIVE declarado em hashmd5.h
unsigned short int resp; //Resposta do usuário ao set de opções
/**** Protótipos
****/
void Show_Credits();
//-----------------------------------------------------//
//------------------MAIN-BEGIN-------------------------//
//-----------------------------------------------------//
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgument, int nFunsterStil)
{
while(1)
{
/*----->Título/referencias e etc*/
SetConsoleTitle("*-----HashCracker------*");
cout << "*********************\n";
cout << "* BLACKWINNER *\n";
cout << "*********************\n\n\n";
/*------>Set de opções*/
cout << "1- Criar hash \n";
cout << "2- Quebrar hash \\HeavyMode\n";
cout << "3- Quebrar hash \\SoftMode\n";
cout << "4- Gerar word list \\HeavyMode\n";
cout << "5- Gerar word list \\SoftMode\n";
cout << "6- Sair\n";
cout << "7- Sair\n";
cin >> resp;
switch(resp)
{
case 1:
mFive.Call_Create();
break;
case 2:
break;
case 3:
break;
case 4:
mFive.wList_Heavy();
break;
case 5:
mFive.wList_Soft();
break;
case 6:
break;
case 7:
Show_Credits();
goto fim_do_programa;
break;
}
system("cls");
}
fim_do_programa:;
}
//-----------------------------------------------------//
//------------------MAIN-END---------------------------//
//-----------------------------------------------------//
void Show_Credits()
{
system("cls");
cout << "Special Thanks to: "
<< "blackfalcon,"
<< " Gadu,"
<< " Jessy.\n\n";
cout << "Me encontre em: "
<< "\nhttp://www.hack-one.org/phpbb\n\n";
cout << "Encontre ajuda para desenvolver seu software: "
<< "\nhttp://www.hazardsource.com/forum/\n\n";
system("pause");
}
.h
//--------/*/ HEADERS /*/--------//
//
#include <windows.h> //
#include <Wincrypt.h> //
#include <fstream> //
#include <stdlib.h> //
#include <iostream> //
#include <string> //
//
//
using namespace std; //
//
//
///////////////////////////
//--------------------/*/ CLASSES /*/------------------------//|
//|
class A_Chars //|
{ //|
public: //|
BYTE A_Char[1024]; //|
}; //|
//|
//=================================================================//|
//|
class MD_FIVE //|
{ //|
public: //|
MD_FIVE(); //|
~MD_FIVE(); //|
void CREATE(BYTE*); //|
void wList_Heavy(); //|
void Call_Create(); //|
int Ta_Tudo_Certo(int); //|
void wList_Soft(); //|
private: //|
friend DWORD WINAPI wList_Softhread(LPVOID); //|
friend DWORD WINAPI wList_Softhread2(LPVOID); //|
HANDLE *Threader; //|
DWORD *ThreadID; //|
string O_STRING; //|
HCRYPTPROV hProv; //|
DWORD cbHash; //|
HCRYPTHASH hHash; //|
CHAR HexDig[16]; //|
fstream File__, File__2; //|
BYTE A_Char[95]; //|
A_Chars A_Char2, A_Char3; //|
unsigned short int x , y, yy; //|
}; //|
//|
/*-----------------------------------------------------------------*/
MD_FIVE :: MD_FIVE()
{
hProv = 0;
cbHash = 16;
hHash = 0;
HexDig[0] = '0';
HexDig[1] = '1';
HexDig[2] = '2';
HexDig[3] = '3';
HexDig[4] = '4';
HexDig[5] = '5';
HexDig[6] = '6';
HexDig[7] = '7';
HexDig[8] = '8';
HexDig[9] = '9';
HexDig[10] = 'a';
HexDig[11] = 'b';
HexDig[12] = 'c';
HexDig[13] = 'd';
HexDig[14] = 'e';
HexDig[15] = 'f';
for (unsigned short int i = 32; i < 127; i++)
{
A_Char[i-32] = (char) i;
}
}//construtor
MD_FIVE :: ~MD_FIVE()
{
if (File__.is_open())
{
File__.close();
}
File__2.open("HeaderFile", ios_base :: binary | ios_base :: out);
File__2.write((char *) &x, sizeof(x));
File__2.write((char *) &y, sizeof(y));
File__2.write((char *) &A_Char3, sizeof(A_Char3));
File__2.close();
} //destrutor
void MD_FIVE :: CREATE(BYTE *overRR)
{
CryptAcquireContext(&hProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT);
CryptCreateHash(hProv, 0x00008003, 0, 0, &hHash);
O_STRING = (const char *)overRR;
CryptHashData(hHash, overRR, O_STRING.size(), 0);
CryptGetHashParam(hHash, HP_HASHVAL, overRR, &cbHash, 0);
for (int i = 0; i < cbHash; i++)
{
File__ << HexDig[overRR[i] >> 4]
<< HexDig[overRR[i] & 0xf];
}
File__ << " String:" << O_STRING << endl;
CryptDestroyHash(hHash);
CryptReleaseContext(hProv, 0);
} //CREATE
void MD_FIVE :: Call_Create()
{
ZeroMemory(A_Char2.A_Char,sizeof(A_Char2.A_Char));
cout << "Digite a string: ";
cin >> A_Char2.A_Char;
File__.open("HashGen.txt", ios_base :: app | ios_base :: out);
this->CREATE(A_Char2.A_Char);
File__.close();
File__.clear();
ZeroMemory(A_Char2.A_Char,sizeof(A_Char2.A_Char));
} //Call create
void MD_FIVE :: wList_Heavy()
{
File__2.open("HeaderFile", ios_base :: binary | ios_base :: in);
File__2.seekg(0, ios :: end);
if(File__2.tellg() > 0)
{
File__2.seekg(0, ios :: beg);
File__2.read((char *) &x, sizeof(x));
File__2.read((char *) &y, sizeof(y));
File__2.read((char *) &A_Char3, sizeof(A_Char3));
}
else
{
y = 0;
yy = 0;
x = 0;
}
File__2.close();
File__2.clear();
File__.open("wList.txt", ios_base :: app | ios_base :: out);
if(y > 0)
{
yy = y;
goto Ja_to_dentro;
}
while(1)
{
while (1)
{
A_Char2 = A_Char3;
A_Char2.A_Char[0] = A_Char[x - ((x/95)*95)];
/*algoritmo de transição*/
if((x%95 == 0) && (y > 0))
{
testa_novamente:
if(A_Char2.A_Char[yy] == (BYTE) '~' && yy > 0)
{
A_Char2.A_Char[yy] = A_Char[0];
yy--;
goto testa_novamente;
}
else if (yy > 0)
{
A_Char2.A_Char[yy] = (int)A_Char2.A_Char[yy] + 1;
}
if (yy == 0)
yy = y+1;
else
yy = y;
}
/*gera o hash*/
A_Char3 = A_Char2;
this->CREATE(A_Char2.A_Char);
ZeroMemory(A_Char2.A_Char,sizeof(A_Char2.A_Char));
/*controle de loops*/
x++;
Ja_to_dentro:;
if (A_Char3.A_Char[0] == (BYTE) '~' && y == 0)
break;
if ((y > 0) && this->Ta_Tudo_Certo(y))
break;
}//while(1)
y++;
yy = y;
for (int cont = 0; cont <= y; cont++)
A_Char3.A_Char[cont] = 32;
A_Char3.A_Char[y] = 31;
}//while(coluna)
File__.close();
} //gerador de heavy wList
int MD_FIVE :: Ta_Tudo_Certo(int cont)
{
for(int i = 0; i <= cont; i++)
if(A_Char3.A_Char[i] < 126)
return 0;
return 1;
} //verificador
void MD_FIVE :: wList_Soft()
{
Threader = new HANDLE [sizeof(HANDLE) * 2];
ThreadID = new DWORD [sizeof(DWORD) * 2];
Threader[0] = CreateThread(0,0,wList_Softhread,(void *) this,0, &ThreadID[0]);
Threader[1] = CreateThread(0,0,wList_Softhread2,(void *) this,0, &ThreadID[1]);
WaitForMultipleObjects(2,Threader,1,INFINITE);
TerminateThread(Threader[0],0);
CloseHandle(Threader[0]);
TerminateThread(Threader[1],0);
CloseHandle(Threader[1]);
delete [] Threader;
delete [] ThreadID;
}
/*-----
Threads
------*/
DWORD wList_Softhread(LPVOID valor)
{
MD_FIVE *another = (MD_FIVE *)valor;
MessageBox(0,"Testando","ST1",0x40);
cout << another->HexDig[10];
return 0;
}
DWORD wList_Softhread2(LPVOID valor)
{
MD_FIVE *another = (MD_FIVE *)valor;
MessageBox(0,"teste","ST2",0x40);
cout << another->HexDig[11];
return 0;
}
//66
//76
//65
//67
//75
//87
//73
//78
//78
//69
//82