邪恶八进制信息安全团队技术讨论组's Archiver

nightxie 2007-11-27 11:36

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

文章作者:nightxie
信息来源:邪恶八进制信息安全团队([url=http://www.eviloctal.com/]www.eviloctal.com[/url])

玩过QQ的人都知道,每次我们普通模式登陆QQ的时候,QQ都会记录我们的QQ号。那么这个QQ号保存在什么地方呢?这个就要说到我们今天的主角LoginUinList.dat。
通过我的简单分析得到如下结论:
1.我们的第一个QQ的登陆号放在文件的40h处,从这项往后的4个字节,LoginUinList.dat用这四个字节来记录qq号的值。
[attach]10784[/attach]
2.的二个QQ好放在距离这个位置的0D7h处,也就是0D7h+40h的地方!
通过以上结论,偶们可以写出得到QQ号的程序~~~
这有什么用呢?
我想至少能模拟一个QQ的登陆界面吧~~~用来干什么去想吧,呵呵!
写的巨烂部分程序代码,请各位指教:
[b]ASM版[/b]
[language=asm]00000: ;#Mode=CON
00001: .386
00002: .model flat, stdcall
00003: option casemap :none
00004:
00005: include windows.inc
00006: include user32.inc
00007: include kernel32.inc
00008: include masm32.inc
00009:
00010: includelib user32.lib
00011: includelib kernel32.lib
00012: includelib masm32.lib
00013:
00014: .data
00015: dwPos dd 40h
00016: strText1 db "LoginUinList.dat",0
00017: strText2 db "%d ",0dh,0ah,0
00018: strError db "请把LoginUinList.dat和\n该程序放到相同目录中",0
00019:
00020: .data?
00021: dwGetSize dd ?
00022: QQNum dd ?
00023: dwFileSize dd ?
00024: dbBuffer db 4 dup(?)
00025: hFile dd ?
00026: lpBuffer dd ?
00027: lpStr db 20 dup(?)
00028: buffer db 1
00029: .code
00030: START:
00031: invoke CreateFile,offset strText1,GENERIC_READ,0,NULL,OPEN_EXISTING,\
00032: FILE_ATTRIBUTE_NORMAL,NULL
00033: mov hFile,eax
00034: .if hFile != INVALID_HANDLE_VALUE
00035: invoke GetFileSize,hFile,NULL
00036: mov dwFileSize,eax
00037: invoke VirtualAlloc,NULL,dwFileSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE
00038: mov lpBuffer,eax
00039: invoke RtlZeroMemory,lpBuffer,dwFileSize
00040: invoke ReadFile,hFile,lpBuffer,dwFileSize,offset dwGetSize,NULL
00041: mov edx,dwFileSize
00042: .while dwPos <= edx
00043: mov eax,lpBuffer
00044: add eax,dwPos
00045: invoke RtlMoveMemory,offset dbBuffer,eax, 4
00046: xor eax,eax
00047: xor ebx,ebx
00048: mov ebx,offset dbBuffer
00049: mov ah,[ebx+3]
00050: mov al,[ebx+2]
00051: shl eax,16
00052: mov ah,[ebx+1]
00053: mov al,[ebx]
00054: mov QQNum,eax
00055: invoke wsprintf,offset lpStr,offset strText2,QQNum
00056: mov eax,dwPos
00057: add eax,0D7h
00058: mov dwPos,eax
00059: invoke StdOut,offset lpStr
00060: mov edx,dwFileSize
00061: .endw
00062: .else
00063: invoke StdOut,offset strError
00064:
00065: .endif
00066:
00067: invoke StdIn,offset buffer,sizeof buffer
00068: invoke ExitProcess,0
00069:
00070: end START[/language]

[b]VC版[/b]
[language=c++]00000: void CQQLoginTextDlg::OnButton1()
00001: {
00002:  // TODO: Add your control notification handler code here
00003:  BYTE dbBuffer[4] = {0};
00004:  DWORD QQNum = 0;
00005:  DWORD dwGetSize = 0;
00006:  DWORD dwPos = 0x40;    //第一处的QQID所在的位置
00007:  CString lpCStr;
00008:  HANDLE hFile = CreateFile("LoginUinList.dat",GENERIC_READ,0,NULL,OPEN_EXISTING,
00009:                FILE_ATTRIBUTE_NORMAL,NULL);
00010:  if(hFile != INVALID_HANDLE_VALUE)
00011:  {
00012:  DWORD dwFileSize = GetFileSize(hFile,NULL);
00013:  LPBYTE lpBuffer = (LPBYTE)VirtualAlloc(NULL,dwFileSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
00014:  ZeroMemory(lpBuffer,dwFileSize);
00015:  ReadFile(hFile,(LPVOID)lpBuffer,dwFileSize,&dwGetSize,NULL);
00016:  char lpStr[10] = {0};
00017:  
00018:  while(dwPos <= dwFileSize)
00019:  {
00020:    CopyMemory((LPVOID)dbBuffer,(LPVOID)(lpBuffer+dwPos), 4);
00021:    QQNum = dbBuffer[3];  //关于把这四个字节的数放到一个双字中
00022:    QQNum = QQNum<<8;    //想了半天,发现只会用这个办法。。。不知道有什么更好的方法!?
00023:    QQNum += dbBuffer[2];
00024:    QQNum = QQNum<<8;
00025:    QQNum += dbBuffer[1];
00026:    QQNum = QQNum<<8;
00027:    QQNum += dbBuffer[0];
00028:    wsprintf(lpStr,"%d\r\n",QQNum);
00029:    lpCStr += lpStr;
00030:    dwPos +=0xD7;    //文件中,QQID间隔的字节数。
00031:  }
00032:  SetDlgItemText(IDC_EDIT1,lpCStr);
00033:  }
00034:  else
00035:  {
00036:    MessageBox("请把LoginUinList.dat和\n该程序放到相同目录中");
00037:  }
00038: }[/language]

alices 2007-12-21 02:00

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

页: [1]
© 1999-2008 EvilOctal Security Team