|
![]() | 作者: jhkdiy [jhkdiy]
![]() |
登录 |
其实大家看了我这篇文章后,可以举一反三,产生任何组合的字典都能做出来,当然了,这要看大家的本事喽,而且产生字典的速度非常快,希望大家讨论讨论,如果大家要转载此文章的话,请保留作者信息,谢谢。 编译环境:Win98+Turboc C2.0英文版 用TC打造自己的字典程序 作者:jhkdiy 我想做黑客没有人会不知道字典,也没有那位黑客是从来没有用过字典的,因为字典是破解的必备工具,居然它那么重要,有没有想过自己做个试试看呢。别怕字典程序复杂,别怕做字典程序要什么高深的知识,只要你想的到,你就做的到。废话少说,我们用众所周知的Turbo C 2.0来做个字典程序,但话又说回来,这个程序比起那些专业的字典制作程序当然就逊色很多了,不过重要的是我们能学到东西,OK。 让我们来讨论一下密码吧,大多数用户的密码都在8位数以下,我们这个字典程序的密码长度上限就设定在8位,最低当然是1位了,不过有多少人会设自己的密码为一位呀,呵呵,不理了;说说这个字典程序的制作原理吧,假如现在要生成3位数的小写字母密码,第一个当然是aaa了,第二个就是aab跟着是aac、aad、aae……..直到zzz,那么要怎样用程序实现这个功能呢?方法是用for循环,小写字母不是有26个吗,也就是每一位循环26次即可输出字母来,即aaa、aab、aac当到了aaz后,第一位即从a循环到z了,第二、第三位也是如此,这样我们就能生成从aaa到zzz的密码了。大写字母的密码也一样,具体怎样实现呢,别急,我先说说做这个字典程序应掌握的知识: 1:有关Ascii码的知识,如a对应的Ascii码是多少,数字3对应的又是多少等。 2:C语言中的字符知识。 3:C语言中的文件操作知识,如打开文件,写入数据等。 4:一点键盘控制的知识。 5:当然是基础知识了,呵呵。 本程序利用了一个关键的知识点,不知大家是否知道小写字母和大写字母之间的Ascii码的关系,字母a的Ascii值是122,而大写字母A的Ascii值是90,a-A=32,b-B=32; c-C=32…….z-Z=32;由此可见小写字母和大写字母的Ascii值刚好相差32,我们在输出大写字母时只要将小写字母减去32即可输出大写字母。 好了,下面就来看看这个程序的伪代码: 包含相关的头文件 定义常数 int main(void) { 定义相关变量; 定义一个文件指针; 清屏; 提示用户输入一个完整的文件名;/*即包含扩展名或路径*/ 获取和输出文件名; 提示用户输入字典的最小长度; 获取字典最小长度; /*对字典的最小长度进行校验*/ while(最小长度<=0 或 >最大字典长度) { 提示用户输入的数有误,并需重新输入; 获取字典的最小长度; } 提示用户输入字典的最大长度; 获取字典的最大长度; while(输入>最大长度 或 <最小长度) { 提示用户输入有误,并需要重新输入; 获取字典最大长度; } 提示用户是否包含大写字母; 如果是则记下; /*为写入数据打开一个文件*/ if(打开文件不成功) { 提示用户打开文件不成功; 退出本程序; } 提示用户正在制作字典; /*以下程序段是字典制作的核心*/ switch(字典最小长度) { case 1: { for(变量=字母a的Ascii码值;变量<=Z的Ascii值;变量++) { /*写入文件*/ fprintf(文件指针,“%C\n”,变量); if(需要大写字母) {fprintf(文件指针,“%C\n”,变量-32);} } if(字典最大长度==1) { 关闭文件指针; break; } } case 2: { for循环; for循环; { fprintf(文件指针,“%C%C\n”,变量1,变量2); } if(需要大写字母) {fprintf(文件指针,“%c%c\n”,变量1-32,变量2-32);} if(字典最大长度==2) { 关闭文件指针; break; } } case 3: { 同case2,略 } case 4 { 同case3,略 } case 5 { /* 制作3位字母和2位数字的密码;*/ } case 6 { /* 制作3位字母和3位数字的密码;*/ } case 7 { /* 制作4位字母和3位数字的密码;*/ } case 8 { /* 制作4位字母和4位数字的密码;*/ /* 关闭文件指针;*/ } } 提示用户字典制作完成; 退出程序; return 0; } 完整的源程序如下: #include <Stdio.h> #include <Conio.h> #include <Bios.h> /*检测用户键盘的输入状况*/ #define MAXlength 8 /*定义字典最大长度为8*/ #define MINlength 1 /*定义字典最小长度为1*/ #define MAX_number 57 /*定义数值9得Ascii码*/ #define MIN_number 48 /*定义数值0得Ascii码*/ #define MAX_up_char 90 /*定义大写字母Z的Ascii码*/ #define MIN_up_char 65 /*定义大写字母A的Ascii码*/ #define MAX_low_char 122 /*定义小写字母z的Ascii码*/ #define MIN_low_char 97 /*定义小写字母a的Ascii码*/ #define True 1 #define False 0 int main(void) { int include_upper=False; /*是否包含大写字母*/ int maxlength,minlength; /*定义字典最大长度和最小长度*/ int a,b,c,d,e,f,g,h; /*一些循环变量*/ char filename[20]; /*输出文件时用到的文件名*/ FILE *dicfile; /*定义一个文件类型的变量*/ clrscr(); /*清屏*/ printf("\nPlease input full filename for this dic file:"); /*获取文件名*/ gets(filename); printf("\nDic file name:%s\n",filename); /*叫用户输入字典的最小长度*/ printf("\nPlease input min length(value>=1):"); scanf("%d",&minlength); while(minlength<=0 | minlength>MAXlength) { clrscr(); printf("\nerror:Number must <= 8 and >=1\n""\nPlease input min length number again:"); scanf("%d",&minlength); } printf("\nPlease input max length(value>=%d and <=8):",minlength); scanf("%d",&maxlength); while(maxlength>MAXlength | maxlength<minlength) { clrscr(); printf("\nerror:Number must <=8 and >=%d!\n" "\nPlease input max length number again:",minlength); scanf("%d",&maxlength); } /*询问用户是否包含大写字母*/ printf("\nIncluding upper character A-Z (y/n)?"); if(getch()=='y')include_upper=True; /*尝试打开文件,如果返回NULL值,则代表文件名或路径有错*/ if((dicfile=fopen(filename,"w"))==NULL) { clrscr(); printf("\nerror:Cannot open this file\n" "Press any key to exit!"); getch(); exit(0); } printf("\nMaking......\n" "Please wait...\n" "Press any key to exit...\n"); /*下面是程序的核心部分*/ /*用Switch语句来检测字典的最小长度*/ switch(minlength) { case 1: { /*利用for循环来产生字典,在指定的文件中输出字典*/ for(a=MIN_low_char;a<=MAX_low_char;a++) { fprintf(dicfile,"%c\n",a); } /*检测是否包含大写字母*/ if(include_upper) { for(a=MIN_up_char;a<=MAX_up_char;a++) fprintf(dicfile,"%c\n",a); } /*如果字典的最大长度就是1,则关闭文件指针,然后退出程序*/ if(maxlength==1) { fclose(dicfile); break; } } case 2: { for(a=MIN_low_char;a<=MAX_low_char;a++) for(b=MIN_low_char;b<=MAX_low_char;b++) { fprintf(dicfile,"%c%c\n",a,b); if(include_upper) { fprintf(dicfile,"%c%c\n",a-32,b-32); fprintf(dicfile,"%c%c\n",a-32,b); fprintf(dicfile,"%c%c\n",a,b-32); } } if(maxlength==2) { fclose(dicfile); break; } } case 3: { for(a=MIN_low_char;a<=MAX_low_char;a++) for(b=MIN_low_char;b<=MAX_low_char;b++) for(c=MIN_low_char;c<=MAX_low_char;c++) { fprintf(dicfile,"%c%c%c\n",a,b,c); if(include_upper) { fprintf(dicfile,"%c%c%c\n",a-32,b-32,c-32); fprintf(dicfile,"%c%c%c\n",a-32,b-32,c); fprintf(dicfile,"%c%c%c\n",a,b-32,c-32); fprintf(dicfile,"%c%c%c\n",a-32,b,c-32); fprintf(dicfile,"%c%c%c\n",a-32,b,c); fprintf(dicfile,"%c%c%c\n",a,b-32,c); fprintf(dicfile,"%c%c%c\n",a,b,c-32); } } if(maxlength==3) { fclose(dicfile); break; } } case 4: { for(a=MIN_low_char;a<=MAX_low_char;a++) for(b=MIN_low_char;b<=MAX_low_char;b++) for(c=MIN_low_char;c<=MAX_low_char;c++) for(d=MIN_low_char;d<=MAX_low_char;d++) { fprintf(dicfile,"%c%c%c%c\n",a,b,c,d); if(include_upper) { fprintf(dicfile,"%c%c%c%c\n",a,b,c,d-32); fprintf(dicfile,"%c%c%c%c\n",a,b,c-32,d-32); fprintf(dicfile,"%c%c%c%c\n",a,b-32,c-32,d-32); fprintf(dicfile,"%c%c%c%c\n",a,b-32,c,d); fprintf(dicfile,"%c%c%c%c\n",a,b-32,c-32,d); fprintf(dicfile,"%c%c%c%c\n",a,b,c-32,d); fprintf(dicfile,"%c%c%c%c\n",a,b-32,c,d-32); fprintf(dicfile,"%c%c%c%c\n",a-32,b,c,d); fprintf(dicfile,"%c%c%c%c\n",a-32,b-32,c,d); fprintf(dicfile,"%c%c%c%c\n",a-32,b-32,c-32,d); fprintf(dicfile,"%c%c%c%c\n",a-32,b-32,c-32,d-32); fprintf(dicfile,"%c%c%c%c\n",a-32,b,c,d-32); fprintf(dicfile,"%c%c%c%c\n",a-32,b,c-32,d); fprintf(dicfile,"%c%c%c%c\n",a-32,b-32,c,d-32); fprintf(dicfile,"%c%c%c%c\n",a-32,b,c-32,d-32); } /*这里因为产生字典的时间比较长,所以设置当用户按下任意键后退出程序*/ if(bioskey(1)!=0)goto quit; } if(maxlength==4) { fclose(dicfile); break; } } case 5: { for(a=MIN_low_char;a<=MAX_low_char;a++) for(b=MIN_low_char;b<=MAX_low_char;b++) for(c=MIN_low_char;c<=MAX_low_char;c++) for(d=MIN_number;d<=MAX_number;d++) for(e=MIN_number;e<=MAX_number;e++) { fprintf(dicfile,"%c%c%c%c%c\n",a,b,c,d,e); if(include_upper) { fprintf(dicfile,"%c%c%c%c%c\n",a-32,b,c,d,e); } if(bioskey(1)!=0)goto quit; } if(maxlength==5) { fclose(dicfile); break; } } case 6: { for(a=MIN_low_char;a<=MAX_low_char;a++) for(b=MIN_low_char;b<=MAX_low_char;b++) for(c=MIN_low_char;c<=MAX_low_char;c++) for(d=MIN_number;d<=MAX_number;d++) for(e=MIN_number;e<=MAX_number;e++) for(f=MIN_number;f<=MAX_number;f++) { fprintf(dicfile,"%c%c%c%c%c%c\n",a,b,c,d,e,f); if(include_upper) { fprintf(dicfile,"%c%c%c%c%c%c\n",a-32,b,c,d,e,f); } if(bioskey(1)!=0)goto quit; } if(maxlength==6) { fclose(dicfile); break; } } case 7: { for(a=MIN_low_char;a<=MAX_low_char;a++) for(b=MIN_low_char;b<=MAX_low_char;b++) for(c=MIN_low_char;c<=MAX_low_char;c++) for(d=MIN_low_char;d<=MAX_low_char;d++) for(e=MIN_number;e<=MAX_number;e++) for(f=MIN_number;f<=MAX_number;f++) for(g=MIN_number;g<=MAX_number;g++) { fprintf(dicfile,"%c%c%c%c%c%c%c\n",a,b,c,d,e,f,g); if(include_upper) { fprintf(dicfile,"%c%c%c%c%c%c%c\n",a-32,b,c,d,e,f,g); } if(bioskey(1)!=0)goto quit; } if(maxlength==7) { fclose(dicfile); break; } } case 8: { for(a=MIN_low_char;a<=MAX_low_char;a++) for(b=MIN_low_char;b<=MAX_low_char;b++) for(c=MIN_low_char;c<=MAX_low_char;c++) for(d=MIN_low_char;d<=MAX_low_char;d++) for(e=MIN_number;e<=MAX_number;e++) for(f=MIN_number;f<=MAX_number;f++) for(g=MIN_number;g<=MAX_number;g++) for(h=MIN_number;h<=MAX_number;h++) { fprintf(dicfile,"%c%c%c%c%c%c%c%c\n",a,b,c,d,e,f,g,h); if(include_upper) { fprintf(dicfile,"%c%c%c%c%c%c%c%c\n",a-32,b,c,d,e,f,g,h); } if(bioskey(1)!=0)goto quit; } fclose(dicfile); break; } default: quit: fclose(dicfile); } printf("\nMake dic succeed!" "\nPress any key to exit!\n"); getch(); return 0; } C++参考如下: #include <iostream.h> #include <fstream.h> #include <string.h> #define MAX_char 122 #define MIN_char 97 int main() { int a,b,c,d; char ok; char filename[20]; cout<<"Please input filename:"; cin>>filename; ofstream outfile(filename); cout<<"\nThe filename is:" <<filename <<"\n\a\aAre you sure to go(y/n)?"; cin>>ok; if(ok!='y')return -1; if(!outfile) { cout<<"\a\a\aError:unable to open output file!"<<endl; return -2; } for(a=MIN_char;a<=MAX_char;a++) for(b=MIN_char;b<=MAX_char;b++) for(c=MIN_char;c<=MAX_char;c++) for(d=MIN_char;d<=MAX_char;d++) { outfile<<(char)a<<(char)b<<(char)c<<(char)d<<endl; } cout<<"\n\a\a\a\aOK! all done!"<<endl; return 0; } |
地主 发表时间: 11/14 19:39 |
![]() | 回复: newmyth21 [newmyth21] ![]() |
登录 |
你真行。佩服.我顶。 |
B1层 发表时间: 11/14 19:57 |
![]() | 回复: cncd [cncd] ![]() |
登录 |
支持原创! |
B2层 发表时间: 11/14 20:06 |
![]() | 回复: lwei889 [lwei889] ![]() |
登录 |
刚运行过,佩服,不过我不太会用生成后的文件!顶 |
B3层 发表时间: 11/14 20:11 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
教教大家怎样用生成后的文件: Please input full filename for this dic file: 1:首先程序会问字典的文件名 Please input min length(value>=1): 2:问字典的最小长度 Please input max length(value>=%d and <=8): 3:问字典的最大长度 Including upper character A-Z (y/n)? 4:问是否包含大写字母 |
B4层 发表时间: 11/15 02:06 |
![]() | 回复: lwei889 [lwei889] ![]() |
登录 |
呵呵,我是说生成后的文件哦,我运行了该程序后,在我的机子生成了一个文件我不知道用什么方式打开,在 dos 可以用type把它给显示出来,不过是个死循环哦,要用ctrl+break才行 ? |
B5层 发表时间: 11/15 11:08 |
![]() | 回复: jhkdiy [jhkdiy] ![]() |
登录 |
你在输入文件名时要记得输入扩展名,如 mydic.txt 在windows中用记事本就可以打开了,进入死循环可能是文件太大造成的 大家还有疑问可以继续发表 |
B6层 发表时间: 11/15 13:47 |
![]() | 回复: realpope [realpope] ![]() |
登录 |
好东西~~ |
B7层 发表时间: 11/15 15:20 |
![]() | 回复: jfyygymtdh [jfyygymtdh] ![]() |
登录 |
东西好.就是不会用.哈哈. |
B8层 发表时间: 03-12-23 12:29 |
![]() | 回复: ysfilone [ysfilone] ![]() |
登录 |
楼主不介意我把你的源代码保留下来吧 供我参考以下……呵呵 |
B9层 发表时间: 03-12-25 07:16 |
![]() | 回复: 286 [unique] ![]() |
登录 |
不错,我也写过一个,请参阅“打造全能黑客字典。” |
B10层 发表时间: 03-12-25 10:00 |
![]() | 回复: yxzst [yxzst] ![]() |
登录 |
为什么我运行后得到的.txt只有689KB呢?并且只有三位字母。 |
B11层 发表时间: 03-12-25 16:38 |
![]() | 回复: SilentSlave [silent] ![]() |
登录 |
利用 switch( )语句的特点,在第一个满足条件的地方一直执行下去 结合if(maxlength== ) { fclose(dicfile); break; } 从而达到生成不同长度的dic。 ![]() [此贴被 SilentSlave(silent) 在 07月22日21时03分 编辑过] |
B12层 发表时间: 04-07-21 10:04 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号