проблема с ZwOpenProcess
От: justin9  
Дата: 28.11.06 10:32
Оценка:
Здравствуйте.

У меня возникла проблема с данной функцией, вроде как и вызываю правильно и всёравно БСОД. Помогите пожалуйста.



HANDLE hProcessHandle;
ACCESS_MASK DesiredAccess = PROCESS_TERMINATE;
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;

ObjectAttributes.Length = 0x18;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.ObjectName = 0;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
ClientId.UniqueProcess = 2345;/*тут я ставлю PID существующего процесса*/ 
ClientId.UniqueThread = 0;

ZwOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &ClientId);


пробовал любые варианты, всёравно БСОД(((
отладчиком пользоваться не могу т.к. на двухядернике айс чтото не очень хочет работать...

Заранее Спасибо.



29.11.06 13:22: Перенесено модератором из 'C/C++' — Кодт
Re: проблема с ZwOpenProcess
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 29.11.06 19:23
Оценка:
Некорректная инициализация ObjectAttributes: см пример

/*
ибо:

#define InitializeObjectAttributes( p, n, a, r, s ) { \
    (p)->Length = sizeof( OBJECT_ATTRIBUTES );          \
    (p)->RootDirectory = r;                             \
    (p)->Attributes = a;                                \
    (p)->ObjectName = n;                                \
    (p)->SecurityDescriptor = s;                        \
    (p)->SecurityQualityOfService = NULL;               \
*/

BOOLEAN KillProcess(ULONG PID)
{
    OBJECT_ATTRIBUTES   objectAttributes;
    CLIENT_ID     clientID;
    HANDLE hProcess=NULL;
    NTSTATUS status;

    InitializeObjectAttributes( &objectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL );

   clientID.UniqueProcess = (HANDLE)PID; 
   clientID.UniqueThread = NULL;

   status = ZwOpenProcess( &hProcess, 
                         PROCESS_TERMINATE, 
                         &objectAttributes, &clientID );
   if (!NT_SUCCESS(status))
   {
            return FALSE;
   }

  status = ZwTerminateProcess(hProcess, 0); 
  ZwClose(hProcess); 
  return TRUE;
}


J>Здравствуйте.


J>У меня возникла проблема с данной функцией, вроде как и вызываю правильно и всёравно БСОД. Помогите пожалуйста.


J>

J>HANDLE hProcessHandle;
J>ACCESS_MASK DesiredAccess = PROCESS_TERMINATE;
J>OBJECT_ATTRIBUTES ObjectAttributes;
J>CLIENT_ID ClientId;

J>ObjectAttributes.Length = 0x18;
J>ObjectAttributes.RootDirectory = 0;
J>ObjectAttributes.ObjectName = 0;
J>ObjectAttributes.Attributes = 0;
J>ObjectAttributes.SecurityDescriptor = 0;
J>ObjectAttributes.SecurityQualityOfService = 0;
J>ClientId.UniqueProcess = 2345;/*тут я ставлю PID существующего процесса*/ 
J>ClientId.UniqueThread = 0;

J>ZwOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &ClientId);

J>


J>пробовал любые варианты, всёравно БСОД(((

J>отладчиком пользоваться не могу т.к. на двухядернике айс чтото не очень хочет работать...

J>Заранее Спасибо.
Viva el Junta Militar! Viva el Presidente!
Re[2]: проблема с ZwOpenProcess
От: justin9  
Дата: 30.11.06 08:35
Оценка:
Здравствуйте, Ligen,
Спасибо за ответ, но он мне не помог

из ринг3 мой код работает на ура, а из ринг0 — бсод...

уже что только не перепробовал!

может проблема в инициализации драйвера? но вроде всё сделал по примерам и правильно...
Re[3]: проблема с ZwOpenProcess
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 30.11.06 11:05
Оценка:
Какой код bugcheck'a?
Подозрения на то, что вы запускаете его не на PASSIVE_LEVEL, например, где-то до этого захватываете Spinlock.
Возьмите пример, например сампл Солдатова и добавьте свой код на обработку IRP_MJ_DEVICE_CONTROL.
И возьмите лучше WinDbg для отладки, много удобнее.

J>Здравствуйте, Ligen,

J>Спасибо за ответ, но он мне не помог

J>из ринг3 мой код работает на ура, а из ринг0 — бсод...


J>уже что только не перепробовал!


J>может проблема в инициализации драйвера? но вроде всё сделал по примерам и правильно...
Viva el Junta Militar! Viva el Presidente!
Re[4]: проблема с ZwOpenProcess
От: justin9  
Дата: 01.12.06 15:32
Оценка:
код у меня обычный, без каких либо обработок.
так скаать простейший драйвер



NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)

{
    NTSTATUS Status = STATUS_SUCCESS;
    PDEVICE_OBJECT         deviceObject = NULL;
    UNICODE_STRING         deviceNameUnicodeString;
    UNICODE_STRING         deviceLinkUnicodeString;
    
    DbgPrint("123.SYS: Loading Driver . . .\n");

    RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);
    Status = IoCreateDevice(DriverObject,     0,
                                &deviceNameUnicodeString, 
                                FILE_DEVICE_UNKNOWN,
                                0,
                                FALSE,
                                &deviceObject);
    if (NT_SUCCESS(Status))
    {  
        RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);
        Status = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);
        if (!NT_SUCCESS(Status)) DbgPrint("123.SYS: Error1\n");
        DriverObject->DriverUnload = Unload;
    }
    if (!NT_SUCCESS(Status)) DbgPrint("123.SYS: Error2\n");
    if (NT_SUCCESS(KillProcess(4004))) // тут бсод
        DbgPrint(("OKKKKKK\n")); else DbgPrint(("((((\n"));
    return Status;
}
Re[5]: проблема с ZwOpenProcess
От: justin9  
Дата: 01.12.06 17:51
Оценка:
вроде DriverEntry выполняется на PASSIVE_LEVEL а всёравно глюки
Re[6]: проблема с ZwOpenProcess
От: Аноним  
Дата: 01.12.06 20:52
Оценка:
создал нить с процедурой KillProcess

теперь бсод не вылетает, вообще ничего не вылетает, ни ошибки и ничего вообще(

[code]
VOID KillProcess(PVOID pContext)
{
try
{
NTSTATUS ntTerminateStatus;
HANDLE hProcessHandle = NULL;
ACCESS_MASK DesiredAccess = PROCESS_ALL_ACCESS;
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;
InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
ClientId.UniqueProcess = 2928;
ClientId.UniqueThread = 0;

if (!(fNtOpenProcess = FindFunc(FindNT(), "ZwOpenProcess"))) goto _exit;
if (!(fNtTerminateProcess = FindFunc(FindNT(),"ZwTerminateProcess"))) goto _exit;

DbgPrint("fNtOpenProcess: %X\n", fNtOpenProcess);
DbgPrint("fNtTerminateProcess: %X\n", fNtTerminateProcess);


//тут всё работаит

ntTerminateStatus = fNtOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &ClientId);
//вылетает х.з. куда на этом месте, причём обработчик молчит

DbgPrint("ntTerminateStatus == %d\n", ntTerminateStatus);

if (ntTerminateStatus == STATUS_SUCCESS)
{
DbgPrint("OPENNNNNNNNNNPROCESSSSS OK\n");
ZwClose(hProcessHandle);
} else DbgPrint("Error OpenProcess\n");
} except (EXCEPTION_EXECUTE_HANDLER){DbgPrint("EXCEPTION_EXECUTE_HANDLER KillProcess\n");}
_exit:
PsTerminateSystemThread(STATUS_SUCCESS);
return;
}
[code]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.