#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;
}
}
所有评论(0)