天马行空工作室

 找回密码
 加入天马
搜索
查看: 5460|回复: 11

【C语言】【控制台】CSDN600万用户信息查询

[复制链接]
发表于 2012-9-10 18:56:20 | 显示全部楼层 |阅读模式



之前csdn用户数据库泄密事件发生的时候,拿到了一份。这个小程序就是用于查询其中信息。类似于社工库之类的查询。不过没有社工库的数据库那么齐全……




程序名称:CSDN600万用户信息查询
编译器:vs2010(其它也可以……)
程序大小:171K
文件包括:CSDN600万用户信息查询.exe
程序界面: (黑窗体)





























评分

参与人数 1自由 +2 给力 +5 酱油 +10 收起 理由
random_ + 2 + 5 + 10 天马行空,yes!

查看全部评分

 楼主| 发表于 2012-9-10 18:57:34 | 显示全部楼层




首先需要数据库,为了程序查询方便,我将它切成二百多个文件,每个1024K










 楼主| 发表于 2012-9-10 18:58:15 | 显示全部楼层


数据库内容格式:用户名 # 密码 #
邮箱

于是可以根据输入内容,然后构造字符串进行查询。


printf("\n\n信息的类型:\n\n1.模糊查找\n\n2.是用户名或密码\n\n3.只是密码\n\n4.是邮箱前缀\n\n选择:");
scanf("%d",&type);

//用户名或密码

sprintf(info,"%s #",info);


//只是密码
strcpy(info2,"# ");
strcat(info2,info);
strcat(info2," #");
strcpy(info,info2);


//是邮箱前缀

strcpy(info2,"# ");
strcat(info2,info);
strcat(info2,"@");
strcpy(info,info2);



最后使用每次读取数据库一行再用strstr进行对比查找。

这就是基本思路。但是总是这样的话,估计查询一次需要半天以上的时间……。
于是还需要使用多线程技术。让查询时间在一辆分钟……







 楼主| 发表于 2012-9-10 18:58:45 | 显示全部楼层
线程


/********************************************************************************

线程回调函数

********************************************************************************/


DWORD WINAPI ThreadFunc( LPVOID lp ) //线程函数
{
int nowfile;char filename[MAX_PATH]={0};

EnterCriticalSection(&gcs);//进入临界区
nowfile= NowThreadItem++;
LeaveCriticalSection(&gcs);//离开临界区

sprintf(filename,"%swww.csdn.net\\%d__www.csdn.net.sql",DIRFile,nowfile);
readfile(filename);//读取文件并查询

InterlockedExchangeAdd((long *)&allThreadNum,-1); //线程数-1
return 0;
}



/********************************************************************************

创建线程

********************************************************************************/

void createThread(){

int port;
InitializeCriticalSection(&gcs);//初始化临界区
for( port=1;port<=274;port++)
{

HANDLE hThread=CreateThread( NULL,0,ThreadFunc,NULL, 0,NULL);
allThreadNum++;

}
}





然后就没有然后了



源代码文件就一个:CSND.c



 楼主| 发表于 2012-9-10 19:00:38 | 显示全部楼层





/******************************************************************************


开始全部源代码吧……

******************************************************************************/


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<Windows.h>
  4. CRITICAL_SECTION gcs;
  5. int NowThreadItem=1;//当前线程
  6. int allThreadNum=0;//运行中的所有线程
  7. char info[50];
  8. FILE *p2;
  9. char DIRFile[MAX_PATH]={0};
  10. int isok=0;








  11. /*************************************************************************************************************

  12. 查找目标是否在读取的字符串里面

  13. *************************************************************************************************************/


  14. int IsInfo(char *readFile){

  15. if(strstr(readFile,info)!=NULL){

  16. return 1;
  17. }else return 0;
  18. }



  19. /*************************************************************************************************************

  20. 读取文件,每次一行循环读取

  21. *************************************************************************************************************/



  22. void readfile(char *filename){
  23. FILE *p;char mg[100];
  24. p=fopen(filename,"r");

  25. if (p == NULL)
  26.   {
  27.    printf("打开文件失败:%s",filename);
  28.    perror ("File open error!\n");
  29.   return;
  30.   }

  31.   
  32. while ((fgets (mg,100, p)) != NULL)
  33. {
  34.   if(IsInfo(mg)==1){//如果有查找的内容那就显示出来并写入文件。

  35.    fputs(mg,p2);
  36.    puts (mg);
  37.    isok=1;
  38.   }
  39. }
  40. fclose(p);


  41. }

  42. /*************************************************************************************************************

  43. 线程回调函数

  44. *************************************************************************************************************/



  45. DWORD WINAPI ThreadFunc( LPVOID lp ) //线程函数
  46. {   
  47. int nowfile;char filename[MAX_PATH]={0};

  48. EnterCriticalSection(&gcs);//进入临界区
  49. nowfile= NowThreadItem++;
  50. LeaveCriticalSection(&gcs);//离开临界区
  51. sprintf(filename,"%swww.csdn.net\\%d__www.csdn.net.sql",DIRFile,nowfile);
  52. readfile(filename);
  53. InterlockedExchangeAdd((long *)&allThreadNum,-1); //线程数-1
  54. return 0;
  55. }



  56. /*************************************************************************************************************

  57. 创建线程

  58. *************************************************************************************************************/

  59. void createThread(){
  60.   
  61. int port;
  62. InitializeCriticalSection(&gcs);//初始化临界区
  63. for( port=1;port<=274;port++)
  64. {
  65.      
  66.   
  67.   HANDLE hThread=CreateThread( NULL,0,ThreadFunc,NULL, 0,NULL);
  68. allThreadNum++;

  69. }

  70. }

  71. /*************************************************************************************************************

  72. 得到当前目录

  73. *************************************************************************************************************/


  74. void GetDir(char EXEFile[],char DIRFile[]){

  75. int i=strlen(EXEFile);int j=0;
  76. for(;(EXEFile[i]!='\\')&&(EXEFile[i]!='/');i--);
  77. for(;j<=i;j++){

  78. DIRFile[j]=EXEFile[j];

  79. }
  80. DIRFile[++j]='\0';
  81. }



  82. /*************************************************************************************************************

  83. 得到的内容不能直接作为文件名,需要检验其合法性

  84. *************************************************************************************************************/


  85. void CheckTitle(char Title[]){
  86. int k;
  87. for( k=0;k<strlen(Title);k++){


  88.   if((Title[k]=='\\')||(Title[k]=='/')||(Title[k]==':')||(Title[k]=='<')||(Title[k]=='>')||(Title[k]=='*')||(Title[k]=='?')||(Title[k]=='"')||(Title[k]=='|')){
  89.   
  90.   Title[k]='-';
  91.   
  92.   }


  93. }

  94. }



  95. /*************************************************************************************************************

  96. 程序说明

  97. *************************************************************************************************************/


  98. void megShow(){

  99. printf("\n\n\t\t【CSDN-中文IT社区-600万用户信息查询--光影】\n\n\n\n");
  100. printf("使用说明:按照提示输入查询的内容,程序将开始查询相关信息.\n查询到的信息将显示在屏幕上,同时写入目录下的文件中.\n完成查询后出现会自动打开记录信息的文件。\n\n");
  101. printf("模糊查找可以找到更多相关的信息,但是有时候结果比较多,需要用户自己筛选\n\n其它查找方式比较精确,但很容易查找不到信息\n\n");

  102. }




  103. /*************************************************************************************************************

  104. 主函数

  105. *************************************************************************************************************/


  106. int main(int argc,char *argv[]){

  107. char EXEFile[MAX_PATH]={0},saveFile[MAX_PATH]={0},filetitle[50],info2[50];
  108. int type=1;
  109. system("color 0A");
  110. GetModuleFileNameA(NULL,EXEFile,MAX_PATH);
  111. GetDir(EXEFile,DIRFile);
  112. //帮助
  113. if(argc==2){

  114.   if(strcmp(argv[1],"/?")==0){
  115.   
  116.    megShow();
  117.    return 0;
  118.   }else{
  119.    printf("\n\n命令格式:%s 查找内容 模式[1-4]\n\n",argv[0]);
  120.    return 0;
  121.   }
  122. }
  123. //带参数运行
  124. else if(argc==3){

  125.     if(strlen(argv[1])>50){
  126.      printf("您需要查找的信息太长了");
  127.      return 0;
  128.     }else {
  129.   
  130.     strcpy(info,argv[1]);
  131.     type=atoi(argv[2]);
  132.     }

  133. }
  134. //直接运行
  135. else{
  136.   megShow();
  137.   printf("输入查找的信息:");

  138.   scanf("%s",info);
  139.   getchar();
  140.   if(strlen(info)>50){
  141.   printf("您需要查找的信息太长了");
  142.   return 0;
  143.   }
  144.   printf("\n\n信息的类型:\n\n1.模糊查找\n\n2.是用户名或密码\n\n3.只是密码\n\n4.是邮箱前缀\n\n选择:");
  145.   scanf("%d",&type);
  146.   getchar();
  147. }

  148. strcpy(filetitle,info);
  149. CheckTitle(filetitle);
  150. sprintf(saveFile,"%s%s.txt",DIRFile,filetitle);

  151. p2=fopen(saveFile,"w+");
  152. if (p2 == NULL)
  153.   {
  154.    printf("打开文件失败:%s",saveFile);
  155.   perror ("File open error!\n");
  156.   return;
  157.   }
  158.   if(type==2){//用户名或密码

  159.    sprintf(info,"%s #",info);
  160.   
  161. }else if(type==3){//只是密码

  162.   strcpy(info2,"# ");
  163.   strcat(info2,info);
  164.   strcat(info2," #");
  165.   strcpy(info,info2);
  166.   
  167. }else if(type==4){//是邮箱前缀

  168.   strcpy(info2,"# ");
  169.   strcat(info2,info);
  170.   strcat(info2,"@");
  171.   strcpy(info,info2);
  172.   
  173.   
  174. }
  175. printf("\n\n正在查询……\n\n");
  176. createThread();
  177. //等待线程结束
  178. while(allThreadNum>0){
  179.   
  180.   Sleep(100);

  181. }
  182. if(isok==0){
  183.   printf("\n\n查询目标并没有在CSDN库中:%s",info);
  184.   getchar();
  185.   fclose(p2);
  186.   DeleteFileA(saveFile);

  187. }else{
  188.   
  189. printf("\n\n【查找完成,按下回车键写入并打开文档】");
  190. getchar();
  191. fclose(p2);
  192. ShellExecuteA(NULL,"open","NOTEPAD.EXE",saveFile,NULL,SW_SHOWNORMAL); //打开文件
  193. }
  194. return 0;
  195. }



复制代码
 楼主| 发表于 2012-9-10 19:01:31 | 显示全部楼层




/*****************************************************************************************************


以上全部完成!


*****************************************************************************************************/






    / \./ \/\_   I Hand You
  __{^\_ _}_  ) }/^\    A Rose...
 / /\_/^\._}_/ // /
( (__{(@)}\__}.//_/__A___A______A_______A______A____
 \__/{/(_)\_} )\\ \\---v----V-----V--Y----v---Y-----
  (  (__)_)_/ )\ \>  
   \__/   \__/\/\/                                   光影:黑暗天使
    \__,--'     时间:2012年9月10日18:59:32







 楼主| 发表于 2012-9-10 19:06:20 | 显示全部楼层




数据库文件下载:http://www.everbox.com/f/KVfMZMk3yPDyPAYhp6a1kXVUmp


源代码工程下载:



CSDN600万用户信息查询.zip

119.72 KB, 下载次数: 521

发表于 2012-9-11 00:04:54 | 显示全部楼层
支持下。。。。。真厉害
发表于 2012-9-11 16:39:09 | 显示全部楼层
很给力
发表于 2012-9-17 09:26:50 | 显示全部楼层
很方便!
您需要登录后才可以回帖 登录 | 加入天马

本版积分规则

Archiver|手机版|小黑屋|天马行空工作室 ( 京ICP备12003429号  

GMT+8, 2019-11-21 19:44 , Processed in 1.296678 second(s), 25 queries .

Powered by Discuz! v8

© 2010-2014 【C语言】【控制台】CSDN600万用户信息查询 - C\C++ 天马行空工作室

快速回复 返回顶部 返回列表