5-封装功能

封装功能

本封装实现了类模板

1.头文件

#pragma once
#include<Windows.h>
struct JXRole {
int unknow_1[4];
int hp[2];
int tp[2];
int mp[2];
int act;
int def;
int sf;
int lv;
int unknow_2;
int exp[2];
int speed;
int unknown_3[4];
int x;
int y;
int unknow_4[36];
char Name[0x20];
};

template<class T>
class GAMECheat;

template<typename T_type>
class typeData {
GAMECheat<T_type>* pCheat;
void* dataAdr;
public:
typeData(GAMECheat<T_type>* _pCheat, void* _dataAdr) :pCheat(_pCheat), dataAdr(_dataAdr) {}
template<typename T>
GAMECheat<T_type>& operator=(T val)
{
pCheat->SetData(dataAdr,&val,sizeof(T));
return *pCheat;
}
};

template <class T>
class GAMECheat {
public:
GAMECheat(unsigned Pid, unsigned _baseAdr, unsigned _readTime = 100); //使用构造函数来处理初始化
~GAMECheat();
T& Data(bool isCheckTime = true); //读取数据(对外)
void SetData(void* dataAdr, void* buff, SIZE_T dataSize);
typeData<T> SetData(void* dataAdr);
private:
T data; //游戏数据类型
bool ReadData(unsigned update); //读取数据
HANDLE hProcess; //打开的进程句柄
unsigned baseAdr; //读取进程的基址
unsigned lastRead; //上一次读取的时间
unsigned readTime; //读取的时间间隔

};

2.实现文件

#include"GAMECheat.h"

template<class T>
GAMECheat<T>::GAMECheat(unsigned Pid, unsigned _baseAdr, unsigned _readTime)
{
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
readTime = _readTime;
baseAdr = _baseAdr;
//return (hProcess != NULL);
}

template<class T>
GAMECheat<T>::~GAMECheat()
{
if (hProcess) CloseHandle(hProcess);
}


template <class T>
bool GAMECheat<T>::ReadData(unsigned update)
{
if (hProcess == NULL)
{
return false;
}
lastRead = update;
return ReadProcessMemory(hProcess, (LPCVOID)baseAdr, this, sizeof(JXRole), NULL);
}

template <class T>
T& GAMECheat<T>::Data(bool isCheckTime)
{
// TODO: 在此处插入 return 语句
if (!isCheckTime) return data;
unsigned now = GetTickCount(); //得到系统启动时间
if(now-lastRead > readTime)
ReadData(now);
return data;
}

template<class T>
void GAMECheat<T>::SetData(void* dataAdr, void* buff, SIZE_T dataSize)
{
LPVOID destAdr = (LPVOID)((unsigned)dataAdr - (unsigned)this + baseAdr);
WriteProcessMemory(hProcess, destAdr, buff, dataSize, NULL);
}

template<class T>
typeData<T> GAMECheat<T>::SetData(void* dataAdr)
{
return typeData<T>(this,dataAdr);
}

template class GAMECheat<JXRole>;

3.main

#include <iostream>
#include"GAMECheat.h"
int main()
{
unsigned Pid;
std::cin >> Pid;
GAMECheat<JXRole> gcheat(Pid, 0x4CEF08);
std::cout<<gcheat.Data().Name<<std::endl;
std::cout << gcheat.Data(false).act << std::endl;
std::cout << gcheat.Data(false).def << std::endl;
std::cout << gcheat.Data(false).sf << std::endl;
std::cout << gcheat.Data(false).speed << std::endl;
int hp = 4;
//gcheat.SetData((void*)&gcheat.Data().hp[0], &hp, sizeof(hp));
(gcheat.SetData((void*)&gcheat.Data().act) = 9999).SetData((void*)&gcheat.Data().speed) = 9999;
}