#pragma once
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <atlstr.h>
struct periods//структура односвязного для хватания алфавита
{
short start,end;
periods *next;
};
struct StructWord//структура двусвязного для подбираемого слова
{
char c;
StructWord *next;
StructWord *prev;
};
class DictWord//двусвязный подбираемое слово
{
public:
DictWord(short n, CString DictChar);//длинна в буквах и алфавит
~DictWord();
int Add();//следующее слово -2 - выходное значение
CString GetString(bool Heading);//получить слово
private:
StructWord SWord;
StructWord *Current;
StructWord *Head;
StructWord *Tale;
CString CharBase;
int CharBaseLength;
bool PureAdd;
};
class DictCreator//создатель словаря
{
public:
DictCreator(periods* range);//задание алфавита
bool Open(const char* DictName);//открытия файла
void Close();
void Work(int n, int nn);// делать слова от n до nn символов
private:
FILE* DictFile;
char BaseDict[255];//базовый набор АСКИИ
CString Dict;
};
Линейный список быстрее массива?
Вопрос, почему? Лин. список быстрее массива? Но в первой проге есть вывод в файл и вызовы функций. Вторая - написана просто по-идиотски, под конкретный случай.
Объясню теперь, что должна делать прога. Прога должна создавать словарь для брутфорсера. Букв в слове - 8. Алфавит:
"0123456789abcdefghijklmnopqrstuvwxyz"
[SIZE="4"]Листинг. Прога первая(быстрая):[/SIZE]
[SIZE="3"]stdafx.h[/SIZE]
Код:
[SIZE="3"]stdafx.cpp[/SIZE]
Код:
#include "stdafx.h"
DictWord::DictWord(short n, CString DictChar)
{
const char ZeroChar=DictChar.GetAt(0);
Current= new StructWord;
Head=Current; Tale=Current;
Current->c=ZeroChar;
for(int i=1;i<n;i++)
{
Current->next= new StructWord;
Current->next->c=ZeroChar;
Current->next->prev=Current; Tale=Current->next;
Current=Current->next;
}
CharBase=DictChar;
}
DictWord::~DictWord()
{
while(Current!=Head)
{
Current=Tale;
Current=Current->prev;
Tale=Current;
delete Current->next;
}
delete Tale;
delete Head;
}
CString DictWord::GetString(bool Heading)
{
CString TempString="";
if(Heading)
{
Current=Tale;
while (true)
{
TempString+=Current->c;
if(Current==Head) break;
Current=Current->prev;
}
}
else
{
Current=Head;
while(true)
{
TempString+=Current->c;
if(Current==Tale) break;
Current=Current->next;
}
}
return TempString;
}
int DictWord::Add()
{
int Now;
bool E=true;
char Max=CharBase.GetAt(CharBase.GetLength()-1);
char Min=CharBase.GetAt(0);
if(PureAdd)Current=Tale;
Now=CharBase.Find(Current->c,0);
Now++;
if((Now>=CharBase.GetLength())||(Now<0))
{
Current->c=Min;
if(Current!=Head)
{
Current=Current->prev;
PureAdd=false;
if(-2==Add()) return -2;
return -1;
}
else
return -2;
}
else
{
Current->c=CharBase.GetAt(Now);
PureAdd=true;
return Now;
}
}
DictCreator::DictCreator(periods* range)
{
periods *run;
int ii=0;
for(int i=0;i<=255;i++)
BaseDict=i;
run=range;
while(run!=NULL)
{
for(int i=run->start;i<=run->end;i++)
{
Dict+=char(BaseDict);
ii++;
}
run=run->next;
}
}
bool DictCreator::Open(const char* DictName)
{
if(DictName!=NULL)
DictFile=fopen(DictName,"w+t");
if(DictFile!=NULL) return true;
else return false;
}
void DictCreator::Close()
{
if(DictFile!=NULL) fclose(DictFile);
}
void DictCreator::Work(int n, int nn)
{
int a;
DictWord *DCW;
for(int i=n;i<=nn;i++)
{
a=0;
DCW = new DictWord(i, Dict);
while(a!=-2)
{
fprintf(DictFile,"%s \n",DCW->GetString(false));
printf("%s \n",DCW->GetString(false));
a=DCW->Add();
}
free(DCW);
}
}
DictWord::DictWord(short n, CString DictChar)
{
const char ZeroChar=DictChar.GetAt(0);
Current= new StructWord;
Head=Current; Tale=Current;
Current->c=ZeroChar;
for(int i=1;i<n;i++)
{
Current->next= new StructWord;
Current->next->c=ZeroChar;
Current->next->prev=Current; Tale=Current->next;
Current=Current->next;
}
CharBase=DictChar;
}
DictWord::~DictWord()
{
while(Current!=Head)
{
Current=Tale;
Current=Current->prev;
Tale=Current;
delete Current->next;
}
delete Tale;
delete Head;
}
CString DictWord::GetString(bool Heading)
{
CString TempString="";
if(Heading)
{
Current=Tale;
while (true)
{
TempString+=Current->c;
if(Current==Head) break;
Current=Current->prev;
}
}
else
{
Current=Head;
while(true)
{
TempString+=Current->c;
if(Current==Tale) break;
Current=Current->next;
}
}
return TempString;
}
int DictWord::Add()
{
int Now;
bool E=true;
char Max=CharBase.GetAt(CharBase.GetLength()-1);
char Min=CharBase.GetAt(0);
if(PureAdd)Current=Tale;
Now=CharBase.Find(Current->c,0);
Now++;
if((Now>=CharBase.GetLength())||(Now<0))
{
Current->c=Min;
if(Current!=Head)
{
Current=Current->prev;
PureAdd=false;
if(-2==Add()) return -2;
return -1;
}
else
return -2;
}
else
{
Current->c=CharBase.GetAt(Now);
PureAdd=true;
return Now;
}
}
DictCreator::DictCreator(periods* range)
{
periods *run;
int ii=0;
for(int i=0;i<=255;i++)
BaseDict=i;
run=range;
while(run!=NULL)
{
for(int i=run->start;i<=run->end;i++)
{
Dict+=char(BaseDict);
ii++;
}
run=run->next;
}
}
bool DictCreator::Open(const char* DictName)
{
if(DictName!=NULL)
DictFile=fopen(DictName,"w+t");
if(DictFile!=NULL) return true;
else return false;
}
void DictCreator::Close()
{
if(DictFile!=NULL) fclose(DictFile);
}
void DictCreator::Work(int n, int nn)
{
int a;
DictWord *DCW;
for(int i=n;i<=nn;i++)
{
a=0;
DCW = new DictWord(i, Dict);
while(a!=-2)
{
fprintf(DictFile,"%s \n",DCW->GetString(false));
printf("%s \n",DCW->GetString(false));
a=DCW->Add();
}
free(DCW);
}
}
[SIZE="3"]void main()...[/SIZE]
Код:
#include "stdafx.h";
int _tmain(int argc, _TCHAR* argv[])
{
periods r;
r.start=48; r.end=57;
r.next= new periods;
r.next->start=97; r.next->end=122;
r.next->next=NULL;
DictCreator* MyDict;
MyDict= new DictCreator(&r);
MyDict->Open("README.txt");
MyDict->Work(8,8);
MyDict->Close();
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
periods r;
r.start=48; r.end=57;
r.next= new periods;
r.next->start=97; r.next->end=122;
r.next->next=NULL;
DictCreator* MyDict;
MyDict= new DictCreator(&r);
MyDict->Open("README.txt");
MyDict->Work(8,8);
MyDict->Close();
return 0;
}
[SIZE="4"]Прога вторая(кривая и тормозная):[/SIZE]
[SIZE="3"]void main()...[/SIZE]
Код:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
short i=0;
const char Table[36]=
{
'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z'
};
short PasswordCount[8]=
{
0,0,0,0,0,0,0,0
};
while(true)
{
if(false)
{
i++;
next:
PasswordCount++;
if(PasswordCount==36)
{
PasswordCount=0;
i++;
if(i==8)
break;
else
goto next;
}
i=0;
}
PasswordCount++;
if(PasswordCount==36)
{
PasswordCount=0;
i++;
goto next;
}
printf("%c %c %c %c %c %c %c %c \n",Table[PasswordCount[7]],Table[PasswordCount[6]],Table[PasswordCount[5]],Table[PasswordCount[4]],Table[PasswordCount[3]],Table[PasswordCount[2]],Table[PasswordCount[1]],Table[PasswordCount[0]]);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
short i=0;
const char Table[36]=
{
'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z'
};
short PasswordCount[8]=
{
0,0,0,0,0,0,0,0
};
while(true)
{
if(false)
{
i++;
next:
PasswordCount++;
if(PasswordCount==36)
{
PasswordCount=0;
i++;
if(i==8)
break;
else
goto next;
}
i=0;
}
PasswordCount++;
if(PasswordCount==36)
{
PasswordCount=0;
i++;
goto next;
}
printf("%c %c %c %c %c %c %c %c \n",Table[PasswordCount[7]],Table[PasswordCount[6]],Table[PasswordCount[5]],Table[PasswordCount[4]],Table[PasswordCount[3]],Table[PasswordCount[2]],Table[PasswordCount[1]],Table[PasswordCount[0]]);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char i1, i2, i3, i4, i5, i6, i7, i8;
FILE* DictFile = fopen("hi.txt","w+t");
const char Table[]=
{
'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z'
};
char TabSz = sizeof(Table) / sizeof(char);
char Password[9] = {'0', '0', '0', '0',
'0', '0', '0', '0', 0};
for(i1 = 0; i1 < TabSz; ++i1)
{
Password[0] = Table[i1];
for(i2 = 0; i2 < TabSz; ++i2)
{
Password[1] = Table[i2];
for(i3 = 0; i3 < TabSz; ++i3)
{
Password[2] = Table[i1];
for(i4 = 0; i4 < TabSz; ++i4)
{
Password[3] = Table[i4];
for(i5 = 0; i5 < TabSz; ++i5)
{
Password[4] = Table[i5];
for(i6 = 0; i6 < TabSz; ++i6)
{
Password[5] = Table[i6];
for(i7 = 0; i7 < TabSz; ++i7)
{
Password[6] = Table[i7];
for(i8 = 0; i8 < TabSz; ++i8)
{
Password[7] = Table[i8];
printf("%s\n", Password);
fprintf(DictFile, "%s\n", Password);
}
}
}
}
}
}
}
}
fclose(DictFile);
return 0;
}//int _tmain(int argc, _TCHAR* argv[])
А из-за чего моя вторая тормозит я правильно понял, что из-за i?
Лишние операции возникают...
printf("%c %c %c %c %c %c %c %c \n",Table[PasswordCount[7]],Table[PasswordCount[6]],Table[PasswordCount[5]],Table[PasswordCount[4]],Table[PasswordCount[3]],Table[PasswordCount[2]],Table[PasswordCount[1]],Table[PasswordCount[0]]);
--Странно, у меня не быстрее
У меня на обработку
00001000-
00004000
Первая твоя -16сек, моя - 13сек.
А как профилируете?
Силой моска :):):):)
Я ж сказал "скорее всего".
Ваш моск дает не полную информацию, воспользуйтесь профайлером.
Не факт
>>воспользуйтесь профайлером.
А зачем?
Не факт
[/QUOTE]
Привык работать "на глазок"? :)
[QUOTE=Alexandoros]
>>воспользуйтесь профайлером.
А зачем?[/QUOTE]
Чтобы получить реальную картину производительности и узкие места в ней, а не разводить кустарщину.
Чтобы получить реальную картину производительности и узкие места в ней, а не разводить кустарщину.[/QUOTE]
Я неправильно выразился.
"Мне зачем?" :)
Чтобы получить реальную картину производительности и узкие места в ней, а не разводить кустарщину.[/QUOTE]
Вот это в рамочку и на стенку. Имхо, писать без профайлинга что то серьезное, особенно системное - это бредовая самоуверенность.
Помню, как я однажды пробовал реализовать перехват API :D на глазок...