c# - C#从具有多个偏移量的指针读取值
问题描述
我正在尝试使用 VAMemory 库读取浮点数,并且我有基本偏移量和要从 CE 添加到指针的偏移量,我知道它们正确引用了该值(在 CE 中相应地更改了值)
以下是 CE 显示的偏移量:(根据之前关于此主题的问题,它们应该从下到上应用,因为它们出现在 CE 中)
我已经尝试了在每次迭代时“取消引用”指针的多种实现,因为必须一个接一个地添加偏移量,我不确定我是否正确获取了基地址,是否应该遍历模块而是将其与我在其他问题中看到的名称匹配。我现在正在尝试使用类似问题中显示的实现,但是我得到的返回值始终是0
private static float GetPointerValue(IntPtr baseAddress, int[] offsetArr)
{
VAMemory vam = new VAMemory("amtrucks");
//Adding original offset to base address
IntPtr pointer = IntPtr.Add((IntPtr)vam.ReadInt32(baseAddress + 0x014BC410), offsetArr[0]);
for (int i = 1; i < offsetArr.Length; i++)
{
pointer = IntPtr.Add((IntPtr)vam.ReadInt32(pointer), offsetArr[i]);
}
return vam.ReadFloat(pointer);
}
public void SetCam(float height)
{
Process GameProcess = Process.GetProcessesByName("amtrucks").FirstOrDefault();
IntPtr BaseAddress = GameProcess.MainModule.BaseAddress;
//Offsets in reverse order
var offsetArr = new int[] { 0x18, 0x40, 0x0, 0x3C8, 0x48};
Console.WriteLine("value:" + GetPointerValue(BaseAddress, offsetArr));
}
它不会抛出任何异常或错误消息,但值始终为 0(实际值在 43 左右)
解决方案
public static IntPtr FindDMAAddy(IntPtr hProc, IntPtr ptr, int[] offsets)
{
var buffer = new byte[IntPtr.Size];
foreach (int i in offsets)
{
ReadProcessMemory(hProc, ptr, buffer, buffer.Length, out var read);
ptr = (IntPtr.Size == 4)
? IntPtr.Add(new IntPtr(BitConverter.ToInt32(buffer, 0)), i)
: ptr = IntPtr.Add(new IntPtr(BitConverter.ToInt64(buffer, 0)), i);
}
return ptr;
}
public static IntPtr GetModuleBaseAddress(Process proc, string modName)
{
IntPtr addr = IntPtr.Zero;
foreach (ProcessModule m in proc.Modules)
{
if (m.ModuleName == modName)
{
addr = m.BaseAddress;
break;
}
}
return addr;
}
Process proc = Process.GetProcessesByName("whatever")[0];
var modBase = GetModuleBaseAddress(proc, "whatever.exe");
var freecamheight = FindDMAAddy(hProc, (IntPtr)(modBase + 0x14bc410), new int[] { 0x18, 0x40, 0, 0x3c8, 0x48});
然后使用 VAMemory 读取地址“freecamheight”处的浮点数
推荐阅读
- powershell - Atom 终端:Windows PowerShell 未打开
- r - 无法用大光栅编织 RMarkdown
- jmeter - 在 POST 请求的索引 53 处获取路径中的非法字符
- excel - 宏用逗号分隔 .csv,尽管分隔符设置为分号
- c# - 使用嵌套的 For 循环对数字元组列表进行排序。.Net 4.0 C#
- sql - 在 postgres 中查询文本数组
- android - Proguard 无法读取 android.jar
- html - 如何根据单词的长度在单词之间创建等距空间?
- r - 通过 - 基本问题使用 j 中的函数
- java - 更改文本字段以仅显示大写和小写