论坛: 编程破解 标题: C源码:生成一个自己的口令字典 复制本贴地址    
作者: newmyth21 [newmyth21]    论坛用户   登录



转载*****
 
  使用一个单词文件,本程序只考虑单个单词的大小写变形和两个变形单词的组合,由此生成一个字典,
    例如对于hello和unix两个单词的单词文件,本程序可生成:
hello
Hello
HELLO
unix
Unix
UNIX
hellounix
helloUnix
helloUNIX
Hellounix
HelloUnix
HelloUNIX
HELLOunix
HELLOUnix
HELLOUNIX
UNIXHELLO
UNIXhello
UNIXHello
unixHELLO
unixhello
unixHello
UnixHELLO
Unixhello
UnixHello
    由此可见,我这种简单的方法能生成的口令字典也是很大的。如果你的口令能在这种字典中找到,那么
    被别人破解也是几秒钟的事情!
    单词文件 PWDICT.PWS 举例如下:
root
2000
server
sco
unix
hello
    运行程序命令是: PWDICT.EXE < PWDICT.PWS > PWDICT.DIC
    本程序使用了递归和输入、输出重定向。
    PWDICT.C 源程序如下:(单词文件最多支持300个单词,每个单词最长20个字符)

/* pwdict.c --- Generate passwd dict
  M.L.Y 2001.2
*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX_STRING_LEN            20
#define MAX_PWS                    300

char *upperstr(char *str)
{
  int  i, n;

  n = strlen((char *)str);
  for(i = 0; i < n; i++)
    str[i] = toupper(str[i]);
  return str;
}

char *lowerstr(char *str)
{
  int  i, n;

  n = strlen((char *)str);
  for(i = 0; i < n; i++)
    str[i] = tolower(str[i]);
  return str;
}

char *capstr(char *str)
{
  str[0] = toupper(str[0]);
  return str;
}

int  disp_pd(char *s1, char *s2)
{
  int n1, n2;

  n1 = strlen(s1);
  n2 = strlen(s2);
  if(n1 == 0 && n2 == 0) return 0;
  if(n1 == 0 || n2 == 0) return printf("%s%s\n", s1, s2);
  printf("%s%s\n", s1, s2);
  printf("%s%s\n", s2, s1);
  return 1;
}

int  gen_pd2s(char *s1, char *s2, int mode)
{
  char ts1[MAX_STRING_LEN+1], ts2[MAX_STRING_LEN+1];
  int  k1 = 0, k2 = 0, n1, n2;

  n1 = strlen(s1);
  n2 = strlen(s2);
  if(n1 == 0 || n2 == 0) return 0;
  if(n1 > MAX_STRING_LEN || n2 > MAX_STRING_LEN) return 0;
  strcpy(ts1, s1);
  if(strcmp(s1, capstr(strcpy(ts1, s1))) == 0) k1 = 3;
  else if(strcmp(s1, upperstr(ts1)) == 0) k1 = 2;
  else if(strcmp(s1, lowerstr(ts1)) == 0) k1 = 1;
  strcpy(ts2, s2);
  if(strcmp(s2, capstr(strcpy(ts2, s2))) == 0) k2 = 3;
  else if(strcmp(s2, upperstr(ts2)) == 0) k2 = 2;
  else if(strcmp(s2, lowerstr(ts2)) == 0) k2 = 1;
  if(mode == 1)
  {
    printf("%s\n", s1);
    if(isalpha(ts1[0]))
    {
      if(k1 != 3) printf("%s\n", capstr(strcpy(ts1,s1)));
      if(k1 != 2) printf("%s\n", upperstr(ts1));
      if(k1 != 1) printf("%s\n", lowerstr(ts1));
    }
    printf("%s\n", s2);
    if(isalpha(ts2[0]))
    {
      if(k2 != 3) printf("%s\n", capstr(strcpy(ts2,s2)));
      if(k2 != 2) printf("%s\n", upperstr(ts2));
      if(k2 != 1) printf("%s\n", lowerstr(ts2));
    }
    if(!isalpha(ts1[0])) return gen_pd2s(s1, s2, 2);
    gen_pd2s(upperstr(ts1), s2, 2);
    gen_pd2s(lowerstr(ts1), s2, 2);
    if(k1 == 0 || k1 == 3) gen_pd2s(s1, s2, 2);
    if(k1 != 3) gen_pd2s(capstr(strcpy(ts1,s1)), s2, 2);
  }
  if(mode == 2)
  {
    if(!isalpha(ts2[0])) return disp_pd(s1, s2);
    disp_pd(s1, upperstr(ts2));
    disp_pd(s1, lowerstr(ts2));
    if(k2 == 0 || k2 == 3) disp_pd(s1, s2);
    if(k2 != 3) disp_pd(s1, capstr(strcpy(ts2, s2)));
  }
  return 0;
}

int  main()
{
  char ps[MAX_PWS][MAX_STRING_LEN+1];
  int  i, j, n;

  for(n = 0; n < MAX_PWS; n++)
  {
    ps[n][0] = '\0';
    gets(ps[n]);
    if(strlen(ps[n]) == 0) break;
  }
  for(i = 0; i < n-1; i++)
    for(j = i+1; j < n; j++)
      gen_pd2s(ps[i], ps[j], 1);
  return 0;
}

/* End of file. */




地主 发表时间: 04-01-24 17:15

回复: newmyth21 [newmyth21]   论坛用户   登录
我只是转出来看看的,是不是好老,怎么没人啊

可是好像是新的啊

B1层 发表时间: 04-01-24 17:57

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号