Задать вопрос
  • Как поиметь запущенное приложение на C#?

    @BlindShot96
    Можно с помощью WinApi писать в память процесса. Для этого необходимо узнать Id процесса. По-моему, самый удобный способ это сделать, зная название процесса (имя исполняемого файла без расширения EXE или пути).
    public static uint GetProcessID(string name)
            {
              return (uint)Process.GetProcessesByName(name)[0].Id;
            }


    После того, как найден Id процесса его нужно открыть для чтения/записи. Для этого нужно использовать функцию WinApi OpenProcess. dwDesiredAccess- модификатор доступа к процессу( 0x001F0FFF - полный доступ к процессу) dwProcessId- id процесса
    [DllImport("kernel32.dll")]
            public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32    dwProcessId);
    
    IntPtr process_handle = OpenProcess(0x001F0FFF,1,process_id);


    Функция открытия процесса возвращает handle процесса (как я понял указатель на него). process_handle далее нужно использовать для функция чтения и записи данных в память процесса.

    Чтобы записать данные в память процесса можно использовать функцию WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte [] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);
    hProcess - handle процесса, lpBaseAddress - это адрес памяти, начиная с которого нужно записывать данные, lpBuffer - данные для записи, nSize - количество байтов для записи, lpNumberOfBytesWritten - точно не знаю, что означает, его можно оставить в значение UIntPtr.Zero

    После работы с процессом нужно закрыть подключение к нему. hObject - handle процесса.
    [DllImport("kernel32.dll")]
            public static extern Int32 CloseHandle(IntPtr hObject);
    Ответ написан