发新话题
打印

[原创]对QQ的LoginUinList.dat的简要分析

[原创]对QQ的LoginUinList.dat的简要分析

文章作者:nightxie
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

玩过QQ的人都知道,每次我们普通模式登陆QQ的时候,QQ都会记录我们的QQ号。那么这个QQ号保存在什么地方呢?这个就要说到我们今天的主角LoginUinList.dat。
通过我的简单分析得到如下结论:
1.我们的第一个QQ的登陆号放在文件的40h处,从这项往后的4个字节,LoginUinList.dat用这四个字节来记录qq号的值。

2.的二个QQ好放在距离这个位置的0D7h处,也就是0D7h+40h的地方!
通过以上结论,偶们可以写出得到QQ号的程序~~~
这有什么用呢?
我想至少能模拟一个QQ的登陆界面吧~~~用来干什么去想吧,呵呵!
写的巨烂部分程序代码,请各位指教:
ASM版
Code Language : ASM
  1. 00000: ;#Mode=CON
  2. 00001: .386
  3. 00002: .model flat, stdcall
  4. 00003: option casemap :none
  5. 00004:
  6. 00005: include windows.inc
  7. 00006: include user32.inc
  8. 00007: include kernel32.inc
  9. 00008: include masm32.inc
  10. 00009:
  11. 00010: includelib user32.lib
  12. 00011: includelib kernel32.lib
  13. 00012: includelib masm32.lib
  14. 00013:
  15. 00014: .data
  16. 00015: dwPos dd 40h
  17. 00016: strText1 db \"LoginUinList.dat\",0
  18. 00017: strText2 db \"%d \",0dh,0ah,0
  19. 00018: strError db \"请把LoginUinList.dat和\n该程序放到相同目录中\",0
  20. 00019:
  21. 00020: .data?
  22. 00021: dwGetSize dd ?
  23. 00022: QQNum dd ?
  24. 00023: dwFileSize dd ?
  25. 00024: dbBuffer db 4 dup(?)
  26. 00025: hFile dd ?
  27. 00026: lpBuffer dd ?
  28. 00027: lpStr db 20 dup(?)
  29. 00028: buffer db 1
  30. 00029: .code
  31. 00030: START:
  32. 00031: invoke CreateFile,offset strText1,GENERIC_READ,0,NULL,OPEN_EXISTING,\
  33. 00032: FILE_ATTRIBUTE_NORMAL,NULL
  34. 00033: mov hFile,eax
  35. 00034: .if hFile != INVALID_HANDLE_VALUE
  36. 00035: invoke GetFileSize,hFile,NULL
  37. 00036: mov dwFileSize,eax
  38. 00037: invoke VirtualAlloc,NULL,dwFileSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE
  39. 00038: mov lpBuffer,eax
  40. 00039: invoke RtlZeroMemory,lpBuffer,dwFileSize
  41. 00040: invoke ReadFile,hFile,lpBuffer,dwFileSize,offset dwGetSize,NULL
  42. 00041: mov edx,dwFileSize
  43. 00042: .while dwPos <= edx
  44. 00043: mov eax,lpBuffer
  45. 00044: add eax,dwPos
  46. 00045: invoke RtlMoveMemory,offset dbBuffer,eax, 4
  47. 00046: xor eax,eax
  48. 00047: xor ebx,ebx
  49. 00048: mov ebx,offset dbBuffer
  50. 00049: mov ah,[ebx+3]
  51. 00050: mov al,[ebx+2]
  52. 00051: shl eax,16
  53. 00052: mov ah,[ebx+1]
  54. 00053: mov al,[ebx]
  55. 00054: mov QQNum,eax
  56. 00055: invoke wsprintf,offset lpStr,offset strText2,QQNum
  57. 00056: mov eax,dwPos
  58. 00057: add eax,0D7h
  59. 00058: mov dwPos,eax
  60. 00059: invoke StdOut,offset lpStr
  61. 00060: mov edx,dwFileSize
  62. 00061: .endw
  63. 00062: .else
  64. 00063: invoke StdOut,offset strError
  65. 00064:
  66. 00065: .endif
  67. 00066:
  68. 00067: invoke StdIn,offset buffer,sizeof buffer
  69. 00068: invoke ExitProcess,0
  70. 00069:
  71. 00070: end START
Parsed in 0.050 seconds
VC版
Code Language : C
  1. 00000: void CQQLoginTextDlg::OnButton1()
  2. 00001: {
  3. 00002:  // TODO: Add your control notification handler code here
  4. 00003:  BYTE dbBuffer[4] = {0};
  5. 00004:  DWORD QQNum = 0;
  6. 00005:  DWORD dwGetSize = 0;
  7. 00006:  DWORD dwPos = 0x40;    //第一处的QQID所在的位置
  8. 00007:  CString lpCStr;
  9. 00008:  HANDLE hFile = CreateFile(\"LoginUinList.dat\",GENERIC_READ,0,NULL,OPEN_EXISTING,
  10. 00009:                FILE_ATTRIBUTE_NORMAL,NULL);
  11. 00010:  if(hFile != INVALID_HANDLE_VALUE)
  12. 00011:  {
  13. 00012:  DWORD dwFileSize = GetFileSize(hFile,NULL);
  14. 00013:  LPBYTE lpBuffer = (LPBYTE)VirtualAlloc(NULL,dwFileSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  15. 00014:  ZeroMemory(lpBuffer,dwFileSize);
  16. 00015:  ReadFile(hFile,(LPVOID)lpBuffer,dwFileSize,&dwGetSize,NULL);
  17. 00016:  char lpStr[10] = {0};
  18. 00017:  
  19. 00018:  while(dwPos <= dwFileSize)
  20. 00019:  {
  21. 00020:    CopyMemory((LPVOID)dbBuffer,(LPVOID)(lpBuffer+dwPos), 4);
  22. 00021:    QQNum = dbBuffer[3];  //关于把这四个字节的数放到一个双字中
  23. 00022:    QQNum = QQNum<<8;    //想了半天,发现只会用这个办法。。。不知道有什么更好的方法!?
  24. 00023:    QQNum += dbBuffer[2];
  25. 00024:    QQNum = QQNum<<8;
  26. 00025:    QQNum += dbBuffer[1];
  27. 00026:    QQNum = QQNum<<8;
  28. 00027:    QQNum += dbBuffer[0];
  29. 00028:    wsprintf(lpStr,\"%d\r\n\",QQNum);
  30. 00029:    lpCStr += lpStr;
  31. 00030:    dwPos +=0xD7;    //文件中,QQID间隔的字节数。
  32. 00031:  }
  33. 00032:  SetDlgItemText(IDC_EDIT1,lpCStr);
  34. 00033:  }
  35. 00034:  else
  36. 00035:  {
  37. 00036:    MessageBox(\"请把LoginUinList.dat和\n该程序放到相同目录中\");
  38. 00037:  }
  39. 00038: }
Parsed in 0.013 seconds

附件

QQLoginTest.rar (274 KB)

2007-11-27 11:36, 下载次数: 359

程序代码 P.S. asm代码中已包含makefile

TOP

精彩代码,不过要能在写个Delphi版本的就更好了

TOP

ASM  强  VB 也能实现吧 ?
只做安静的观众

TOP

高手就是不同,看了就可以写出,佩服!
我一个人不寂寞,想一个人才寂寞!

TOP

想得到Q号不用那么麻烦的吧~~遍历整个QQ文件目录不就可以了吗,还那么麻烦

TOP

发新话题