|
晶莹剔透§烈日灼然

- 帖子
- 11
- 精华
- 0
- 积分
- 45
- 阅读权限
- 40
- 在线时间
- 72 小时
- 注册时间
- 2007-2-2
- 最后登录
- 2008-5-7
|
楼主
大 中
小 发表于 2007-11-27 11:36 只看该作者
[原创]对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 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
Parsed in 0.050 seconds VC版 Code 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: }
Parsed in 0.013 seconds
附件
-
QQLoginTest.rar
(274 KB)
-
2007-11-27 11:36, 下载次数: 359
程序代码 P.S. asm代码中已包含makefile
|