Ладно спасибо , будем пробовать =) кстати IRQL_NOT_LESS_OR_EQUAL что за ошибка ? Код (Text): PPEB remPeb = NULL; remPeb = pProcessInformation.PebBaseAddress; __try { KeAttachProcess(remPeb); RtlUnicodeStringToAnsiString(&asProcessName,&remPeb->ProcessParameters->ImagePathName,TRUE); asProcessName.Buffer[asProcessName.Length] = 0x00; DbgPrint("%s",asProcessName.Buffer); RtlFreeAnsiString(&asProcessName); KeDetachProcess(); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("KeAttachProcess 0x%X",&remPeb); }
http://www.windowsitlibrary.com/Content/356/04/7.html а почему там KeAttachProcess(Peb); ? И потом в DDK написано что VOID KeStackAttachProcess ( IN PKPROCESS Process, OUT PRKAPC_STATE ApcState ); Parameters Process Pointer to the target process object. This parameter can be a PEPROCESS pointer returned by IoGetCurrentProcess or PsGetCurrentProcess. ApcState Pointer to a variable that receives an opaque pointer to a KAPC_STATE structure. The caller must allocate storage for this structure either from nonpaged pool or from the caller's own thread stack. А я получаю так : Код (Text): PEPROCESS GetProcessByHandle(HANDLE hndl) { PVOID NZTP_OBJ; ObReferenceObjectByHandle(hndl,0,0,KernelMode,&NZTP_OBJ,NULL); return NZTP_OBJ; } ... struct _EPROCESS *remPeprocess; remPeprocess = (PEPROCESS)GetProcessByHandle(ProcessHandle); remPeb = pProcessInformation.PebBaseAddress; __try { KeAttachProcess(remPeprocess); DbgPrint("%ws",remPeb->ProcessParameters->ImagePathName); KeDetachProcess(); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("KeAttachProcess 0x%X",&remPeb); } А если укажу *PEB то выходит синий экран, блин =(
Есть совет - выкинуть левые примеры и посмотреть на реализацию функций ядра. Вот описание функций, которые тебе нужны. Код (Text): VOID __stdcall KeAttachProcess ( IN PEPROCESS Process ); VOID __stdcall KeDetachProcess ( VOID ); А уж как получить EPROCESS это сам подумай. Никаких peb'ов в эти функции передаваться не должно и в помине. Вообще, прежде чем лезть в ядро, неплохо бы ознакомиться с его устройством хотя бы поверхностно.
http://forum.shelek.com/index.php?action=printpage;topic=3464.0 http://www.wasm.ru/forum/viewtopic.php?pid=139225 почитай ка это
ты обращаешься к подкачиваемой и выгруженной в данный момент памяти (то есть вызываешь ошибку страницы) при высоком IRQL (высоким считается IRQL >= DISPATCH_LEVEL). Надеюсь, что такое IRQL ты знаешь..
Не совсем. Interrupt Request Level - уровень запроса на прерывание. Но по смыслу ты прав, он определяет, что может делать текущий поток, а что нет. Например, при IRQL >= DISPATCH_LEVEL планировщик не переключает потоки и диспетчер памяти не подгружает выгруженные подкачиваемые страницы. То есть если заставить планировщик переключить потоки или вызвать ошибку страницы, будет немедленно IRQL_NOT_LESS_OR_EQUAL Для IRQ IRQL является маской для прерываний. IRQL от 3 до 30 определяет приоритет аппаратных прерываний. При выполнении ISR (Interrupt Service Routine) ядро ставит IRQL, соответствующий этому IRQ. Таким образом маскируются все IRQ уровня текущего, или ниже. То есть если поставлен IRQL = 4 (соотв. IRQ номер 2), то маскируются прерывания, IRQL которых <=4. Специальный IRQL номер 31 (HIGH_LEVEL) определяет такое состояние процессора, когда замаскированы все прерывания. Пример использования HIGH_LEVEL: показ синего экрана смерти. Винда ставит IRQL на HIGH_LEVEL, сбрасывает бит Interrupt в EFLAGS через команду CLI, после чего уходит в бесконечный цикл. Оказываются запрещенными и замаскированными все прерывания, продолжить работу невозможно никаким образом. Только ребутнуться, получив на шину сигнал #RESET ЗЫ. блин, вот понесло то меня... ))
Значит так =) вот что у нас имееться... Код (Text): NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus) { NTSTATUS NZTP_STATUS = STATUS_SUCCESS; PROCESS_BASIC_INFORMATION pProcessInformation; // Параметры процесса который нужно завалить PEPROCESS remEprocess = 0; CLIENT_ID remClientId; PPEB remPeb; NZTP_STATUS = ZwQueryInformationProcess(ProcessHandle,ProcessBasicInformation,&pProcessInformation,sizeof(PROCESS_BASIC_INFORMATION),NULL); if (NT_SUCCESS(NZTP_STATUS)) { remClientId.UniqueProcess = (HANDLE)pProcessInformation.UniqueProcessId; remClientId.UniqueThread = 0; remPeb = pProcessInformation.PebBaseAddress; NZTP_STATUS = PsLookupProcessByProcessId(remClientId.UniqueProcess,&remEprocess); __try { KeAttachProcess(remEprocess); DbgPrint("%ws",remPeb->ProcessParameters->ImagePathName); KeDetachProcess(); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("KeAttachProcess 0x%X",&remEprocess); } ObDereferenceObject(remEprocess); } NZTP_STATUS = OldZwTerminateProcess(ProcessHandle,ExitStatus); return NZTP_STATUS; } Но почему-то DbgPrint показывает какую-то хрень =)
Да я понимаю что у меня адрес remPeb это адрес в том пространстве, но ведь структура одинаковая, почему выводиться чёрт знает что.