【发布时间】:2021-01-05 00:12:22
【问题描述】:
我有我的基本内存地址"GameAssembly.dll"+00DA5A84 和一些offets。加上这个,我得到了我需要的地址。 (红色矩形)。每次重置游戏时都会更改。
获得内存地址后,我可以执行以下操作:
public void isImpostor(IntPtr addrs, int valueToWriteInMemory)
{
using (var sharp = new MemorySharp(Process.GetProcessesByName("Among Us").FirstOrDefault()))
{
sharp[addrs, false].Write(valueToWriteInMemory);
}
}
var addrs = new IntPtr(0x210A83A8);
isImpostor(addrs, 0x0);
不过,我不确定如何获得该内存地址。不知道怎么做:
"GameAssembly.dll" + 0x00DA5A94 + 0x28 + 0x34 + 0x0 + 0x5C 并作为结果获得0x210A83A8。
更新:
为了知道 GameAssembly.dll 中的 AddressBase 是什么,我有这个方法。
public int GetModuleAddress(String pName, String dllName)
{
Process p = Process.GetProcessesByName(pName).FirstOrDefault();
foreach(ProcessModule pm in p.Modules)
if (pm.ModuleName.Equals(dllName))
return (int)pm.BaseAddress;
return 0;
}
Console.WriteLine(GetModuleAddress("Among Us", "GameAssembly.dll");
Console.WriteLine((IntPtr)GetModuleAddress("Among Us", "GameAssembly.dll"));
Result1 (As integer): 2043150336
Result2 (After Casting to IntPtr): 2043150336 here I can do the addition I mentioned before.
它返回一个int,所以我不能添加 GameAssembly.dll + 0x00DA5A94。假设我将此结果转换为IntPtr。一旦它被转换为 IntPtr 我就可以做到这一点。
IntPtr A_ptr =(IntPtr)GetModuleAddress("Among Us", "GameAssembly.dll") + 0x00DA5A94;
但我收到此消息错误:
System.ComponentModel.Win32Exception: 'Couldn't read 4 byte(s) from 0x5C.'
我还尝试使用toString("X") 方法将地址转换为十六进制,结果得到79C80000,但我既不能做79C80000 + 0x00DA5A94 也不能做0x79C80000 + 0x00DA5A94。
查看变量内部的值我得到了这个。
BaseAdressDLL: 2043150336
A: 0, Aptr: 2057460372 (or 0x00000000 and 0x7aa25a94 respectively)
Bptr: 92 (or 0x0000005c)
我做错了什么?我的英语也很抱歉。
我尝试使用 Cheat 引擎提供的 BaseAdress,它运行良好,所以我认为我不知道如何正确获取 AdressBase。
var sharp = new MemorySharp(Process.GetProcessesByName("Among Us").FirstOrDefault());
/* This does`t work
IntPtr GameB = (IntPtr)GetModuleAddress("Among Us", "GameAssembly.dll");
IntPtr GameAssemblyDllBaseAddress = sharp.Read<IntPtr>(GameB, false);
IntPtr A_ptr = GameAssemblyDllBaseAddress + 0x00DA5A94;
IntPtr A = sharp.Read<IntPtr>(A_ptr, false);
*/
// But this does it.
IntPtr A = (IntPtr)0x11F7FC18; // Using AddressBase directly.
// -------------
IntPtr B_ptr = A + 0x5C;
IntPtr B = sharp.Read<IntPtr>(B_ptr, false);
IntPtr C_ptr = B + 0x0;
IntPtr C = sharp.Read<IntPtr>(C_ptr, false);
IntPtr D_ptr = C + 0x34;
IntPtr D = sharp.Read<IntPtr>(D_ptr, false);
IntPtr isImpostor_ptr = D + 0x28;
// read
int isImpostor = sharp.Read<int>(isImpostor_ptr, false);
// write
sharp[isImpostor_ptr, false].Write(0x1);
【问题讨论】:
-
这能回答你的问题吗? How this memory address is calculated?
-
请不要多次发布同一个问题。
-
是的,每次启动可执行文件时,基地址都会发生变化,您对此无能为力,这就是处理器和操作系统的工作方式,尤其是在 x32 保护模式和 x64 中.几年前我本可以在 DOS 中帮助您,但对于现代 Windows 和 .NET,请等待有人回答您,用更多细节改进您的问题或添加 赏金。
-
我知道它会改变,我在问如何获得具有基本内存地址和偏移量的新地址。就像作弊引擎获取新地址(红色矩形)一样,我怎样才能以编程方式获取它。 (另外,我再次写了这篇文章,因为它被降级了,没有人再看到它,即使我尝试更新它,赏金选项也不再可用,可能是因为降级?)