依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 23|回复: 0

C/C++读取纯真QQIP地址数据库

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12008
发表于 7 天前 | 显示全部楼层 |阅读模式
C/C++读取纯真QQIP地址数据库
程序说明:能够根据输入的IP,在 纯真IP数据库 中,搜索并且读取对应的 物理地址,还可以导出所有的IP段地址信息。
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <process.h>



  4. #define QQWRY "QQWry.dat"
  5. #define REDIRECT_MODE_1 0x01
  6. #define REDIRECT_MODE_2 0x02
  7. #define MAXBUF 255

  8. /*unsigned long getValue( 获取文件中指定的16进制串的值,并返回
  9. FILE *fp, 指定文件指针
  10. unsigned long start, 指定文件偏移量
  11. int length) 获取的16进制字符个数/长度
  12. */
  13. unsigned long getValue(FILE *fp, unsigned long start, int length)
  14. {
  15.     unsigned long variable=0;
  16.     long i;
  17.     long *val = new long[length];

  18.     fseek(fp,start,SEEK_SET);
  19.     for(i=0;i<length;i++)
  20.     {
  21.         /*过滤高位,一次读取一个字符*/
  22.         val[i]=fgetc(fp)&0x000000FF;
  23.     }
  24.     for(i=length-1;i>=0;i--)
  25.     {
  26.         /*因为读取多个16进制字符,叠加*/
  27.         variable=variable*0x100+val[i];
  28.     }
  29.     if(val!=NULL)
  30.     {
  31.         delete val;
  32.         val = NULL;
  33.     }
  34.     return variable;
  35. };


  36. /*int getString( 获取文件中指定的字符串,返回字符串长度
  37. FILE *fp, 指定文件指针
  38. unsigned long start, 指定文件偏移量
  39. char **string) 用来存放将读取字符串的字符串空间的首地址
  40. */
  41. int getString(FILE *fp, unsigned long start, char **string)
  42. {
  43.     unsigned long i=0;
  44.     char val;
  45.     fseek(fp,start,SEEK_SET);
  46.     /*读取字符串,直到遇到0x00为止*/
  47.     do
  48.     {
  49.         val=fgetc(fp);
  50.         /*依次放入用来存储的字符串空间中*/
  51.         *(*string+i)=val;
  52.         i++;
  53.     }while(val!=0x00);
  54.     /*返回字符串长度*/
  55.     return i;
  56. };


  57. /*void getAddress( 读取指定IP的国家位置和地域位置
  58. FILE *fp, 指定文件指针
  59. unsigned long start, 指定IP在索引中的文件偏移量
  60. char **country, 用来存放国家位置的字符串空间的首地址
  61. char **location) 用来存放地域位置的字符串空间的首地址
  62. */
  63. void getAddress(FILE *fp, unsigned long start, char **country, char **location)
  64. {
  65.     unsigned long redirect_address,counrty_address,location_address;
  66.     char val;

  67.     start+=4;
  68.     fseek(fp,start,SEEK_SET);
  69.     /*读取首地址的值*/
  70.     val=(fgetc(fp)&0x000000FF);

  71.     if(val==REDIRECT_MODE_1)
  72.     {
  73.         /*重定向1类型的*/
  74.         redirect_address=getValue(fp,start+1,3);
  75.         fseek(fp,redirect_address,SEEK_SET);
  76.         /*混合类型,重定向1类型进入后遇到重定向2类型
  77.         读取重定向后的内容,并设置地域位置的文件偏移量*/
  78.         if((fgetc(fp)&0x000000FF)==REDIRECT_MODE_2)
  79.         {
  80.             counrty_address=getValue(fp,redirect_address+1,3);
  81.             location_address=redirect_address+4;
  82.             getString(fp,counrty_address,country);
  83.         }
  84.         /*读取重定向1后的内容,并设置地域位置的文件偏移量*/
  85.         else
  86.         {
  87.             counrty_address=redirect_address;
  88.             location_address=redirect_address+getString(fp,counrty_address,country);
  89.         }
  90.     }
  91.     /*重定向2类型的*/
  92.     else if(val==REDIRECT_MODE_2)
  93.     {
  94.         counrty_address=getValue(fp,start+1,3);
  95.         location_address=start+4;
  96.         getString(fp,counrty_address,country);
  97.     }
  98.     else
  99.     {
  100.         counrty_address=start;
  101.         location_address=counrty_address+getString(fp,counrty_address,country);
  102.     }

  103.     /*读取地域位置*/
  104.     fseek(fp,location_address,SEEK_SET);
  105.     if((fgetc(fp)&0x000000FF)==REDIRECT_MODE_2||(fgetc(fp)&0x000000FF)==REDIRECT_MODE_1)
  106.     {
  107.         location_address=getValue(fp,location_address+1,3);
  108.     }
  109.     getString(fp,location_address,location);

  110.     return;
  111. };


  112. /*void getHead( 读取索引部分的范围(在文件头中,最先的2个8位16进制)
  113. FILE *fp, 指定文件指针
  114. unsigned long *start, 文件偏移量,索引的起止位置
  115. unsigned long *end) 文件偏移量,索引的结束位置
  116. */
  117. void getHead(FILE *fp,unsigned long *start,unsigned long *end)
  118. {
  119.     /*索引的起止位置的文件偏移量,存储在文件头中的前8个16进制中
  120.     设置偏移量为0,读取4个字符*/
  121.     *start=getValue(fp,0L,4);
  122.     /*索引的结束位置的文件偏移量,存储在文件头中的第8个到第15个的16进制中
  123.     设置偏移量为4个字符,再读取4个字符*/
  124.     *end=getValue(fp,4L,4);
  125. };


  126. /*unsigned long searchIP( 搜索指定IP在索引区的位置,采用二分查找法;
  127. 返回IP在索引区域的文件偏移量
  128. 一条索引记录的结果是,前4个16进制表示起始IP地址
  129. 后面3个16进制,表示该起始IP在IP信息段中的位置,文件偏移量
  130. FILE *fp,
  131. unsigned long index_start, 索引起始位置的文件偏移量
  132. unsigned long index_end, 索引结束位置的文件偏移量
  133. unsigned long ip) 关键字,要索引的IP
  134. */
  135. unsigned long searchIP(FILE *fp, unsigned long index_start, \

  136.                        unsigned long index_end, unsigned long ip)
  137. {
  138.     unsigned long index_current,index_top,index_bottom;
  139.     unsigned long record;
  140.     index_bottom=index_start;
  141.     index_top=index_end;
  142.     /*此处的7,是因为一条索引记录的长度是7*/
  143.     index_current=((index_top-index_bottom)/7/2)*7+index_bottom;
  144.     /*二分查找法*/
  145.     do{
  146.         record=getValue(fp,index_current,4);
  147.         if(record>ip)
  148.         {
  149.             index_top=index_current;
  150.             index_current=((index_top-index_bottom)/14)*7+index_bottom;
  151.         }
  152.         else
  153.         {
  154.             index_bottom=index_current;
  155.             index_current=((index_top-index_bottom)/14)*7+index_bottom;
  156.         }
  157.     }while(index_bottom<index_current);
  158.     /*返回关键字IP在索引区域的文件偏移量*/
  159.     return index_current;
  160. };


  161. /*unsigned long putAll( 导出所有IP信息到文件文件中,函数返回导出总条数
  162. FILE *fp,
  163. FILE *out, 导出的文件指针,必须拥有写权限
  164. unsigned long index_start, 索引区域的起始文件偏移量
  165. unsigned long index_end) 索引区域的结束文件偏移量
  166. */
  167. unsigned long putAll(FILE *fp, FILE *out, unsigned long index_start, unsigned long index_end)
  168. {
  169.     unsigned long i,count=0;
  170.     unsigned long start_ip,end_ip;
  171.     char *country;
  172.     char *location;

  173.     country=new char[255];
  174.     location=new char[255];

  175.     /*此处的7,是因为一条索引记录的长度是7*/
  176.     for(i=index_start;i<index_end;i+=7)
  177.     {
  178.         /*获取IP段的起始IP和结束IP,
  179.         起始IP为索引部分的前4位16进制
  180.         结束IP在IP信息部分的前4位16进制中,靠索引部分指定的偏移量找寻*/
  181.         start_ip=getValue(fp,i,4);
  182.         end_ip=getValue(fp,getValue(fp,i+4,3),4);
  183.         /*导出IP信息,格式是
  184.         起始IP\t结束IP\t国家位置\t地域位置\n*/
  185.         fprintf(out,"%d.%d.%d.%d",(start_ip&0xFF000000)>>0x18,\

  186.             (start_ip&0x00FF0000)>>0x10,(start_ip&0x0000FF00)>>0x8,start_ip&0x000000FF);
  187.         fprintf(out,"\t");
  188.         fprintf(out,"%d.%d.%d.%d",(end_ip&0xFF000000)>>0x18, \

  189.             (end_ip&0x00FF0000)>>0x10,(end_ip&0x0000FF00)>>0x8,end_ip&0x000000FF);
  190.         getAddress(fp,getValue(fp,i+4,3),&country,&location);
  191.         fprintf(out,"\t%s\t%s\n",country,location);
  192.         count++;
  193.     }
  194.     if(country!=NULL)
  195.     {
  196.         delete country;
  197.         country = NULL;
  198.     }

  199.     if(location!=NULL)
  200.     {
  201.         delete location;
  202.         location = NULL;
  203.     }
  204.     /*返回导出总条数*/
  205.     return count;
  206. };


  207. /*判断一个字符是否为数字字符,
  208. 如果是,返回0
  209. 如果不是,返回1*/
  210. int beNumber(char c)
  211. {
  212.     if(c>='0'&&c<='9')
  213.         return 0;
  214.     else
  215.         return 1;
  216. };


  217. /*函数的参数是一个存储着IP地址的字符串首地址
  218. 返回该IP的16进制代码
  219. 如果输入的IP地址有错误,函数将返回0*/
  220. unsigned long getIP(char *ip_addr)
  221. {
  222.     unsigned long ip=0;
  223.     int i,j=0;
  224.     /*依次读取字符串中的各个字符*/
  225.     for(i=0;i<strlen(ip_addr);i++)
  226.     {
  227.         /*如果是IP地址间隔的‘.’符号
  228.         把当前读取到的IP字段的值,存入ip变量中
  229.         (注意,ip为叠加时,乘以16进制的0x100)
  230.         并清除临时变量的值*/
  231.         if(*(ip_addr+i)=='.')
  232.         {
  233.             ip=ip*0x100+j;
  234.             j=0;
  235.         }
  236.         /*往临时变量中写入当前读取到的IP字段中的字符值
  237.         叠加乘以10,因为输入的IP地址是10进制*/
  238.         else
  239.         {
  240.             /*判断,如果输入的IP地址不规范,不是10进制字符
  241.             函数将返回0*/
  242.             if(beNumber(*(ip_addr+i))==0)
  243.                 j=j*10+*(ip_addr+i)-'0';
  244.             else
  245.                 return 0;
  246.         }
  247.     }
  248.     /*IP字段有4个,但是‘.’只有3个,叠加第四个字段值*/
  249.     ip=ip*0x100+j;
  250.     return ip;
  251. };


  252. /*显示logo信息*/
  253. void logo(void)
  254. {
  255.     printf("=============================================================================\n");
  256.     printf("--- Get the IP info.s from QQWry.dat v0.1 by dorainm dorainm@gmail.com ---\n");
  257.     printf("=============================================================================\n");
  258. };


  259. /*显示程序语法*/
  260. void usage(char *app_name)
  261. {
  262.     printf("\nUsage : %s [options]\n",app_name);
  263.     printf("options:\n");
  264.     printf(" -a <address> Search and display the Informations by Location Address.(*)\n");
  265.     printf(" -i <IP> Search and display the Informations by IP Address.\n");
  266.     printf(" -o <FILE> Output all the informations to a text file.\n");
  267.     printf(" -local Display the localhost IP's informations.(*)\n");
  268.     printf(" -updata Update the QQWry.dat from the Internet.(*)\n\n");
  269.     printf("ps: the optionss marked (*) are incompleted.\n");
  270. };


  271. /*显示结束信息*/
  272. void showend(void)
  273. {
  274.     printf("\n\nThe command completed successfully.\n\n");
  275. };

  276. /*主函数*/
  277. int main(int argc, char *argv[])
  278. {
  279.     FILE *fp; /*打开QQWry.dat的文件指针*/
  280.     unsigned long index_start,index_end,current; /*索引部分的起始位置的文件偏移量
  281.                                                  索引部分的结束位置的文件偏移量
  282.                                                  待搜索IP地址的索引条目的文件偏移量*/
  283.     char *country; /*国家位置*/
  284.     char *location; /*地域位置*/
  285.     country=new char[MAXBUF];
  286.     location=new char[MAXBUF];

  287.     logo();
  288.     if(argc<3)
  289.     {
  290.         usage(argv[0]);
  291.         showend();
  292.         return 1;
  293.     }

  294.     /*打开QQWry.dat文件*/
  295.     if((fp=fopen(QQWRY,"rb"))==NULL)
  296.     {
  297.         printf("[-] Error : Can not open the file %s.\n",QQWRY);
  298.         showend();
  299.         return 2;
  300.     }
  301.     else
  302.         printf("[+] Open the file [ %s ] successfully.\n",QQWRY);

  303.     /*显示QQWry.dat文件信息*/
  304.     getHead(fp,&index_start,&index_end);
  305.     getAddress(fp,getValue(fp,index_end+4,3),&country,&location);
  306.     printf("[+] Version of QQWry.dat : [ %s %s ]\n",country,location);
  307.     printf("[+] Index Location [ 0x%X - 0x%X ].\n",index_start,index_end);

  308.     /*判断第一个参数的值*/
  309.     if((strncmp(argv[1],"-i",2)==0)||(strncmp(argv[1],"-I",2)==0))
  310.     {
  311.         /*-i参数,搜索IP*/
  312.         unsigned long ip;

  313.         ip=getIP(argv[2]);
  314.         if(ip==0)
  315.         {
  316.             printf("[-] Error : the IP Address inputed.\n");
  317.             showend();
  318.             return 3;
  319.         }

  320.         /*搜索IP在索引区域的条目的偏移量*/
  321.         current=searchIP(fp,index_start,index_end,ip);
  322.         printf("[+] Address of index for [ %X ] is %X\n",ip,current);

  323.         /*获取该IP对因的国家地址和地域地址*/
  324.         getAddress(fp,getValue(fp,current+4,3),&country,&location);
  325.         printf("[+] Get the location for the IP address.\n");
  326.         printf("[+] [ IP Address ] %d.%d.%d.%d\n",(ip&0xFF000000)>>0x18,(ip&0x00FF0000)>>0x10,(ip&0x0000FF00)>>0x8,ip&0x000000FF);
  327.         printf("[+] [ Location ] %s %s\n",country,location);
  328.     }
  329.     else if((strncmp(argv[1],"-o",2)==0)||(strncmp(argv[1],"-O",2)==0))
  330.     {
  331.         /*-o参数,解压缩数据库,导出IP信息到文本文件*/
  332.         FILE *out;
  333.         unsigned long num;
  334.         if((out=fopen(argv[2],"w"))==NULL)
  335.         {
  336.             printf("[-] Error create the output text file [ %s ].\n","out.txt");
  337.             showend();
  338.         }
  339.         else
  340.         {
  341.             printf("[+] Create the output text file [ %s ] successfully.\n","out.txt");
  342.         }

  343.         /*导出IP条目信息*/
  344.         printf("[+] Outputing the informations ");
  345.         num=putAll(fp,out,index_start,index_end);
  346.         printf("Finished.\n");
  347.         fclose(out);
  348.         /*显示导出条目的数量*/
  349.         printf("[+] The Total items number is [ %d ].",num);
  350.     }
  351.     /*关闭文件指针,释放变量空间,结束程序*/
  352.     fclose(fp);
  353.     if(country!=NULL)
  354.     {
  355.         delete country;
  356.         country = NULL;
  357.     }

  358.     if(location!=NULL)
  359.     {
  360.         delete location;
  361.         location = NULL;
  362.     }
  363.     showend();
  364.     return 0;
  365. }
复制代码
使用语法
=============================================================================
--- Get the IP info.s from QQWry.dat v0.1   by dorainm  dorainm@gmail.com ---
=============================================================================

Usage : showip [options]
options:
  -a <address>    Search and display the Informations by Location Address.(*)
  -i <IP>         Search and display the Informations by IP Address.
  -o <FILE>       Output all the informations to a text file.
  -local          Display the localhost IP's informations.(*)
  -updata         Update the QQWry.dat from the Internet.(*)

ps:  the optionss marked (*) are incompleted.


The command completed successfully.
搜索IP
showip -i 222.19.211.254

=============================================================================
--- Get the IP info.s from QQWry.dat v0.1   by dorainm  dorainm@gmail.com ---
=============================================================================
[+]  Open the file [ QQWry.dat ] successfully.
[+]  Version of QQWry.dat : [ 纯真网络 2006年3月5日IP数据 ]
[+]  Index Location [ 0x37A265 - 0x535EB1 ].
[+]  Address of index for [ DE13D3FE ] is 51BB44
[+]  Get the location for the IP address.
[+]  [ IP Address ] 222.19.211.254
[+]  [  Location  ] 云南大学 国家示范性软件学院


The command completed successfully.
导出所有IP信息,语法是 showip -o out.txt

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-11-23 23:17

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

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