77.游戏分析工具计算数据偏移

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:易道云信息技术研究院

上一个内容: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;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值