C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Перебор символов (bruteforce) на С++
Ученик
Отправлено: 12.09.2005, 20:55


Ученик-кочегар

Группа: Участник
Сообщений: 4



Как это лучше можно реализовать.

Прога должна перебирать 1-8 символов. Ну с 1 мне понятно, а как с 2-3 и чтобы быстро работала !

Помогите, кто хорошо знает язык ! Спасибо заранее !!!
AVC
Отправлено: 13.09.2005, 09:03


Ветеран

Группа: Модератор
Сообщений: 1583



На счет лучше это надо читать литературу. Для простых случаев мне хватает такой функции
CODE

*.h
// CallBack функция, вызываемая для каждого сгенеренного пароля
// возврат — true — пароль подошел, прервать генерацию, false — продолжить генерацию
typedef bool __fastcall (__closure *cbAxPswGen_ABC)(const char *psw);


// Простой рекурсивный метод перебора паролей (быстрее всего меняется самый правый символ)
//   abc —   массив строк asciiz — алфавитов для каждой позиции сивола пароля
//           ограничитель NULL, если индекс побираемого символа больше числа алфавитов
//           будет использован последний алфавит (т.е. можно задавать один алфавит)
//   psw     — буфер для пароля, должен быть не меньше maxlen+1
//   maxlen  - максимальное число символов в строке
//   cbFun   — Call back функция, выполняющая действия с текущим вариантом пароля
//   curidx  - текущий индекс символа (при старте = 0 или -1 — продолжить перебор)
// возврат — true  - перебор закончен (прервать генерацию) пароль в psw
//           false — продолжить генерацию

PACKAGE bool __fastcall AxPswGen_ABC (char           *abc[]
                                    ,char           *psw
                                    ,int             maxlen
                                    ,cbAxPswGen_ABC  cbFun
                                    ,int             curidx = 0
                                    );



*.c*

//---------------------------------------------------------------------------

PACKAGE bool __fastcall AxPswGen_ABC (char           *abc[]
                                    ,char           *psw
                                    ,int             maxlen
                                    ,cbAxPswGen_ABC  cbFun
                                    ,int             curidx
                                    );
{
if (curidx <= 0)
{  if (psw == NULL || maxlen <= 0)    return false;
   if (curidx != (-1)) memset(psw, 0x00, maxlen+1);    // -1 — продолжить перебор
   if (abc == NULL || cbFun == NULL)  return false;
   curidx = 0;
}

char    *curabc = NULL;
for (int i(0); i <= curidx; i++)
{  if ((char*)(abc[i]) != NULL)    curabc = (char*)(abc[i]);
   else                            break;
}

if (curabc == NULL) return false;   // возможно только при curidx = 0

int  maxidx  = maxlen — 1;
bool ret;

if (psw[curidx])        // продолжить перебор
{  char *cp = StrScan(curabc, psw[curidx]);
   if (cp) curabc = cp + ((curidx < maxidx)? 0 : 1);
}

for (char *cp=curabc; *cp; cp++)
{  psw[curidx] = *cp;
   if (curidx < maxidx) ret = AxPswGen_ABC(abc, psw, maxlen, cbFun, curidx+1);
   else                 ret = cbFun(psw);
   if (ret) return true;
}

psw[curidx] = 0x00;
return false;
}

//---------------------------------------------------------------------------

Использование

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

bool __fastcall TF_Main::IsValidPassword (const char *pszpsw)
{
AnsiString      psw(pszpsw);

Lbl_Vvel->Caption = psw;
Lbl_Vvel->Update();

Memo1->Lines->Add(psw);
if (psw == "ccb") return true;

if (IsBreakPoint()) return true;   // надо еще взвести флаг, видимый функции перебора

return false;
}

//---------------------------------------------------------------------------

void __fastcall TF_Main::Lbl_PswAttackClick(TObject *Sender)
{
char    psw[10];
char    *abclist[2] = {"abc", NULL};
Memo1->Lines->Clear();
for (int i(1); i <= 3; i++)
   if (AxPswGen_ABC(abclist, psw, i, IsValidPassword))     break;

Memo1->Lines->Add(AnsiString::StringOfChar('-', 20));

memcpy(psw, "bbb", 4);  // продолжить поиск
for (int i(3); i <= 3; i++)
   if (AxPswGen_ABC(abclist, psw, i, IsValidPassword, -1)) break;

//---------------------------------------------------------------------------

Ученик
Отправлено: 14.09.2005, 22:49


Ученик-кочегар

Группа: Участник
Сообщений: 4



Уж очень код большой и сложный !

Я пробовал такой вариант, что тоже не совсем ...

для 2, 3, 4-х буквенных символов еще ничего, а дальше куча циклов...

CODE:

char i,j;
char mv[2];

for (i=48; i<=55; i++)
{
mv[0]=i;
for (j=48; j<=55; j++)
{
mv[1]=j;
puts(mv);
}
}


Есть ли еще варианты ???

Отредактировано Ученик — 14/09/2005, 22:50
AVC
Отправлено: 15.09.2005, 08:13


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Уж очень код большой и сложный !

Ну вы даете. biggrin.gif Рабочий цикл в 5 строк это большой и сложный код ohmy.gif И, кстати, рабочий (копируйте и используйте). Представляю в какой шок вас повергнет модуль, работающий с БД smile.gif

Ну дело хозяйское — свои шишки набивайте сами.

Вернуться в Вопросы программирования в C++Builder