我正在寻找一种方法将指针地址从作弊引擎传递到一行代码。
作弊引擎地址是P-> 0C86D240。
代码行如下:
WriteProcessMemory(handle,(LPVOID)P->0C86D240,).
最后我想改变指针地址'的值。
更新:我改变了P->到0x0C86D240,我能够为游戏的THAT会话写入内存。当关闭然后再次打开时,十六进制数字是不同的
答案 0 :(得分:3)
P->0C86D240
表示该条目是一个指针链,最终解析为地址0x0C86D240
。如果在Cheat Engine中双击此部件,您将看到一个弹出对话框,显示此指针链的组成部分。例如,让我们调用起始指针P0
和一系列名为offset0, offset1, offset2, ...
的偏移量。指针链是取地址P0 + offset0
的值,将其用作下一个指针P1
,然后取地址P1 + offset1
的值,将其用作下一个指针{{ 1}} ...这个链最终会给你一个地址P2
。如果您重置游戏,则希望0C86D240
不会发生变化,但之后的所有内容都会动态变化(即P0
...)并一直追踪到所需的值。
如果你知道指针链是如何工作的,那么将它转换为C ++是微不足道的。您只需要记下基本指针和所有偏移量(如弹出对话框中双击P1, P2, P3,
部分所示)。然后,向下追踪直到您用完所有偏移值。
答案 1 :(得分:1)
第1步:使用作弊引擎搜索您想要更改的值。
第2步:如果找到了正确的地址,请右键单击该地址并对该地址进行指针扫描。现在你应该得到许多具有一些偏移量的基地址。
第3步:关闭游戏并重复步骤1.现在复制新地址并单击重新扫描指针扫描(在步骤2中打开的窗口中)。在重新扫描地址中粘贴新地址现场和重新扫描。那么你应该只得到正确的基址+偏移量。
第4步:总是找到正确的地址:readprocessmemory(baseaddress + offset)
答案 2 :(得分:0)
关闭后再次打开十六进制数字
如果我错了,我猜你正在谈论游戏然后再继续阅读
所以你从作弊引擎获得的地址可能是动态的,这意味着每次你关闭或打开它时该值会改变意义,程序将被分配到内存中的另一个地方
那你该怎么做.....
你可以找到静态地址这个过程有点复杂我会建议你看一个教程https://www.youtube.com/watch?v=hfWOAFsYnFA
答案 3 :(得分:0)
作弊引擎教程涵盖了多级指针。先做你的工作。如果已经找到指针,那么您正在寻找的地址:一个静态地址,指向包含您要修改的值的地址。
答案 4 :(得分:0)
您编写了一个遍历多级指针的函数,该函数取消引用指针的每一步并添加相对偏移量。
在此示例中,我将使用我制作的简单的攻击立方体作弊
FindDMAAddy函数(查找动态内存分配地址):
uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
{
uintptr_t addr = ptr;
for (unsigned int i = 0; i < offsets.size(); ++i)
{
ReadProcessMemory(hProc, (BYTE*)addr, &addr, sizeof(addr), 0);
addr += offsets[i];
}
return addr;
}
主要代码:
uintptr_t moduleBase = GetModuleBaseAddress(procId, L"ac_client.exe");
//Get Handle to Process
HANDLE hProcess = 0;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, NULL, procId);
//Resolve base address of the pointer chain
uintptr_t dynamicPtrBaseAddr = moduleBase + 0x10f4f4;
std::cout << "DynamicPtrBaseAddr = " << "0x" << std::hex << dynamicPtrBaseAddr << std::endl;
//Resolve our ammo pointer chain
std::vector<unsigned int> ammoOffsets = { 0x374, 0x14, 0x0 };
uintptr_t ammoAddr = FindDMAAddy(hProcess, dynamicPtrBaseAddr, ammoOffsets);
std::cout << "ammoAddr = " << "0x" << std::hex << ammoAddr << std::endl;
您可以找到我的答案here的更完整版本,但您似乎已经知道其余的内容。