封装进程内存相关操作函数

//ProcessMemory.h:进程内存操作封装
#pragma once
#include <windows.h>
#include <TLHELP32.H>

class PROCESS
{
private:
    HANDLE    hProcess;
public:
    //构造与解析
    PROCESS();
    ~PROCESS();
    //打开、关闭函数
    BOOL    OpenByName(char *szProcessName);
    BOOL    OpenByPID(DWORD PID);
    BOOL    Terminate();
    //读取函数
    BYTE    ReadByte(DWORD address);
    WORD    ReadWord(DWORD address);
    DWORD    ReadDword(DWORD address);
    float    ReadFloat(DWORD address);
    double    ReadDouble(DWORD address);
    void    ReadStr(DWORD address,char *Str,int MaxSize);
    void    ReadArray(DWORD address,int TypeLength,LPVOID ArrayAddress,int MaxSize);
    //查找函数
    DWORD    FindByte(DWORD StartAddr,DWORD EndAddr,BYTE FindByte);
    DWORD    FindWord(DWORD StartAddr,DWORD EndAddr,WORD FindWord);
    DWORD    FindDword(DWORD StartAddr,DWORD EndAddr,DWORD FindDword);
    DWORD    FindFloat(DWORD StartAddr,DWORD EndAddr,float FindFloat);
    DWORD    FindDouble(DWORD StartAddr,DWORD EndAddr,double FindDouble);
    DWORD    FindString(DWORD StartAddr,DWORD EndAddr,char *FindString);
    //写入函数
    void    WriteByte(DWORD address,BYTE data);
    void    WriteWord(DWORD address,WORD data);
    void    WriteDword(DWORD address,DWORD data);
    void    WriteFloat(DWORD address,float data);
    void    WriteDouble(DWORD address,double data);
    void    WriteStr(DWORD address,char *String);
    void    WriteData(DWORD address,LPVOID DataAddr,int size);
    //远程线程相关
    HANDLE    CreateThread(DWORD FuncAddr,LPVOID lpParameter,DWORD *PID);
    DWORD    AllocMemory(int SIZE);
    void    FreeMemory(DWORD address,int size);
    void    WaitThreadEnd(HANDLE hThread);
};

PROCESS::PROCESS()
{
    this->hProcess=NULL;
}
PROCESS::~PROCESS()
{
    CloseHandle(this->hProcess);
}

//根据进程名打开进程(进程名)
BOOL PROCESS::OpenByName(char *szProcessName)
{
    PROCESSENTRY32 pe ={0x00};
    char szProcName[255]={0};
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);

    strcpy(szProcName,szProcessName);
    pe.dwSize = sizeof(PROCESSENTRY32);
    BOOL flag = Process32First(hSnap,&pe);
    while (flag)
    {
        if (strcmp(strlwr(szProcName),strlwr(pe.szExeFile))==0)
        {
            this->hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);
            return TRUE;
        }
        flag=Process32Next(hSnap,&pe);
    }

    return FALSE;
}

//根据PID打开进程(PID)
BOOL PROCESS::OpenByPID(DWORD PID)
{
    this->hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
    if (this->hProcess)
        return TRUE;
    else
        return FALSE;
}

//结束进程()
BOOL PROCESS::Terminate()
{
    return ::TerminateProcess(this->hProcess,0);
}

//读取一个字节(地址)
BYTE PROCESS::ReadByte(DWORD address)
{
    DWORD RB;
    BYTE ret;

    ::ReadProcessMemory(this->hProcess,(LPVOID)address,&ret,1,&RB);
    return ret;
}

//读取一个字(地址)
WORD PROCESS::ReadWord(DWORD address)
{
    DWORD RB;
    WORD ret;

    ::ReadProcessMemory(this->hProcess,(LPVOID)address,&ret,2,&RB);
    return ret;
}

//读取一个双字(地址)
DWORD PROCESS::ReadDword(DWORD address)
{
    DWORD RB,ret;

    ::ReadProcessMemory(this->hProcess,(LPVOID)address,&ret,4,&RB);
    return ret;
}

//读取浮点数(地址)
float PROCESS::ReadFloat(DWORD address)
{
    float ret;
    DWORD RB;

    ::ReadProcessMemory(this->hProcess,(LPVOID)address,&ret,sizeof(float),&RB);
    return ret;
}

//读取双精度(地址)
double PROCESS::ReadDouble(DWORD address)
{
    double ret;
    DWORD RB;

    ::ReadProcessMemory(this->hProcess,(LPVOID)address,&ret,sizeof(double),&RB);
    return ret;
}

//读取字符串(地址,字符串,读取长度)
void PROCESS::ReadStr(DWORD address,char *Str,int MaxSize)
{
    DWORD RB;

    ::ReadProcessMemory(this->hProcess,(LPVOID)address,Str,MaxSize,&RB);
}

//读取数组(地址,待读取数据类型大小,保存数组,读取数组长度)
void PROCESS::ReadArray(DWORD address,int TypeLength,LPVOID ArrayAddress,int MaxSize)
{
    DWORD RB;

    for (int i=0;i<MaxSize;i++)
    {
        ::ReadProcessMemory(this->hProcess,(LPVOID)address,ArrayAddress,TypeLength,&RB);
        ArrayAddress=(void *)((DWORD)ArrayAddress+TypeLength);
        address+=TypeLength;
    }
}

//查找字节(起始地址,结束地址,待查找字节)
DWORD PROCESS::FindByte(DWORD StartAddr,DWORD EndAddr,BYTE FindByte)
{
    DWORD RB,nSize=255;
    BYTE ByteRead[255];

    while (StartAddr<EndAddr)
    {
        memset(ByteRead,0,255);
        if (StartAddr+255>=EndAddr)
            nSize=EndAddr-StartAddr;

        ::ReadProcessMemory(this->hProcess,(LPVOID)StartAddr,ByteRead,nSize,&RB);
        for (UINT i=0;i<nSize;i++)
        {
            if (ByteRead[i]==FindByte)
                return StartAddr+i;
        }

        StartAddr+=255;
    }

    return 0;
}

//查找字(起始地址,结束地址,待查找字)
DWORD PROCESS::FindWord(DWORD StartAddr,DWORD EndAddr,WORD FindWord)
{
    DWORD RB,nSize=1024;
    BYTE Read[1024];

    while (StartAddr<EndAddr)
    {
        memset(Read,0,1024);
        if (StartAddr+1024>=EndAddr)
            nSize=EndAddr-StartAddr;

        ::ReadProcessMemory(this->hProcess,(LPVOID)StartAddr,Read,nSize,&RB);
        for (UINT i=0;i<=nSize-2;i++)
        {
            if (*(WORD*)&Read[i]==FindWord)
                return StartAddr+i;
        }

        StartAddr+=1024;
    }

    return 0;
}

//查找双字(起始地址,结束地址,待查找双字)
DWORD PROCESS::FindDword(DWORD StartAddr,DWORD EndAddr,DWORD FindDword)
{
    DWORD RB,nSize=4096;
    BYTE Read[4096];

    while (StartAddr<EndAddr)
    {
        memset(Read,0,4096);
        if (StartAddr+4096>=EndAddr)
            nSize=EndAddr-StartAddr;

        ::ReadProcessMemory(this->hProcess,(LPVOID)StartAddr,Read,nSize,&RB);
        for (UINT i=0;i<=nSize-4;i++)
        {
            if (*(DWORD *)&Read[i]==FindDword)
                return StartAddr+i;
        }

        StartAddr+=4096;
    }

    return 0;
}

//查找单精度浮点数(起始地址,结束地址,待查找单精度浮点数)
DWORD PROCESS::FindFloat(DWORD StartAddr,DWORD EndAddr,float FindFloat)
{
    DWORD RB,nSize=4096;
    BYTE Read[4096];
    
    while (StartAddr<EndAddr)
    {
        memset(Read,0,4096);
        if (StartAddr+4096>=EndAddr)
            nSize=EndAddr-StartAddr;
        
        ::ReadProcessMemory(this->hProcess,(LPVOID)StartAddr,Read,nSize,&RB);
        for (UINT i=0;i<=nSize-4;i++)
        {
            if (*(float *)&Read[i]==FindFloat)
                return StartAddr+i;
        }
        
        StartAddr+=4096;
    }
    
    return 0;
}

//查找双精度浮点数(起始地址,结束地址,待查找双精度浮点数)
DWORD PROCESS::FindDouble(DWORD StartAddr,DWORD EndAddr,double FindDouble)
{
    DWORD RB,nSize=4096;
    BYTE Read[4096];
    
    while (StartAddr<EndAddr)
    {
        memset(Read,0,4096);
        if (StartAddr+4096>=EndAddr)
            nSize=EndAddr-StartAddr;
        
        ::ReadProcessMemory(this->hProcess,(LPVOID)StartAddr,Read,nSize,&RB);
        for (UINT i=0;i<=nSize-8;i++)
        {
            if (*(double *)&Read[i]==FindDouble)
                return StartAddr+i;
        }
        
        StartAddr+=4096;
    }
    
    return 0;
}

//查找字符串(起始地址,结束地址,字符串)
DWORD PROCESS::FindString(DWORD StartAddr,DWORD EndAddr,char *FindString)
{
    DWORD RB,nSize=4096;
    BYTE Read[4096];
    
    while (StartAddr<EndAddr)
    {
        memset(Read,0,4096);
        if (StartAddr+4096>=EndAddr)
            nSize=EndAddr-StartAddr;
        
        ::ReadProcessMemory(this->hProcess,(LPVOID)StartAddr,Read,nSize,&RB);
        for (UINT i=0;i<nSize;i++)
        {
            if(Read[i]==FindString[0])
            {
                for (UINT k=0;k<strlen(FindString);k++)
                {
                    if (Read[i+k]!=FindString[k])
                        break;
                }
                if (k==strlen(FindString))
                    return StartAddr+i;
            }
        }

        StartAddr=StartAddr+4096-strlen(FindString);
    }
    
    return 0;
}

//写入字节(地址,字节数据)
void PROCESS::WriteByte(DWORD address,BYTE data)
{
    DWORD RB;

    ::WriteProcessMemory(this->hProcess,(LPVOID)address,&data,1,&RB);
}

//写入一个字(地址,字数据)
void PROCESS::WriteWord(DWORD address,WORD data)
{
    DWORD RB;

    ::WriteProcessMemory(this->hProcess,(LPVOID)address,&data,2,&RB);
}

//写入一个双字(地址,双字数据)
void PROCESS::WriteDword(DWORD address,DWORD data)
{
    DWORD RB;

    ::WriteProcessMemory(this->hProcess,(LPVOID)address,&data,4,&RB);
}

//写入单精度浮点数(地址,单精度浮点数据)
void PROCESS::WriteFloat(DWORD address,float data)
{
    DWORD RB;

    ::WriteProcessMemory(this->hProcess,(LPVOID)address,&data,4,&RB);
}

//写入双精度浮点数(地址,双精度浮点数)
void PROCESS::WriteDouble(DWORD address,double data)
{
    DWORD RB;

    ::WriteProcessMemory(this->hProcess,(LPVOID)address,&data,8,&RB);
}

//写入字符串
void PROCESS::WriteStr(DWORD address,char *String)
{
    DWORD RB;

    ::WriteProcessMemory(this->hProcess,(LPVOID)address,(LPVOID)String,strlen(String),&RB);
}

//写入自定义数据(地址,数据起始地址,写入长度)
void PROCESS::WriteData(DWORD address,LPVOID DataAddr,int size)
{
    DWORD RB;

    ::WriteProcessMemory(this->hProcess,(LPVOID)address,DataAddr,size,&RB);
}

//简单远程线程(函数地址,参数,返回PID)
HANDLE PROCESS::CreateThread(DWORD FuncAddr,LPVOID lpParameter=NULL,DWORD *PID=NULL)
{
    return ::CreateRemoteThread(this->hProcess,NULL,0,(LPTHREAD_START_ROUTINE)FuncAddr,lpParameter,0,PID);

}

//分配内存空间(大小)
DWORD PROCESS::AllocMemory(int SIZE)
{
    return (DWORD)::VirtualAllocEx(this->hProcess,NULL,SIZE,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
}

//释放空间(地址,大小)
void PROCESS::FreeMemory(DWORD address,int size)
{
    ::VirtualFreeEx(this->hProcess,(LPVOID)address,size,MEM_DECOMMIT|MEM_RELEASE);
}

//等待线程执行完毕()
void PROCESS::WaitThreadEnd(HANDLE hThread)
{
    ::WaitForSingleObjectEx(hThread,INFINITE,FALSE);
}

 


posted @ 2012-05-29 16:27  little evil  阅读(367)  评论(0编辑  收藏  举报