Исключение Win32: доступ запрещен при попытке использовать OpenProcess

эта ошибка появляется, когда я пытаюсь сделать две вещи.

при попытке этого (блок кода 1):

_class = new Proc(Process.GetProcessesByName("procname")[0]);

то в классе Proc происходит следующее:

public Proc(Process _SelectedProcess)
{
    Process = _SelectedProcess;
}
public Process Process
{
    get
    {
        return SelectedProcess;
    }
    set
    {
        SelectedProcess = value;
        if (SelectedProcess != null)
        {
            Process.EnterDebugMode();
            _Reader = new Win32_Memory(value.Handle, value.MainModule.BaseAddress.ToInt32(), value.Id);
         }
    }
}

Это один из способов, которыми я получаю исключение, иногда это проходит без каких-либо исключений без видимой причины, насколько я понимаю.

Примечание: он никогда не проходит в Windows 7, я использую Windows 10 и иногда бывает, что функция работает

но если это произойдет, в следующий раз, когда мне понадобится использовать OpenProcess () вне класса Process, я почти всегда получаю исключение, и если я это сделаю, то впоследствии он не сможет выполнить блок кода 1, если я попытаюсь сделать это снова.

this (блок кода 2) также получает ту же ошибку отказа в доступе, а иногда и не ...

if (_Reader.ReadInt(_addr) == 1) _Reader.Write(_addr, 0);
public bool Write(int address, long value)
{
    hProc = OpenProcess(ProcessAccessFlags.VMWrite, false, ID);
    byte[] val = BitConverter.GetBytes(value);
    bool worked = WriteProcessMemory(hProc, new IntPtr(address), val, (uint)val.LongLength, 0);
    CloseHandle(hProc);
    return worked;
}

флаги доступа:

[Flags]
public enum ProcessAccessFlags : uint
{
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VMOperation = 0x00000008,
    VMRead = 0x00000010,
    VMWrite = 0x00000020,
    DupHandle = 0x00000040,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    Synchronize = 0x00100000
}

импорт:

[DllImport("kernel32.dll")]
private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, int unused);

Также стоит отметить, что иногда весь этот код выполняется без ЛЮБОЙ ошибки и будет работать до тех пор, пока я не открою это приложение повторно или не перезапущу целевое приложение.

пожалуйста, помогите мне в этом, если я не совсем понял некоторые вещи - это мой первый вопрос, и мне действительно никогда не приходилось задавать его перед этим ... так что я объясню все необходимое позже


person Srdjan N.    schedule 07.11.2015    source источник
comment
Может быть, какой-нибудь контекст поможет? Какую высокоуровневую задачу вы пытаетесь решить здесь. На первый взгляд все вышеперечисленное выглядит слишком сложным. Обычно нет необходимости напрямую импортировать ядро ​​и работать с памятью только для управления дочерним процессом. Весь смысл безопасного языка, такого как C #, состоит в том, чтобы избежать этого.   -  person modal_dialog    schedule 08.11.2015
comment
@modal_dialog Я пытаюсь изменить часть памяти, принадлежащую другому процессу, который не имеет ничего общего с моим процессом. Насколько я знаю, это единственный способ сделать это.   -  person Srdjan N.    schedule 08.11.2015


Ответы (1)


Если, как указывает ваш последний комментарий, процессы действительно не имеют ничего общего друг с другом, то это точно объясняет AccessDeniedException. Вам не разрешается просто изменять память любого случайного процесса. Это будет дыра в безопасности.

Оба процесса должны быть настроены и согласны на совместное использование памяти друг с другом. Есть много способов наладить межпроцессное взаимодействие между взаимодействующими процессами: вот начало: Общая память между 2 процессами (приложениями)

person modal_dialog    schedule 07.11.2015
comment
Хорошо, это имеет смысл, но это не объясняет, почему иногда это работает, а иногда нет? Кроме того, до недавнего патча, который был внесен в приложение, оно всегда работало без каких-либо исключений. - person Srdjan N.; 08.11.2015
comment
Защита памяти - это то, что изменилось в различных версиях Windows, поскольку они усилили безопасность. en.wikipedia.org/wiki/Memory_protection Это также может зависеть от того, как прошел целевой процесс. setup, так что патч определенно может повлиять на него. В любом случае нельзя использовать нескоординированный доступ, даже если по счастливой случайности он работает. - person modal_dialog; 08.11.2015
comment
Похоже, что в Windows 10 есть проблемы с безопасностью. Насколько я тестировал, этого не происходит в Windows 7. Я все еще хотел бы попытаться найти обходной путь для этого или воссоздать, что происходит, когда это работает. - person Srdjan N.; 08.11.2015
comment
@Srdjan, я бы сказал наоборот: Windows 7 имеет некоторые проблемы с безопасностью, которые они подключили к Windows 10. Если мой SecuritySensitive.exe запущен и ничего не знает о YourCoolDownload.exe, почему, черт возьми, должен он позволяет вашему вызывающему коду решать, может ли он писать в мою память. Примечание: есть способ запустить цель на Win10, который заставит ее работать как Win7. MS - это обратная совместимость. Но это не рекомендуется. - person modal_dialog; 08.11.2015
comment
Ну, я не уверен, что вы меня поняли, но ... В Windows 10 это иногда работает, иногда нет. На windows 7 сейчас никогда не работает, до патча работало. Зачем мне запускать его, как если бы он был запущен из Windows 7, если он никогда не будет работать в Windows 7? - person Srdjan N.; 08.11.2015
comment
Кроме того ... Я могу читать память любого другого процесса, например: Google Chrome, Skype и других программ, которые, как я ожидал бы, имеют аналогичную защиту, или я ошибаюсь? - person Srdjan N.; 08.11.2015
comment
Вы правы, что я вас неправильно понял. Я предполагал, что Win10 там, где он никогда не работает, а Win7 всегда работал. Но в любом случае вы в царстве воду. Я предполагаю, что это write, который генерирует ex, поэтому вы можете читать множество других процессов. Примечание: более умный парень, чем я, мог бы объяснить, как настроить отладчик для целевого процесса, чтобы увидеть, как он устанавливает права доступа к памяти. Это ответит на него довольно ясно. - person modal_dialog; 08.11.2015
comment
Исключение создается из OpenProcess. Как из класса ProcessManager.Process из пространства имен System.Diagonostics, так и из моего класса, который является классом, который я импортирую функцию OpenProcess из ядра. - person Srdjan N.; 08.11.2015