C#:在另一个进程的内存中搜索一个 byte[] 数组

标签 c# memory process

如何在另一个进程的内存中搜索一个byte[]数组,然后得到byte[]数组所在位置的地址?

我想将字节数组写入另一个进程的内存 (WriteProcessMemory())。该调用的一个参数是 uint Address。我想通过在进程中搜索字节数组来获取地址。

例如我搜索 {0xEB ,0x20,0x68,0x21,0x27,0x65, ??, 0x21,0x64,0xA1}

我们假设这个数组只放置在我想要写入内存的进程的内存中的一个位置。

要获得该地址,我必须搜索该字节数组。

是否可以在 C# 中完成?

编辑: 这是针对 native 应用程序,而非 .NET。无需否决我的问题,有 C++ 的组件可以执行此操作,我只想在 C# 中执行此操作。

感谢理解!

最佳答案

是否可以在 C# 中完成? 在 C#(或任何其他语言)中一切皆有可能,您只需要找到方法;

此处硬编码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
          static extern bool ReadProcessMemory(
          IntPtr hProcess,
          IntPtr lpBaseAddress,
          [Out] byte[] lpBuffer,
          int dwSize,
          out int lpNumberOfBytesRead
        );

    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool CloseHandle(IntPtr hObject);
    static void Main(string[] args)
    {
        Process[] procs = Process.GetProcessesByName("explorer");
        if (procs.Length <= 0)  //proces not found
            return; //can replace with exit nag(message)+exit;
        IntPtr p = OpenProcess(0x10 | 0x20, true, procs[0].Id); //0x10-read 0x20-write

        uint PTR = 0x0; //begin of memory
        byte[] bit2search1 = {0xEB ,0x20,0x68,0x21,0x27,0x65}; //your bit array until ??
        int k = 1;  //numer of missing array (??)
        byte[] bit2search2 = {0x21,0x64,0xA1};//your bit array after ??
        byte[] buff = new byte[bit2search1.Length+1+bit2search2.Length];    //your array lenght;
        int bytesReaded;
        bool finded = false;

        while (PTR != 0xFF000000)   //end of memory // u can specify to read less if u know he does not fill it all
        {
            ReadProcessMemory(p, (IntPtr)PTR, buff, buff.Length, out bytesReaded);
            if (SpecialByteCompare(buff, bit2search1,bit2search2,k))
            {
                //do your stuff
                finded = true;
                break;
            }
            PTR += 0x1;
        }
        if (!finded)
            Console.WriteLine("sry no byte array found");
    }

    private static bool SpecialByteCompare(byte[] b1, byte[] b2, byte[] b3, int k)  //readed memory, first byte array, second byte array, number of missing byte's
    {
        if (b1.Length != (b2.Length + k + b3.Length))
            return false;
        for (int i = 0; i < b2.Length; i++)
        {
            if (b1[i] != b2[i])
                return false;
        }

        for (int i = 0; i < b3.Length; i++)
        {
            if (b1[b2.Length + k + i] != b3[i])
                return false;
        }
        return true;
    }
}

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

相关文章:

java - 用于生成 C# 代码的 XML 语法

c# - DataGridView 和数据源将不清晰

C# .NET - 带定时器的缓冲消息

C 结构指针迭代

c - 如何创建 100 万个进程

c - 在 Linux 上执行进程之前获取 pid

c# - 有没有办法用 C# 关闭资源管理器的特定实例?

c# - 如何使用 SqlDataAdapter 从数据集中存储的 sql 过程中获取数据?

java - 当我们使用空花括号分配数组时,内存中到底发生了什么?

memory - 将字符串转换为 &strs 时,切片和显式重新借用之间有区别吗?