C++如何用包含浮标的CE地址来读/写进程?

C++如何用包含浮标的CE地址来读/写进程?,c++,readprocessmemory,cheat-engine,C++,Readprocessmemory,Cheat Engine,我目前正在为一名游戏培训师开发远程传送功能。我发现正确的静态地址包含一个浮点数: 这个地址指向我的X坐标。现在,我正在尝试用读/写进程内存更改X坐标a浮点。但是无论我做什么,它都不起作用,我在改变正常整数方面没有问题。我想用之前选择的浮点值替换该值 有谁能给我一个详细的例子,我怎么能做到这一点 提前感谢您1获取进程基址- HPProcess是句柄,将openprocess返回值传递给该句柄 2将“传送”偏移量添加到基址 3将给定值写入进程的内存 HANDLE hProcess = openPro

我目前正在为一名游戏培训师开发远程传送功能。我发现正确的静态地址包含一个浮点数:

这个地址指向我的X坐标。现在,我正在尝试用读/写进程内存更改X坐标a浮点。但是无论我做什么,它都不起作用,我在改变正常整数方面没有问题。我想用之前选择的浮点值替换该值

有谁能给我一个详细的例子,我怎么能做到这一点


提前感谢您

1获取进程基址- HPProcess是句柄,将openprocess返回值传递给该句柄

2将“传送”偏移量添加到基址

3将给定值写入进程的内存

HANDLE hProcess = openProcess(processId); //you also need to pass desired mode, use read & write
DWORD dwBaseAddress = getBaseAddress(hProcess): 
DWORD dwPositionAddress = dwBaseAddress + POSITION_OFFSET; 
float newPosition = 123.5;
WriteProcessMemory(hProcess, dwPositionAddress, &newPosition, sizeof(float));

你需要检查错误,这只是伪代码,让你知道你需要做什么,还要确保你以管理员的身份运行你的培训师,并有权访问游戏内存。你必须读取指针,并将指针的相对偏移量添加到传送地址

您可以使用WriteProcessMemory直接写入进程内存,也可以使用ReadProcessMemory从内存中读取

但在这种情况下,若你们正在阅读两个三级指针,那个么这样做会变得很麻烦

所以我建议使用游戏训练师或内存黑客库来轻松读取/写入指针

您可以使用用于C/C++的GTLibc游戏训练器库。

或者你也可以使用Memory.dll游戏黑客库为C。

改为在内部执行 Readprocessmemory和writeprocessmemory相对简单,但更好的选择是向目标进程中注入DLL,以提高速度和简单性。您可以通过使用*手动执行偏差,也可以使用首选方法设置具有适当大小的类,这样就不必以相同的方式处理偏移。请查看Reclass.NET以实现此操作的自动化

class unk3{
public:
    char pad_001[0x10];
    float location;
}

class unk2{
public:
    unk3* m_unk3;
}

class unk1{
public:
    char pad_001[0x78];
    unk2* m_unk2;
}
然后在静态偏移量处声明一个实例,并像读/写自己的内存一样对其进行读/写

unk1* p_unk1 = (unk1*)(uintptr_t*)(OFFSET);
p_unk1->m_unk2->m_unk3->location = 300f;
使用RPM 如果要转到外部,首先需要打开进程的句柄

void attach(LPCSTR WindowName) {
    HWND hWindow = FindWindowA(NULL, WindowName); 
    if (hWindow)
    {
        GetWindowThreadProcessId(hWindow, &Proc_ID); 
        hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION/*PROCESS_ALL_ACCESS*/, FALSE, Proc_ID); 
        HANDLE hModule = INVALID_HANDLE_VALUE; 
        MODULEENTRY32 ePoint; 
        hModule = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Proc_ID); 
        ePoint.dwSize = sizeof(MODULEENTRY32); 
        Module32First(hModule, &ePoint);
        base = (DWORD*)ePoint.modBaseAddr; 
        CloseHandle(hModule);
    }
}
然后我建议为你设置阅读/写作模板

template <class T>
T read(DWORD_PTR Address){
    T buffer;
    ReadProcessMemory(this->hProcess, (LPCVOID)Address, &buffer, sizeof(buffer), NULL);
    return buffer;
}
用DWORD_PTR替换每个类*

然后用

unk1 p_unk1 = mem.read<unk1>(OFFSET);
unk2 p_unk2 = mem.read<unk2>(p_unk1.m_unk2);
unk3 p_unk3 = mem.read<unk3>(p_unk2.m_unk3);
float location = p_unk3.Location;
对于那些想知道的人,这样写是可以做到的:

mem.write<float>(p_unk2 + offsetof(unk3, location), value);
收尾
在内部这样做明显更好,麻烦更少。请注意,writeprocessmemory只处理字节,它不关心类型。当int和float使用小endian进行不同编码时,您可能将整数的地址作为缓冲区进行写入。确保将其声明为浮点,或者更好的是使用模板。或者更好,只需编写一个dll:

欢迎访问stackoverflow.com。请花些时间阅读,特别是命名和。也请和。最后,请学习如何创建。简言之:我们不会给您详细的示例,但如果您可以创建一个小而简单的示例来突出您的问题,并向我们展示,我们将帮助您解决现有代码中的问题。如果它不起作用,您如何确定它是正确的地址?请注意,您甚至不能指望有一个正确的地址存在。实际的live值可能只存在于寄存器中,您可能会在内存中看到它的副本。更改副本不会更改原始地址。@m更改正确的地址,因为如果我更改CE中的值,它会起作用。我只是不知道如何在C++中做到这一点!使用库来实现这一点并不是什么好建议,尤其是如果一个6行模板函数可以做到这一点的话。库可以只提供一种方法,如ReadPointerOffset或带有单个函数的偏移量。您可以轻松地读取带有多个偏移量的多个指针。但如果您想手动执行此操作,则必须多次使用ReadProcessMemory,并且必须在循环中执行,并添加从void*到int*的地址转换,以添加偏移量。所以图书馆可以为你们做这些事。你可以使用或不使用任何外部库,正如我之前所说的,没有强制力。你看到我的答案了吗?模板是首选选项,因为您的应用程序不受库支持的任何类型的限制。此外,使用readpointeroffset这样的伪函数是一个糟糕的想法,因为每个指针一次只能读取8个字节。这样的库会对类中vector3中的每个浮点使用ReadFloat,而不是通过映射您试图读取的类并将其传递到模板中,在一次rpm调用中读取类的每个成员。这样的库效率很低,会导致错误的做法。是的,我读了你的答案,我同意模板是更好的选择,但我不同意readPointeroffset是个糟糕的主意,我给你们举了一个简单的readPointer例子,它假设数据是INT,对于其他类型,比如float或Double,会有另一个或重载的方法,因为float和Double需要额外的精度。你是在建议t
o注入DLL注入DLL不是一个好主意,在这里你可以只操作内存,DLL是你可以建议的高级东西,ShellCodeInjection方法很简单,不需要加载外部库。如果你做了大量的内存读写,注入DLL更容易,远不止使用WPM编写程序集。当速度经常很重要时,在同一个类中对不同成员使用多个RPM调用是没有意义的,因为您可以一次读取整个类。因为Float和Double需要额外的精度,你知道内存是如何工作的吗?你的论点毫无道理。如果您认为一个可注入的dll是高级的,那么您只需要比我在回答一个可注入的dll时多出3行就可以了。德尔曼
unk1 p_unk1 = mem.read<unk1>(OFFSET);
unk2 p_unk2 = mem.read<unk2>(p_unk1.m_unk2);
unk3 p_unk3 = mem.read<unk3>(p_unk2.m_unk3);
float location = p_unk3.Location;
mem.write<float>(p_unk2 + offsetof(unk3, location), value);