NL_QQwry.cpp
上传用户:cjw5120
上传日期:2022-05-11
资源大小:5032k
文件大小:9k
源码类别:

网络截获/分析

开发平台:

Visual C++

  1. // NL_QQwry.cpp: implementation of the NL_QQwry class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "NL_QQwry.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. IPwry::IPwry()
  15. {
  16. m_bOpen=OpenQQwry("QQwry.dat");
  17. GetBE();
  18. }
  19. IPwry::~IPwry()
  20. {
  21. CloseQQwry();
  22. }
  23. bool IPwry::OpenQQwry(CString szFileName)
  24. {
  25. if(!m_file.Open(szFileName,CFile::modeRead|CFile::typeBinary))
  26. return false;
  27. else
  28. return true;
  29. }
  30. void IPwry::CloseQQwry()
  31. {
  32. if(m_bOpen)m_file.Close();
  33. }
  34. bool IPwry::GetBE()
  35. {
  36. if(!m_bOpen)return false;
  37. m_file.Seek(0,CFile::begin);
  38. if(m_file.Read(&m_be,sizeof(BE))>0)
  39. return true;
  40. else
  41. return false;
  42. }
  43. int IPwry::GetStartIPInfo(int iIndex)
  44. {
  45. BYTE buf[MAXBUF];
  46. int ioff;
  47. if(!m_bOpen) return 0;
  48. ioff=m_be.uBOff+iIndex*7;
  49. if(ioff>m_be.uEOff) return 0;
  50. m_file.Seek(m_be.uBOff+iIndex*7,CFile::begin);
  51. m_file.Read(&m_ipoff,sizeof(IPOFF));
  52. ioff=(m_ipoff.off1+m_ipoff.off2*256+m_ipoff.off3*256*256);
  53. m_file.Seek(ioff,CFile::begin);
  54. m_file.Read(&m_ei,sizeof(EndInfo));
  55. if(m_ei.buf[0]!=1 &&  m_ei.buf[0]!=2)
  56. {
  57. m_ei.bMode=1;//没有跳
  58. for(int i=0;i<MAXBUF;i++)
  59. {
  60. if(m_ei.buf[i]==0)
  61. {
  62. if(m_ei.buf[i+1]==2)
  63. {
  64. m_ei.bMode=2;//Local 跳
  65. m_ei.offset1=m_ei.buf[i+2]+
  66. m_ei.buf[i+3]*256+
  67. m_ei.buf[i+4]*256*256;
  68. }
  69. break;
  70. }
  71. }
  72. }
  73. else if(m_ei.buf[0]==2)
  74. {
  75. m_ei.bMode=3;//Country 跳 local不跳
  76. m_ei.offset1=m_ei.buf[1]+m_ei.buf[2]*256+m_ei.buf[3]*256*256;
  77. if(m_ei.buf[4]!=2)
  78. {
  79. m_ei.bMode=3;
  80. }
  81. else
  82. {
  83. m_ei.bMode=4;//Country跳 local跳
  84. m_ei.offset2=m_ei.buf[5]+m_ei.buf[6]*256+m_ei.buf[7]*256*256;
  85. }
  86. }
  87. else if(m_ei.buf[0]==1)
  88. {
  89. m_ei.offset1=m_ei.buf[1]+m_ei.buf[2]*256+m_ei.buf[3]*256*256;
  90. m_file.Seek(m_ei.offset1,CFile::begin);
  91. m_file.Read(buf,MAXBUF);
  92. memcpy(m_ei.buf,buf,MAXBUF);
  93. m_ei.bMode=0;
  94. if(m_ei.buf[0]!=2)
  95. {
  96. for(int i=0;i<MAXBUF;i++)
  97. {
  98. if(m_ei.buf[i]==0)
  99. {
  100. if(m_ei.buf[i+1]!=2)
  101. {
  102. m_ei.bMode=5;//1 没有跳
  103. }
  104. else
  105. {
  106. m_ei.bMode=6;//1 Country不跳 Local 跳
  107. m_ei.offset2=m_ei.buf[i+2]+
  108. m_ei.buf[i+3]*256+
  109. m_ei.buf[i+4]*256*256;
  110. }
  111. break;
  112. }
  113. }
  114. }
  115. else
  116. {
  117. if(m_ei.buf[4]!=2)
  118. {
  119. m_ei.bMode=7;// 1 Country跳 Local不跳
  120. m_ei.offset2=m_ei.buf[1]+
  121. m_ei.buf[2]*256+
  122. m_ei.buf[3]*256*256;
  123. }
  124. else
  125. {
  126. m_ei.bMode=8;// 1 Country跳 Local跳
  127. m_ei.offset1=m_ei.buf[1]+
  128. m_ei.buf[2]*256+
  129. m_ei.buf[3]*256*256;
  130. m_ei.offset2=m_ei.buf[5]+
  131. m_ei.buf[6]*256+
  132. m_ei.buf[7]*256*256;
  133. }
  134. }
  135. }
  136. return ioff;
  137. }
  138. int IPwry::GetRecordCount(void)
  139. {
  140. if(!m_bOpen) return 0;
  141. if((m_be.uEOff-m_be.uBOff)<0) return 0;
  142. return (m_be.uEOff-m_be.uBOff)/7+1;
  143. }
  144. CString IPwry::GetStr(int ioffset)
  145. {
  146. if(ioffset>m_be.uEOff) return "";
  147. BYTE ch;
  148. CString buf="";
  149. m_file.Seek(ioffset,CFile::begin);
  150. int i=0;
  151. while(1)
  152. {
  153. m_file.Read(&ch,1);
  154. if(ch==0)
  155. break;
  156. buf+=ch;
  157. i++;
  158. if(i>50)break;
  159. }
  160. return buf;
  161. }
  162. CString IPwry::GetCountryLocal(int index)
  163. {
  164. if(index<0 || index>GetRecordCount()-1)
  165. return "未知IP";
  166. return GetCountryLocal(m_ei.bMode,GetStartIPInfo(index)+4);
  167. }
  168. CString IPwry::GetCountryLocal(BYTE bMode,int ioffset)
  169. {
  170. CString buf="";
  171. if(bMode==1)//X 没有跳
  172. {
  173. buf=GetStr(ioffset);
  174. buf+=" ";
  175. buf+=GetStr();
  176. }
  177. if(bMode==2)//X Country不跳 Local 跳
  178. {
  179. buf=GetStr(ioffset);
  180. buf+=" ";
  181. buf+=GetStr(m_ei.offset1);
  182. }
  183. if(bMode==3)//2 Country跳 local不跳
  184. {
  185. buf=GetStr(m_ei.offset1);
  186. buf+=" ";
  187. buf+=GetStr(ioffset+4);
  188. }
  189. if(bMode==4)//2 Country跳 local跳
  190. {
  191. buf=GetStr(m_ei.offset1);
  192. buf+=" ";
  193. buf+=GetStr(m_ei.offset2);
  194. }
  195. if(bMode==5)//1 没有跳
  196. {
  197. buf=GetStr(m_ei.offset1);
  198. buf+=" ";
  199. buf+=GetStr();
  200. }
  201. if(bMode==6)//1 Country不跳 Local 跳
  202. {
  203. buf=GetStr(m_ei.offset1);
  204. buf+=" ";
  205. buf+=GetStr(m_ei.offset2);
  206. }
  207. if(bMode==7)//1 Country跳 Local 不跳
  208. {
  209. buf=GetStr(m_ei.offset2);
  210. buf+=" ";
  211. buf+=GetStr(m_ei.offset1+4);
  212. }
  213. if(bMode==8)//1 Country跳 Local跳
  214. {
  215. buf=GetStr(m_ei.offset1);
  216. buf+=" ";
  217. buf+=GetStr(m_ei.offset2);
  218. }
  219. return buf;
  220. }
  221. CString IPwry::GetStr()
  222. {
  223. BYTE ch;
  224. CString buf="";
  225. int i=0;
  226. while(1)
  227. m_file.Read(&ch,1);
  228. if(ch==0)
  229. break;
  230. buf+=ch;
  231. i++;
  232. if(i>50)break;
  233. }
  234. return buf;
  235. }
  236. void IPwry::SaveToFile()
  237. {
  238. //
  239. //在内存中操作可能速度更快一些
  240. //利用缓存,就这样了,提高速度就自己解决了
  241. //
  242. FILE *out;
  243. CString str1,str2;
  244. out=fopen("out.txt","wb");
  245. int ioff;
  246. //m_buf.Format("%08X %08X",m_be.uBOff,m_be.uEOff);
  247. m_buf.Format("Total %drn",GetRecordCount());
  248. fwrite(m_buf,1,m_buf.GetLength(),out);
  249. for(m_i=0;m_i<GetRecordCount();m_i++)
  250. //for(m_i=0;m_i<2000;m_i++)
  251. {
  252. ioff=GetStartIPInfo(m_i);
  253. str1.Format("%d.%d.%d.%d",m_ipoff.b3,m_ipoff.b2,m_ipoff.b1,m_ipoff.b0);
  254. str2.Format("%d.%d.%d.%d",m_ei.b3,m_ei.b2,m_ei.b1,m_ei.b0);
  255. m_buf.Format("%-15s %-15s %srn",
  256. str1,str2,GetCountryLocal(m_ei.bMode,ioff+4));
  257. fwrite(m_buf,1,m_buf.GetLength(),out);
  258. }
  259. fclose(out);
  260. }
  261. CString IPwry::IP2Add(CString szIP)
  262. {
  263. if(szIP=="")
  264. return "请输入IP地址";
  265. if(szIP=="127.0.0.1")
  266. return "本机IP";
  267. return GetCountryLocal(GetIndex(szIP));
  268. }
  269. int IPwry::GetIndex(CString szIP)
  270. {
  271. int index=-1;
  272. DWORD dwInputIP;
  273. DWORD dwStartIP;
  274. dwInputIP=IP2DWORD(szIP);
  275. //顺序查找速度肯定慢
  276. /*
  277. if(dwInputIP<=0x7FFFFFFF)
  278. for (int i=0;i<GetRecordCount();i++)
  279. {
  280. dwStartIP=GetSIP(i);
  281. if(dwStartIP<=dwInputIP && dwInputIP<=m_dwLastIP)
  282. {index=i;break;}
  283. }
  284. else
  285. for (int i=GetRecordCount()-1;i>=0;i--)
  286. {
  287. dwStartIP=GetSIP(i);
  288. if(dwStartIP<=dwInputIP && dwInputIP<=m_dwLastIP)
  289. {index=i;break;}
  290. }
  291. */
  292. //
  293. //利用半跳方法速度快一些
  294. //
  295. int iT;
  296. int iB,iE;
  297. iB=0;
  298. iE=GetRecordCount()-1;
  299. iT=iE/2;
  300. while(iB<iE)
  301. {
  302. dwStartIP=GetSIP(iT);
  303. if(dwInputIP==dwStartIP)
  304. {
  305. index =iT;
  306. break;
  307. }
  308. if((iE-iB)<=1)
  309. {
  310. /*
  311. CString s;
  312. s.Format("%d %d %d %d in:%08X s:%08X",iE-iB,iB,iT,iE,dwInputIP,dwStartIP);
  313. if(MessageBox(0,s,0,MB_YESNO)==IDNO);
  314. //*/
  315. for(int i=iB;i<=iE;i++)
  316. {
  317. dwStartIP=GetSIP(i);
  318. if(dwStartIP<=dwInputIP && dwInputIP<=m_dwLastIP)
  319. {
  320. index=i;
  321. break;
  322. }
  323. }
  324. break;
  325. }
  326. if(dwInputIP>dwStartIP)
  327. {
  328. iB=iT;
  329. }
  330. else
  331. {
  332. iE=iT;
  333. }
  334. iT=iB+(iE-iB)/2;
  335. }
  336. return index;
  337. }
  338. DWORD IPwry::GetSIP(int index)
  339. {
  340. DWORD ip;
  341. BYTE b[3];
  342. int ioff;
  343. if(!m_bOpen)return -1;
  344. if(index>GetRecordCount()-1)return -1;
  345. if(index<0)return -1;
  346. ioff=m_be.uBOff+index*7;
  347. m_file.Seek(ioff,CFile::begin);
  348. m_file.Read(&ip,4);
  349. m_file.Read(b,3);
  350. ioff=b[0]+b[1]*256+b[2]*256*256;
  351. m_file.Seek(ioff,CFile::begin);
  352. m_file.Read(&m_dwLastIP,4);
  353. return ip;
  354. }
  355. DWORD IPwry::IP2DWORD(CString szIP)
  356. {
  357. DWORD iIP;
  358. BYTE b[4];
  359. CString szTemp;
  360. char ch;
  361. int iLen;
  362. int iXB;
  363. szIP+=".";
  364. memset(b,0,4);
  365. iLen=szIP.GetLength();
  366. iXB=0;
  367. iIP=0;
  368. for(int i=0;i<iLen;i++)
  369. {
  370. ch=szIP.GetAt(i);
  371. szTemp+=ch;
  372. if(ch=='.')
  373. {
  374. b[iXB]=atoi(szTemp);
  375. szTemp="";
  376. iXB++;
  377. }
  378. }
  379. iIP=b[0]*256*256*256+b[1]*256*256+b[2]*256+b[3];
  380. return iIP;
  381. }
  382. CString IPwry::Test()
  383. {
  384. int ioff;
  385. CString str;
  386. //m_buf.Format("%08X %08X",m_be.uBOff,m_be.uEOff);
  387. m_buf.Format("Total %drn",GetRecordCount());
  388. //for(m_i=GetRecordCount()-200;m_i<GetRecordCount();m_i++)
  389. for(m_i=0;m_i<1000;m_i++)
  390. {
  391. ioff=GetStartIPInfo(m_i);
  392. if(m_ei.bMode>=1 && m_ei.bMode<=8)
  393. {
  394. str.Format("%6d %03d.%03d.%03d.%03d "
  395. "%03d.%03d.%03d.%03d  %d  %06X ",
  396. m_i,
  397. m_ipoff.b3,
  398. m_ipoff.b2,
  399. m_ipoff.b1,
  400. m_ipoff.b0,
  401. m_ei.b3,
  402. m_ei.b2,
  403. m_ei.b1,
  404. m_ei.b0,
  405. m_ei.bMode,
  406. ioff);
  407. m_buf+=str;
  408. str=GetCountryLocal(m_ei.bMode,ioff+4);
  409. str+="rn";
  410. }
  411. else
  412. {
  413. str.Format("%6d %03d.%03d.%03d.%03d "
  414. "%03d.%03d.%03d.%03d (%d) %06X ",
  415. m_i,
  416. m_ipoff.b3,
  417. m_ipoff.b2,
  418. m_ipoff.b1,
  419. m_ipoff.b0,
  420. m_ei.b3,
  421. m_ei.b2,
  422. m_ei.b1,
  423. m_ei.b0,
  424. m_ei.bMode,
  425. ioff);
  426. m_buf+=str;
  427. str.Format("%02X-%02X-%02X-%02X-%02X "
  428. "%02X-%02X-%02X-%02X-%02X "
  429. "%02X-%02X-%02X-%02X-%02X "
  430. "%02X-%02X-%02X-%02X-%02Xrn",
  431. m_ei.buf[0],
  432. m_ei.buf[1],
  433. m_ei.buf[2],
  434. m_ei.buf[3],
  435. m_ei.buf[4],
  436. m_ei.buf[5],
  437. m_ei.buf[6],
  438. m_ei.buf[7],
  439. m_ei.buf[8],
  440. m_ei.buf[9],
  441. m_ei.buf[10],
  442. m_ei.buf[11],
  443. m_ei.buf[12],
  444. m_ei.buf[13],
  445. m_ei.buf[14],
  446. m_ei.buf[15],
  447. m_ei.buf[16],
  448. m_ei.buf[17],
  449. m_ei.buf[18],
  450. m_ei.buf[19]);
  451. }
  452. m_buf+=str;
  453. }
  454. return m_buf;
  455. }