Ученик |
Отправлено: 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 | Уж очень код большой и сложный ! |
Ну вы даете. Рабочий цикл в 5 строк это большой и сложный код И, кстати, рабочий (копируйте и используйте). Представляю в какой шок вас повергнет модуль, работающий с БД
Ну дело хозяйское — свои шишки набивайте сами. |
|
|