gpt4 book ai didi

C# 在进程内存中搜索字节数组

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:18 30 4
gpt4 key购买 nike

我正在为特定应用程序开发一个小型内存扫描器。当我选择要扫描的进程时,我要做的第一件事是验证该进程是否是特定应用程序的实例……为此,我必须找到一个可以位于其内存中任何位置的签名。

这是我的代码:

[DllImport("Kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean ReadProcessMemory([In] IntPtr processHandle, [In] IntPtr processAddress, [Out] Byte[] buffer, [In] UInt32 bytesToRead, [Out] out IntPtr bytesRead);

[DllImport("Kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
internal static extern UInt32 VirtualQueryEx([In] IntPtr processHandle, [In, Optional] IntPtr processAddress, [Out] out MEMORY_BASIC_INFORMATION buffer, [In] UInt32 bufferSize);



internal struct MEMORY_BASIC_INFORMATION
{
public static UInt32 Size = (UInt32)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION));

public IntPtr BaseAddress;
public IntPtr AllocationBase;
public AllocationProtect AllocationProtect;
public IntPtr RegionSize;
public StateEnum State;
public AllocationProtect Protect;
public TypeEnum lType;
}



public void Open()
{
Byte[] toFind = new Byte[] { 31, 55, 78, 33, 00, 00, 00, 37 };
UInt32 address = 0;

do
{
MEMORY_BASIC_INFORMATION info = new MEMORY_BASIC_INFORMATION();

if (NativeMethods.VirtualQueryEx(m_Process.Handle, (IntPtr)address, out info, NativeMethods.MemoryBasicInformation.Size) == 0)
break;

Byte[] buffer = new Byte[(UInt32)info.RegionSize];
IntPtr bytesRead;

if (NativeMethods.ReadProcessMemory(m_Process.Handle, info.BaseAddress, buffer, (UInt32)buffer.Length, out bytesRead))
{
if (buffer.Contains(toFind)) // Extension Method
{
m_IsValid = true;
break;
}
}

if (address == (UInt32)info.BaseAddress + (UInt32)info.RegionSize)
break;

address = (UInt32)info.BaseAddress + (UInt32)info.RegionSize;
}
while (address <= 0x7fffffff);
}

第一个问题,这个方法永远不会完成,看起来它在无限循环(昨天我为了调试目的让它运行​​了一个多小时而没有到达终点)。在我的循环中检查 Marshal.GetLastWin32Error() 我注意到有时我在调用 ReadProcessMemory 后得到一个 ERROR_PARTIAL_COPY (0x0000012B) ...这可能是原因吗?

那我还有一些疑问:

1) 我应该在继续扫描循环之前调用 OpenProcess 吗?我不这么认为,对吧?

2) 我想让我的应用程序同时兼容 x32 和 x64。我应该在我的代码中更改什么以确保它能在两个系统上正常工作(address 限制,address 的值类型,RegionSize 转换, ...)?

3) 在扫描进程内存以找到我的目标字节数组时,我是否应该检查当前 MEMORY_BASIC_INFORMATION 的属性(AllocationProtectStateProtect 和/或 lType),看看我是否可以跳过当前区域的 ReadProcessMemory,因为它没有必要或不能不被阅读?

4)还有什么我可以做的来优化这个方法的速度,这很重要吗?

最佳答案

噢噢噢噢我解决了。问题是我在不使用 VirtualQueryEx 并检查内存区域保护的情况下尝试读取它的方式!

关于C# 在进程内存中搜索字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16191304/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com