从QQ进程内存中搜索出QQ号码
生活随笔
收集整理的這篇文章主要介紹了
从QQ进程内存中搜索出QQ号码
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
// 讀進程內(nèi)存.cpp : 定義控制臺應(yīng)用程序的入口點。
//#include "stdafx.h"#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>int SearchStr(PTSTR pszString, int iStrLen, PTSTR pszSearchStr)
{int i = 0;int iSearchStrlen = _tcslen(pszSearchStr);while ((i + iSearchStrlen) <= iStrLen ){int n = 0;//先匹配兩個字串的第一個字符if (pszSearchStr[0] == pszString[i]){//若相等,則開始逐字符匹配for (int j = 0; j <iSearchStrlen; j++){//相同位置字符匹配if (pszSearchStr[j] == pszString[i + j]){//若相同位置字符匹配成功,則計數(shù)器加1n++;}else //相同位置字符匹配失敗{//源字符串位置跳過匹配相同的n個字符i = i + n;//跳出當前匹配循環(huán),開始新位置的匹配break;}}//若匹配成功,計數(shù)和目標字符串長度相等,則找到目標if (iSearchStrlen == n){//i為找到的目標字符串在源字符串中的起點位置,//此處return,即找到的目標字符串首次出現(xiàn)位置return i;//找到一個目標,后移一位繼續(xù)找,//如要繼續(xù)找,請注意最后的return,代碼需做點小修改//i++;}}else //若兩字符串的第一個字符不同{//開始反向找源字符串相對目標字符串的后一個字符是否在目標字符串內(nèi)for (int j = iSearchStrlen - 1; j >= 0; j--){//找到存在緊跟其后的那個字符if (pszSearchStr[j] == pszString[i + iSearchStrlen]){//該字符出現(xiàn)在目標字符串中的位置n = j;//只需知道排在倒數(shù)第一那個位置,跳出循環(huán)開始移動位置break;}}//移動到位置為(一個目標串長度減去出現(xiàn)目標串中匹配字符出現(xiàn)的位置),//即如果出現(xiàn)該字符,則使相同的兩個字符對齊,若未出現(xiàn),直接移動一個目標串長度i = i + iSearchStrlen - n;}}return 0;
}int ReadMem(DWORD dwPid)
{//要搜索的特征碼TCHAR szSub[] = TEXT("index?uin=");//特征碼出現(xiàn)的位置int iPos = 0;HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, dwPid);if (hProcess == NULL){return 0;}SYSTEM_INFO siSysInfo;GetSystemInfo(&siSysInfo);MEMORY_BASIC_INFORMATION mbi;DWORD pAddress = (DWORD)siSysInfo.lpMinimumApplicationAddress;int Count = GetTickCount();while (pAddress < (DWORD)siSysInfo.lpMaximumApplicationAddress){if (VirtualQueryEx(hProcess, (LPVOID)pAddress, &mbi, sizeof(mbi)) != sizeof(mbi)){return 0;}if ((mbi.State == MEM_COMMIT) && (mbi.Protect == PAGE_READWRITE)){DWORD Base = pAddress;int ReadSize = mbi.RegionSize;if (ReadSize >= 1024){DWORD dwBytes = 0;TCHAR *MemBuf = (TCHAR *)malloc(ReadSize * sizeof(TCHAR));if (ReadProcessMemory(hProcess, (LPCVOID)Base, MemBuf, ReadSize, &dwBytes)){//開始搜索特征碼iPos = SearchStr(MemBuf, dwBytes, szSub);if (iPos){_tprintf(TEXT(">>> Address: 0x%.8X\n"), Base + iPos * sizeof(TCHAR));//指向QQ號碼的第一個字符TCHAR *ptsQQ = &MemBuf[iPos + _tcslen(szSub)];_tprintf(TEXT(">>> QQ: "));//利用指針來打印出當前QQ進程的QQ號碼,//QQ號碼之后的字符是'&'for (;*ptsQQ != '&';*ptsQQ++){//注意這里是循環(huán)打印出QQ號碼的每個字符,而不是整個字符串_tprintf(TEXT("%c"), *ptsQQ);}_tprintf(TEXT("\n"));//找到1個就OK了,去除break可繼續(xù)找break;}}free(MemBuf);}}//從下一塊內(nèi)存塊繼續(xù)找pAddress = (DWORD)mbi.BaseAddress + mbi.RegionSize;}//計算一下查找QQ號碼的用時Count = GetTickCount() - Count;_tprintf(TEXT(">>> Time: %d ms\n"), Count);return iPos;
}DWORD FindByPID(PTSTR pszProcessName)
{DWORD dwProcessID = 0;HANDLE hProcessSnap;PROCESSENTRY32 pe32;hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hProcessSnap == INVALID_HANDLE_VALUE){return 0;}pe32.dwSize = sizeof(PROCESSENTRY32);if(!Process32First(hProcessSnap, &pe32)){CloseHandle(hProcessSnap);return 0;}do{//找到QQ進程if (wcscmp(pszProcessName, pe32.szExeFile) == 0){dwProcessID = pe32.th32ProcessID;wprintf(TEXT(">>> ------ PID = %d ------\n"), dwProcessID);//開始內(nèi)存搜索ReadMem(dwProcessID);wprintf(TEXT(">>> ------------------------\n\n"), dwProcessID);}}//繼續(xù)找下一個進程while(Process32Next(hProcessSnap, &pe32));CloseHandle(hProcessSnap);//如果存在QQ進程,此處return的是最后一個QQ進程的ID,//如果不在QQ進程,此處return的是dwProcessID的初始值0return dwProcessID;
}int _tmain(int argc, _TCHAR* argv[])
{TCHAR pszP[] = TEXT("QQ.exe");DWORD dwPID = FindByPID(pszP);if (!dwPID){wprintf(TEXT(">>> Do not found the QQ.exe\n"));}getchar();return 0;
}
轉(zhuǎn)自看雪論壇: http://bbs.pediy.com/showthread.php?t=129164
總結(jié)
以上是生活随笔為你收集整理的从QQ进程内存中搜索出QQ号码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IPC经典入侵
- 下一篇: SVN下载谷歌上的代码