C# 简化多指针的内存读取
C# Streamline memory reading of multi-pointer
我创建了一个方法,该方法将通过提供所需的偏移量+起始地址来读取多指针。(下面的代码)。总而言之,我试图简化这种方法,下面我将解释我的问题。
我一直在为转换而苦苦挣扎。参数是一个 IntPtr,读取地址的输出是一个字节数组,我的第一个想法是:"将字节数组转换为 IntPtr,重新处理它,最后将最后一个读取地址转换为 int32(因为最后一个地址不是指针,它永远不会被读取,所以在这里转换为 Int32 应该没问题)",
然而,这并没有给出一个好的结果。所以目前我坚持使用将字节数组转换为 Int32,然后将 Int32 转换为 IntPtr 的解决方案。人们确实说位转换器是一种糟糕的方法,因为它可能会导致 64 位平台上的问题,我也相信有一种方法可以提供更好的性能(因为我转换对象 2 次)。
最后,如果有人认为可以在C++中制作类似的函数,然后在 C# 中 P/Invoke 它(我想这样会更有效率?)请告诉我。(我试图调整我的编程知识。并发现语言组合非常有趣)
[DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
[In, Out] byte[] buffer, Int32 sizeout, out IntPtr lpNumberOfBytesRead);
public Int32 ReadBytes(IntPtr Handle, IntPtr Address, int[] Offsets, int BytesToRead = 4)
{
IntPtr ptrBytesRead;
byte[] value = new byte[BytesToRead];
ReadProcessMemory(Handle, Address, value, BytesToRead, out ptrBytesRead);
//Read Offsets
for (int i = 0; i < Offsets.Length; i++)
{
ReadProcessMemory(Handle,
new IntPtr(BitConverter.ToInt32(value, 0) + Offsets[i]),
value,
BytesToRead,
out ptrBytesRead);
}
return BitConverter.ToInt32(value, 0);
}
任何简化此方法的想法将不胜感激!提前感谢!
如@usr所述,代码的性能将完全由对ReadProcessMemory
的调用主导。您不应期望从当前级别提高性能。
但是,您可以通过避免字节数组和BitConverter
来使代码更易于阅读。喜欢这个:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
out IntPtr lpBuffer,
IntPtr nSize,
out IntPtr lpNumberOfBytesRead
);
private static IntPtr ReadProcessPointer(IntPtr hProcess, IntPtr Address)
{
IntPtr result;
IntPtr NumberOfBytesRead;
if (ReadProcessMemory(hProcess, Address, out result, (IntPtr)IntPtr.Size, out NumberOfBytesRead) == 0)
throw new Win32Exception();
return result;
}
public static IntPtr FollowPointers(IntPtr hProcess, IntPtr Address, int[] Offsets)
{
IntPtr ptr = ReadProcessPointer(hProcess, Address);
for (int i = 0; i < Offsets.Length; i++)
ptr = ReadProcessPointer(hProcess, ptr + Offsets[i]);
return ptr;
}
相关文章:
- 我无法从内存中读取值
- 如何读取特定地址的进程内存?
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 如何在 WSL 2 中读取物理内存?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 从只读内存中读取结构
- 当注入程序的内存空间时,如何读取从 0 到 0xFFFFFFFFF 的每个字节?我正在创建模式扫描仪
- 如何运行外部程序,向其传递内存地址以读取/写入?
- C++指针将内存读取为 0
- 读取进程内存多级指针(DLL 注入)
- 组织从内存读取的数据的最佳方法(用于调试)c++
- 使用ClgetDeviceInfo从内存读取访问违规
- C++ - 分叉进程无法从共享内存读取
- C# 简化多指针的内存读取
- Linkedlist内存读取错误
- 从原始内存读取值(符合MISRA)
- c++ DLL内存读取崩溃
- 在wwpal rabbit中从内存读取数据
- c++中什么是预内存读取?
- 优化内存读取和写入的长期运行