// 读进程内存.cpp : 定义控制台应用程序的入口点。
//#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]){//若相同位置字符匹配成功,则计数器加1n++;}else  //相同位置字符匹配失败{//源字符串位置跳过匹配相同的n个字符i = i + n;//跳出当前匹配循环,开始新位置的匹配break;}}//若匹配成功,计数和目标字符串长度相等,则找到目标if (iSearchStrlen == n){//i为找到的目标字符串在源字符串中的起点位置,//此处return,即找到的目标字符串首次出现位置return i;//找到一个目标,后移一位继续找,//如要继续找,请注意最后的return,代码需做点小修改//i++;}}else  //若两字符串的第一个字符不同{//开始反向找源字符串相对目标字符串的后一个字符是否在目标字符串内for (int j = iSearchStrlen - 1; j >= 0; j--){//找到存在紧跟其后的那个字符if (pszSearchStr[j] == pszString[i + iSearchStrlen]){//该字符出现在目标字符串中的位置n = j;//只需知道排在倒数第一那个位置,跳出循环开始移动位置break;}}//移动到位置为(一个目标串长度减去出现目标串中匹配字符出现的位置),//即如果出现该字符,则使相同的两个字符对齐,若未出现,直接移动一个目标串长度i = i + iSearchStrlen - n;}}return 0;
}int ReadMem(DWORD dwPid)
{//要搜索的特征码TCHAR szSub[] = TEXT("index?uin=");//特征码出现的位置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++){//注意这里是循环打印出QQ号码的每个字符,而不是整个字符串_tprintf(TEXT("%c"), *ptsQQ);}_tprintf(TEXT("\n"));//找到1个就OK了,去除break可继续找break;}}free(MemBuf);}}//从下一块内存块继续找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);//开始内存搜索ReadMem(dwProcessID);wprintf(TEXT(">>> ------------------------\n\n"), dwProcessID);}}//继续找下一个进程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;
}

转自看雪论坛: http://bbs.pediy.com/showthread.php?t=129164

从QQ进程内存中搜索出QQ号码相关推荐

  1. 从QQ浏览器缓存文件中提取出完整的视频

    原文地址为: 从QQ浏览器缓存文件中提取出完整的视频 linux系统解决方案,mac应该也可以 https://github.com/lxhao/merge_video_cache 1. 本实验以安卓 ...

  2. c语言 内存搜索,怎么在一段内存中搜索一个十六进制串

    如何在一段内存中搜索一个十六进制串? 比如有长度为N,首地址为P的内存,搜索其中的内容是否包含有"001122ff"这样的串?如何能高效搜索?谢谢 ------解决方案------ ...

  3. 什么是堆栈?内存中划分出按FIL0方式操作的特殊区域,叫做堆栈

    内存中划分出按FIL0方式操作的特殊区域,叫做堆栈 有两个操作,分为压栈,出栈 每次压栈和出栈以字为单位. SS存放段基值,SP存放栈顶单元偏移量 SS:SP构成堆栈指针 物理地址SSx16+SP 常 ...

  4. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 使用 IDA 分析要修改的内存特征 | 根据内存特征搜索修改点 | 修改进程内存 )

    文章目录 一.使用 IDA 分析要修改的内存特征 二.根据内存特征搜索修改点 三.修改进程内存 一.使用 IDA 分析要修改的内存特征 在前的博客 [Android 逆向]逆向修改游戏应用 ( 分析应 ...

  5. 【转载】Windwos CE 跨进程内存注入

    一.程序实现的先决条件 由于windows系统的窗体消息总是投递至一个特定进程的指定窗体消息函数中.于是在本地进程(自己的应用程序)中取得属于其它进程的窗体的消息必须实现以下两个部分: 1.将需要挂接 ...

  6. 攻防实战:如何检测或优化内存中的.NET Tradecraft

    概述 对于红队的攻击操作来说,使用内存中的Tradecraft所起到的效果变得越来越大,这主要是由于EDR不断进行功能改进,已经使越来越多的蓝队获得了监测运行中内存的能力. 此前,我们曾经讨论过将混淆 ...

  7. android qq对话框消失,手机QQ电话聊着聊着,QQ上面图标忽然消失了,QQ电话也没了 得从新打开QQ才能继续聊...

    1.您的手机QQ若不在后台运行了,肯定就不会显示QQ图标了.您可能退出了QQ,或者被其他安全软件结束了进程.还有,只有当QQ处于后台运行时才会显示通知栏图标,处于QQ界面时,QQ图标不会显示! 2.您 ...

  8. 将ShellCode注入进程内存

    内存注入ShellCode的优势就在于被发现的概率极低,甚至可以被忽略,这是因为ShellCode被注入到进程内存中时,其并没有与之对应的硬盘文件,从而难以在磁盘中取证,但也存在一个弊端由于内存是易失 ...

  9. # Cobalt Strike: 使用进程内存解密流量-Part 3

    博客系列:Cobalt Strike:流量解密 Cobalt Strike:使用已知的私钥解密流量-Part 1 Cobalt Strike: 使用已知的私钥解密流量 - Part 2 Cobalt ...

最新文章

  1. 第三次上课 PPT 课后测试
  2. .Net中DataTable的保存
  3. HTML表格的简单使用1
  4. Currency Exchange(判断有无正环)
  5. 计算机文化基础模拟练习系统的设想
  6. Unity--初识Live2D Cubism以及通过代码来实现Live2D模型的基本功能(二)
  7. 如何在Word中输入英语音标?非常简单好用
  8. Mac Windows fliqlo 时钟屏保
  9. 自动采集收录导航源码
  10. 微信小程序之tab切换效果
  11. 波动率模型以及波动率的程式化特征实证
  12. 完美解决onenote同步速度慢(修改hosts文件)以及如何取得文件修改权限
  13. 用python将视频转化为图片
  14. python50图_菊安酱和菜菜的Python可视化50图
  15. python数据驱动创建账号_20190705-Python数据驱动之DDT
  16. C语言知识层次结构图
  17. 笔记本选购指南2020双十一
  18. 获取指定区域内的坐标点位,在线查看经纬坐标
  19. iReal Pro for Mac(优秀的音乐练习参考工具)
  20. hyper-v 安装 openwrt x86 squashfs

热门文章

  1. T6 s1 day19
  2. 【LeetCode 剑指offer刷题】查找与排序题14:Wiggle Sort(系列)
  3. 请求库-selenium 模块
  4. Cocos2D-x工程目录介绍
  5. 不能执行已经释放掉的Script代码!(已解决)
  6. 从一个C程序学“逐步求精”的分析方法
  7. [数据库] Oracle单表查询总数及百分比和数据横向纵向连接
  8. 【数据结构与算法】之深入解析“学生出勤记录I”的求解思路与算法示例
  9. python入门常用代码
  10. PAT (Basic Level) Practice (中文)1017 A除以B (20 分)