免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:易道云信息技术研究院
上一个内容:76.游戏分析工具读取内存存到对象数据分析器一
以它的代码为基础进行修改
COBJContext.cpp文件的修改
BOOL COBJContext::UpdateData(HANDLE _hProcess)
{
BOOL bRet = ReadProcessMemory(_hProcess, Address, data, Size, NULL);
if (!MEMContext && bRet) {
if (!MEMContext) {
CreateMEMContext();
}
}
return bRet;
}
void COBJContext::CreateMEMContext()
{
int v = Size % 4;
int s = Size / 4;
MEMContext = new CMEMContext(T_int, L"unknown", L"unknown", NULL);
}
COBJContext.h文件的修改
#pragma once
#include "CMEMContext.h"
typedef class COBJContext
{
CString txtFolder;
CString txtFile;
CString txtName;
LPVOID Address;// 内存地址
/**
内存地址不是一个简单的数字,它有可能是一个 基址 加上 一个数字,有可能还是一个指针算出来的
然后这种的通过字符串进行记录,让它通过字符串可以算出内存地址
Address 与 txtAddress配套使用
*/
CString txtAddress;
DWORD Size{};
CString txtNote;
char* data{};
public:
COBJContext(const wchar_t* folder, const wchar_t* _name);
COBJContext(const wchar_t* folder, const wchar_t* _name, const wchar_t * _address, DWORD _size, const wchar_t* _note);
~COBJContext();
public:
void Save();
void Delete();
BOOL UpdateData(HANDLE _hProcess);
void Set(const wchar_t* _name, const wchar_t* _address, DWORD _size, const wchar_t* _note, bool IsSet=true);
public:
DWORD GetSize();
CString& GetAddress();
CString& GetNote();
CString& GetName();
public:
PCMEMContext MEMContext;
void CreateMEMContext();
}*PCOBJContext;
typedef struct TREE_DATA {
DWORD MenuId{};
LPVOID DATA_PTR{};
}*PTREE_DATA;
CMEMContext.h文件的修改
#pragma once
#define T_bool 0
#define T_char 1
#define T_uchar 2
#define T_short 3
#define T_ushort 4
#define T_int 5
#define T_uint 6
#define T_float 7
#define T_llong 8
#define T_ullong 9
#define T_double 10
#define T_pvoid 11
void InitDataTypeTable();
struct DATA_TYPE {
wchar_t* UName;
unsigned Size;
};
typedef class CMEMContext
{
bool Used{};
DATA_TYPE* type;
unsigned lenth;
unsigned offset;
CString txtName;
CString txtNote;
CMEMContext* Front{};
CMEMContext* Next{};
public:
CMEMContext(int TypeId, const wchar_t* _name, const wchar_t * _txt, CMEMContext * _front);
}*PCMEMContext;
CMEMContext.cpp文件的修改
CMEMContext::CMEMContext(int TypeId, const wchar_t* _name, const wchar_t* _note, CMEMContext* _front)
{
// 当前数据是什么类型
type = &data_TYPE[TypeId];
txtName = _name;
txtNote = _note;
// 计算偏移,偏移是通过上一个结构的位置进行计算得出
if (Front) {
// 对齐方式
unsigned align = 4;
// 通过上一个结构计算出当前结构的位置
unsigned allSize = Front->offset + Front->type->Size * Front->lenth;
// 得到当前数据是几字节
unsigned m = allSize % align;
// 当前数据大小比如当前数据是一个char[3],也就是3字节然后align是内存对齐方式3不满4需要给它补0,m变量表示的是要补几个0
unsigned free = align - m;
unsigned fix;
if (free < type->Size) {
fix = free;
}
else {
fix = type->Size - m % type->Size;
}
// 上一个结构位置加上当前计算出的结构大小就等于当前数据的偏移
offset = allSize + fix;
}
}