#include<iostream>
#include <Windows.h>
#include <TlHelp32.h>

using namespace std;

typedef struct Node  //定义一个结构体
{
 DWORD Add;
 struct Node* pNext;
}node;
node* pHead = NULL,  
 *pEnd = NULL;


HANDLE hMyAllProce;
DWORD m_page = 4*1024;  //每页4kb 

void ShowAllProcess();  //显示所有进程 
BOOL OpenMyProcess();  //打开自己需要的进程 
void FirstFind();   //第一次找的函数,第一次找 是在内存里面找
void FindPage(DWORD m_begin,DWORD m_value); //第一页查找的函数 
void ShowList();   //显示出找到数据所连成的链表
void FindNext();   //下一次找 
BOOL WriteMyprocess();  //对找到的数据进行修改

int main()
{
 char flag;
 ShowAllProcess();
 if (OpenMyProcess())
 {
  FirstFind();
  ShowList();
  while (1)
  {
   cout<<"是否继续查找(Y/N)"<<endl;
   cin>>flag;
   if (flag=='y')
   {
    FindNext();
    ShowList();
   }
   if (flag=='n')
   {
    WriteMyprocess();
    break;
   }
  
  }
  
 }
 system("pause");;
 return 0;
}
void ShowAllProcess()
{
 int flag = 0;
 PROCESSENTRY32 pr ={sizeof(PROCESSENTRY32)};  //定义一个结构体 目的是为了存储快照相应的值
              //这个结构体有很多缺省的值 但是大小必须设定
 HANDLE hMyAllProce = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//调用快照的函数
 if (Process32First(hMyAllProce,&pr))    //Process32First是第一次获取快照的进程信息 判断能不能获取进程信息
 {             //有两个参数第一个是快照函数返回的句柄 第二个是 一个指向PROCESSENTRY32结构体的指针
  do
  {
   flag++;
   cout<< flag<<".  "<<pr.szExeFile<<"(ID)  "<<pr.th32ProcessID<<endl; //输出进程的文件名和ID号
  } while (Process32Next(hMyAllProce,&pr));      //判断下一次能不能获取下一次进程快照的信息
 }  

BOOL OpenMyProcess()         //打开进程函数
{
 DWORD m_ID;
 cout<<"请输入进程ID:"<<endl;
 cin>>m_ID;
 hMyAllProce = OpenProcess(PROCESS_ALL_ACCESS,false,m_ID);
 if (hMyAllProce)
 {
  cout<<"打开进程成功"<<endl;
  return TRUE;
 }
 else
 {
  cout<<"打开进程失败"<<endl;
  return FALSE;
 }
}

void FirstFind()       //第一次找是在内存里面找,查找范围:640k-2G 这是因为0-640k还有2G-4G系统用 我们不能用
{
 DWORD m_value;
 DWORD m_start = 640*1024;    //开始查找是从640k
 DWORD m_end = (DWORD)2*1024*1024*1024; //一直到2G结束

 cout<<"请输入要查的值:"<<endl;
 cin>>m_value;  
 for(DWORD i = m_start;i<=m_end;i += m_page) //每次查4K 因为每页4K 一次查一页
 {
  FindPage(i,m_value);     //每一页查询都调用按页查询函数
 }
}
void FindPage(DWORD m_begin,DWORD m_value)  //按页查询函数有两个参数 开始查询的位置和要查询的数据
{
 BYTE m_byte[4096];       //每次 查4k 查4096个字节
 node* temp = NULL;
 DWORD *pm_valve = (DWORD*)m_byte;     
 if (!ReadProcessMemory(hMyAllProce,(LPCVOID)m_begin,m_byte,4096,NULL)) //读进程函数 四个参数:从哪里读的(进程快照)从什么时候开始读
 {                  //读到哪里 每次读多大
  return;
 }
 for (DWORD i = 0;i< 1024;i++)    //每个DWORD4个字节查1024次总共查4096个字节
 {           //如果找到所要查询的数据,把数据连入链表,下一次从链表里面读取
  if(pm_valve[i] == m_value) 
  {
   temp = new node;
   temp->Add = m_begin + i*4;
   temp->pNext = NULL;
   if (!pHead)
   {
    pHead = temp;
   }
   else
   {
    pEnd->pNext = temp;
   }
   pEnd = temp;
  }
 }
}

void ShowList()        //显示链表
{
 node*temp = pHead;
 int m_count = 0;
 while(temp)
 {
  m_count++;
  cout<<"查询到的地址:"<<temp->Add<<endl;
  temp = temp->pNext;
 }
 cout<<"总共:"<< m_count<<"条记录"<<endl;
}

void FindNext()       //下一次查找  这一次是在链表中查找
{
 DWORD m_value;
 node* jz;
 node* temp = pHead;
 node* tempNext = pHead->pNext;
 BYTE m_byte[4];
 DWORD *pm_valve = (DWORD*)m_byte;
 cout<<"下一次查找的值:"<<endl;
 cin>>m_value;
 while(tempNext)
 {
  if (!ReadProcessMemory(hMyAllProce,(LPCVOID)tempNext->Add,m_byte,4,NULL))  //如果不能读取进程信息就返回
  {
   return;
  }  
  if (*pm_valve!=m_value)               //如果读到的数据和要求的数据不相等读下一个
  {
   jz = tempNext;
   tempNext=tempNext->pNext;
   temp->pNext = tempNext;
   delete jz;
  }
  else
  {
   temp = temp->pNext;
   tempNext= tempNext->pNext;
  } 

 }
 if (!ReadProcessMemory(hMyAllProce,(LPCVOID)pHead->Add,m_byte,4,NULL))   //判断第一个结点是否和所要求的数据是否相等
 {
  return;
 }
 if (*pm_valve!=m_value)
 {
  jz = pHead;
  pHead = pHead->pNext;
  delete jz;
 }
}

BOOL WriteMyprocess()                //修改进程里的数据
{
 DWORD m_Addr;
 DWORD m_Value;

 cout << "请输入要修改的地址:"<<endl;
 cin>> m_Addr;
 cout<<"请输入要修改的值:"<<endl;
 cin>>m_Value;

 if (WriteProcessMemory(hMyAllProce,( LPVOID)m_Addr,(LPCVOID)&m_Value,4,NULL))
 {
  cout<<"修改成功"<<endl;
  return TRUE;
 }
 else
 {
  cout<<"修改失败"<<endl;
  return FALSE;
 }
}

转载于:https://www.cnblogs.com/Mayflower4you/archive/2011/12/09/2281673.html

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐