论坛: 编程破解 标题: 原创:用TC打造自己的黑客字典 复制本贴地址    
作者: 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号