NtDuplicateObject - Перехват - Получение PEPROCESS

Тема в разделе "WASM.NT.KERNEL", создана пользователем MuForum, 2 апр 2011.

  1. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Доброго времени суток.
    Пишу драйвер для 32-разрядной Windows XP, Vista, 7.

    # Задача: Необходимо получить PID процесса, дескриптор которого пытаются скопировать.
    - То есть.
    1. Мы защищаем процесс Notepad.exe
    2. Есть программа Cheat.exe, которая вызывает DuplicateObject и копирует дескриптор Notepad.exe с csrss.exe
    3. Мне необходимо в перехваченой функции NuDuplicateObject получить PID процесса, дескриптор которого Cheat.exe хочет скопировать с csrss.exe

    # Прототип NtDuplicateObject: Перейти;
    # Прототип DuplicateObject: DuplicateHandle Function;

    Код (Text):
    1. NTSTATUS NtDuplicateObject_New(
    2.     IN HANDLE           SourceProcessHandle,
    3.     IN PHANDLE          SourceHandle,
    4.     IN с           TargetProcessHandle,
    5.     OUT PHANDLE         TargetHandle,
    6.     IN ACCESS_MASK      DesiredAccess OPTIONAL,
    7.     IN BOOLEAN          InheritHandle,
    8.     IN ULONG            Options)
    9. {
    10.     KPROCESSOR_MODE mAccess     = KeGetPreviousMode();
    11.     // ----
    12.     PEPROCESS curProcess        = PsGetCurrentProcess();
    13.     HANDLE curProcesId          = PsGetCurrentProcessId(); // csrss.exe PID;
    14.     // ----
    15.     PEPROCESS           pProTar;
    16.     NTSTATUS            nRes;
    17.     ULONG               uProTarId;
    18.     // ----
    19.     nRes    = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL);
    20.     // ----
    21.     if ( nRes != STATUS_SUCCESS )
    22.     {
    23.         DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes);
    24.         // ----
    25.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    26.                 TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    27.     }
    28.     // ----
    29.     uProTarId   = (ULONG)PsGetProcessId(pProTar);
    30.     // ----
    31.     DPRINT("[NtDublicateObject_New] ### CheatPID: %ld;\n\0", uProTarId);
    32.     // ----
    33.     // Далее нужно получить PEPROCESS процесса, HANDLE которого Cheat.exe хочет скопировать у csrss.exe
    34.     // То есть, нужно получить PEPROCESS от Notepad.exe, чтобы далее можно было получить PID Notepad.exe;
    35.     // ----
    36.     return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    37.         TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    38. }
    # Добавлено:
    Читал про функцию ObGetObjectType() для получения типа дублируемого дескриптора, но эта функция появилась лишь в Windows7.


    P.S. -> Надеюсь на советы, подсказки, ссылки и т.д.
    - Заранее благодарю.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Хендл, который пытаются скопировать, находится в параметре SourceHandle.
    Как получить тип объекта по хендлу, достаточно подробно описано у меня в блоге.
     
  3. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    #2, x64 - Благодарю за ссылку, прочитал, с горем пополам сделал для XP.
    - Всё работает, НО, так и не получается получить PID защищаемого процесса Notepad.exe, дескриптор которого хотят скопировать.
    Код (Text):
    1. NTSTATUS NtDuplicateObject_New(
    2.     IN HANDLE           SourceProcessHandle,
    3.     IN PHANDLE          SourceHandle,
    4.     IN HANDLE           TargetProcessHandle,
    5.     OUT PHANDLE         TargetHandle,
    6.     IN ACCESS_MASK      DesiredAccess OPTIONAL,
    7.     IN BOOLEAN          InheritHandle,
    8.     IN ULONG            Options)
    9. {
    10.     KPROCESSOR_MODE     mAccess;
    11.     // ----
    12.     PEPROCESS           curProcess;
    13.     ULONG               curProcesId;
    14.     // ----
    15.     NTSTATUS            nRes;
    16.     PEPROCESS           pProTar;
    17.     ULONG               uSourcePID;
    18.     ULONG               uDestPID;
    19.     // ----
    20.     PVOID               pUnk;
    21.     POBJECT_TYPE        ObjectType;
    22.     // ----
    23.     mAccess             = KeGetPreviousMode();
    24.     // ----
    25.     curProcess          = PsGetCurrentProcess();
    26.     curProcesId         = (ULONG)PsGetCurrentProcessId();
    27.     // ----
    28.     if ( (ULONG)SourceProcessHandle < 1 )
    29.     {
    30.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    31.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    32.     }
    33.     // ----
    34.     nRes    = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL);
    35.     // ----
    36.     if ( nRes != STATUS_SUCCESS )
    37.     {
    38.         DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes);
    39.         // ----
    40.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    41.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    42.     }
    43.     // ----
    44.     uSourcePID  = (ULONG)PsGetProcessId(pProTar);
    45.     // ----
    46.     if ( (uSourcePID != 932) && (uSourcePID != 356) )
    47.     {
    48.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    49.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    50.     }
    51.     // ----
    52.     DPRINT("[NtDublicateObject_New] uSourcePID: %ld;\n\0", uSourcePID);
    53.     // ----
    54.     DPRINT("[NtDublicateObject_New] curProcess: %ld; curProcesId: %ld;\n\0",
    55.         curProcess, curProcesId);
    56.     // ----
    57.     nRes    = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL);
    58.     // ----
    59.     if ( nRes != STATUS_SUCCESS )
    60.     {
    61.         DPRINT("[NtDublicateObject_New] ### 2 ### ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes);
    62.         // ----
    63.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    64.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    65.     }
    66.     // ----
    67.     ObjectType  = ((POBJECT_HEADER)((ULONG_PTR)pUnk - sizeof(OBJECT_HEADER)))->Type;
    68.     // ----
    69.     if ( ObjectType == *ExEventObjectType )
    70.     {
    71.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExEventObjectType;\n\0");
    72.     }
    73.     else if ( ObjectType == *ExSemaphoreObjectType )
    74.     {
    75.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExSemaphoreObjectType;\n\0");
    76.     }
    77.     else if ( ObjectType == *IoFileObjectType )
    78.     {
    79.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *IoFileObjectType;\n\0");
    80.     }
    81.     else if ( ObjectType == *PsProcessType )
    82.     {
    83.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsProcessType;\n\0");
    84.     }
    85.     else if ( ObjectType == *PsThreadType )
    86.     {
    87.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0");
    88.         // ----
    89.         pProTar     = IoThreadToProcess((PETHREAD)pUnk);
    90.         // ----
    91.         uDestPID    = (ULONG)PsGetProcessId(pProTar);
    92.         // ----
    93.         DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID);                     
    94.     }
    95.     else if ( ObjectType == *SeTokenObjectType )
    96.     {
    97.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *SeTokenObjectType;\n\0");
    98.     }
    99.     else
    100.     {
    101.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == Unknow; Code: %ld;\n\0", ObjectType);
    102.     }
    103.     // ----
    104.     return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    105.         TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    106. }
    # Результаты следующие:
    P.S. -> Как я понял, Cheat.exe(ArtMoney Pro) дублирует HANDLE потока с любого другого процесса.
    - Но вот что дальше, как всё же выйти на PID моего защищаемого процесса Notepad.exe (1243)?

    P.S. -> Видимо я ещё очень мало понимаю принципы работы ядра и связующих =(
     
  4. Ladr

    Ladr New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    17
    Если SourceHandle это хендл потока то:
    ObReferenceObjectByHandle
    IoThreadToProcess
    PsGetProcessId
     
  5. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Я конечно извиняюсь, но вы явно не смотрели код...
    Код (Text):
    1. ...
    2.     else if ( ObjectType == *PsThreadType )
    3.     {
    4.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0");
    5.         // ----
    6.         pProTar        = IoThreadToProcess((PETHREAD)pUnk);
    7.         // ----
    8.         uDestPID    = (ULONG)PsGetProcessId(pProTar);
    9.         // ----
    10.         DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID);                        
    11.     }
    12. ...
    Мне выдаёт PID процесса, но ни как не защищаемого(Notepad.exe)...
     
  6. Ladr

    Ladr New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2009
    Сообщения:
    17
    Не весь код смотрел. Видимо ошибка здесь:
    nRes = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL);
    SourceHandle - хэндл из адресного пространства процесса SourceProcessHandle
    Можно попробовать зааттачиться (KeStackAttachProcess()) а затем вызвать ObReferenceObjectByHandle
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, похоже, именно в этом проблема.
     
  8. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Попробовал я как вы написали. Результат отрицательный =(

    # Вариант №1:
    Код (Text):
    1. [NtDublicateObject_New] uSourcePID: 1988; // Cheat.exe;
    2. [NtDublicateObject_New] curProcess: -1974478632; curProcesId: 588; // csrss.exe;
    3. [NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;
    4. [NtDublicateObject_New] DestPID: 1988; // Cheat.exe;
    5.  
    6. NTSTATUS NtDuplicateObject_New(
    7.     IN HANDLE           SourceProcessHandle,
    8.     IN PHANDLE          SourceHandle,
    9.     IN HANDLE           TargetProcessHandle,
    10.     OUT PHANDLE         TargetHandle,
    11.     IN ACCESS_MASK      DesiredAccess OPTIONAL,
    12.     IN BOOLEAN          InheritHandle,
    13.     IN ULONG            Options)
    14. {
    15.     KPROCESSOR_MODE     mAccess;
    16.     // ----
    17.     PEPROCESS           curProcess;
    18.     ULONG               curProcesId;
    19.     // ----
    20.     NTSTATUS            nRes;
    21.     PEPROCESS           pProTar;
    22.     ULONG               uSourcePID;
    23.     ULONG               uDestPID;
    24.     // ----
    25.     PVOID               pUnk;
    26.     POBJECT_TYPE        ObjectType;
    27.     // ----
    28.     KAPC_STATE apcState;
    29.     // ----
    30.     mAccess             = KeGetPreviousMode();
    31.     // ----
    32.     curProcess          = PsGetCurrentProcess();
    33.     curProcesId         = (ULONG)PsGetCurrentProcessId();
    34.     // ----
    35.     if ( (ULONG)SourceProcessHandle < 1 )
    36.     {
    37.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    38.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    39.     }
    40.     // ----
    41.     nRes    = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL);
    42.     // ----
    43.     if ( nRes != STATUS_SUCCESS )
    44.     {
    45.         DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes);
    46.         // ----
    47.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    48.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    49.     }
    50.     // ----
    51.     uSourcePID  = (ULONG)PsGetProcessId(pProTar); // Cheat.exe;
    52.     // ----
    53.     if ( uSourcePID != 1988 )
    54.     {
    55.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    56.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    57.     }
    58.     // ----
    59.     KeStackAttachProcess(pProTar, & apcState);
    60.     // ----
    61.     DPRINT("[NtDublicateObject_New] uSourcePID: %ld;\n\0", uSourcePID);
    62.     // ----
    63.     DPRINT("[NtDublicateObject_New] curProcess: %ld; curProcesId: %ld;\n\0",
    64.         curProcess, curProcesId);
    65.     // ----
    66.     nRes    = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL);
    67.     // ----
    68.     if ( nRes != STATUS_SUCCESS )
    69.     {
    70.         DPRINT("[NtDublicateObject_New] ### 2 ### ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes);
    71.         // ----
    72.         KeUnstackDetachProcess( & apcState);
    73.         // -----
    74.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    75.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    76.     }
    77.     // ----
    78.     ObjectType  = ((POBJECT_HEADER)((ULONG_PTR)pUnk - sizeof(OBJECT_HEADER)))->Type;
    79.     // ----
    80.     if ( ObjectType == *ExEventObjectType )
    81.     {
    82.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExEventObjectType;\n\0");
    83.     }
    84.     else if ( ObjectType == *ExSemaphoreObjectType )
    85.     {
    86.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExSemaphoreObjectType;\n\0");
    87.     }
    88.     else if ( ObjectType == *IoFileObjectType )
    89.     {
    90.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *IoFileObjectType;\n\0");
    91.     }
    92.     else if ( ObjectType == *PsProcessType )
    93.     {
    94.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsProcessType;\n\0");
    95.     }
    96.     else if ( ObjectType == *PsThreadType )
    97.     {
    98.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0");
    99.         // ----
    100.         pProTar     = IoThreadToProcess((PETHREAD)pUnk);
    101.         // ----
    102.         uDestPID    = (ULONG)PsGetProcessId(pProTar);
    103.         // ----
    104.         DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID);                     
    105.     }
    106.     else if ( ObjectType == *SeTokenObjectType )
    107.     {
    108.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *SeTokenObjectType;\n\0");
    109.     }
    110.     else
    111.     {
    112.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == Unknow; Code: %ld;\n\0", ObjectType);
    113.     }
    114.     // ----
    115.     KeUnstackDetachProcess( & apcState);
    116.     // -----
    117.     return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    118.         TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    119. }
    # Вариант №2:
    Код (Text):
    1. [NtDublicateObject_New] uSourcePID: 1988; // Cheat.exe
    2. [NtDublicateObject_New] curProcess: -1974478632; curProcesId: 588; // csrss.exe
    3. [NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;
    4. [NtDublicateObject_New] DestPID: 668; // lsass.exe
    5.  
    6. NTSTATUS NtDuplicateObject_New(
    7.     IN HANDLE           SourceProcessHandle,
    8.     IN PHANDLE          SourceHandle,
    9.     IN HANDLE           TargetProcessHandle,
    10.     OUT PHANDLE         TargetHandle,
    11.     IN ACCESS_MASK      DesiredAccess OPTIONAL,
    12.     IN BOOLEAN          InheritHandle,
    13.     IN ULONG            Options)
    14. {
    15.     KPROCESSOR_MODE     mAccess;
    16.     // ----
    17.     PEPROCESS           curProcess;
    18.     ULONG               curProcesId;
    19.     // ----
    20.     NTSTATUS            nRes;
    21.     PEPROCESS           pProTar;
    22.     ULONG               uSourcePID;
    23.     ULONG               uDestPID;
    24.     // ----
    25.     PVOID               pUnk;
    26.     POBJECT_TYPE        ObjectType;
    27.     // ----
    28.     KAPC_STATE apcState;
    29.     // ----
    30.     mAccess             = KeGetPreviousMode();
    31.     // ----
    32.     curProcess          = PsGetCurrentProcess();
    33.     curProcesId         = (ULONG)PsGetCurrentProcessId();
    34.     // ----
    35.     if ( (ULONG)SourceProcessHandle < 1 )
    36.     {
    37.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    38.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    39.     }
    40.     // ----
    41.     nRes    = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL);
    42.     // ----
    43.     if ( nRes != STATUS_SUCCESS )
    44.     {
    45.         DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes);
    46.         // ----
    47.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    48.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    49.     }
    50.     // ----
    51.     uSourcePID  = (ULONG)PsGetProcessId(pProTar); // Cheat.exe;
    52.     // ----
    53.     if ( uSourcePID != 1988 )
    54.     {
    55.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    56.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    57.     }
    58.     // ----
    59.     DPRINT("[NtDublicateObject_New] uSourcePID: %ld;\n\0", uSourcePID);
    60.     // ----
    61.     DPRINT("[NtDublicateObject_New] curProcess: %ld; curProcesId: %ld;\n\0",
    62.         curProcess, curProcesId);
    63.     // ----
    64.     nRes    = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL);
    65.     // ----
    66.     if ( nRes != STATUS_SUCCESS )
    67.     {
    68.         DPRINT("[NtDublicateObject_New] ### 2 ### ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes);
    69.         // ----
    70.         return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    71.             TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    72.     }
    73.     // ----
    74.     ObjectType  = ((POBJECT_HEADER)((ULONG_PTR)pUnk - sizeof(OBJECT_HEADER)))->Type;
    75.     // ----
    76.     if ( ObjectType == *ExEventObjectType )
    77.     {
    78.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExEventObjectType;\n\0");
    79.     }
    80.     else if ( ObjectType == *ExSemaphoreObjectType )
    81.     {
    82.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExSemaphoreObjectType;\n\0");
    83.     }
    84.     else if ( ObjectType == *IoFileObjectType )
    85.     {
    86.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *IoFileObjectType;\n\0");
    87.     }
    88.     else if ( ObjectType == *PsProcessType )
    89.     {
    90.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsProcessType;\n\0");
    91.     }
    92.     else if ( ObjectType == *PsThreadType )
    93.     {
    94.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0");
    95.         // ----
    96.         pProTar     = IoThreadToProcess((PETHREAD)pUnk);
    97.         // ----
    98.         KeStackAttachProcess(pProTar, & apcState);
    99.         // ----
    100.         uDestPID    = (ULONG)PsGetProcessId(pProTar);
    101.         // ----
    102.         KeUnstackDetachProcess( & apcState);
    103.         // -----
    104.         DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID);                     
    105.     }
    106.     else if ( ObjectType == *SeTokenObjectType )
    107.     {
    108.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *SeTokenObjectType;\n\0");
    109.     }
    110.     else
    111.     {
    112.         DPRINT("[NtDublicateObject_New] ObjectHeader->Type == Unknow; Code: %ld;\n\0", ObjectType);
    113.     }
    114.     // ----
    115.     return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle,
    116.         TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options);
    117. }
    P.S. -> Прошу помочь решить данную проблему.
    - Либо тут либо в приват(если есть какие-то предложения/условия).
    - Заранее благодарю.