В общем, перехватываю ZwTerminateProcess в ядре, код : Код (Text): NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus) { NTSTATUS NZTP_STATUS = STATUS_SUCCESS; struct _PROCESS_BASIC_INFORMATION pProcessInformation; struct _PEB *prev = NULL; ANSI_STRING asProcessName; NZTP_STATUS = ZwQueryInformationProcess(ProcessHandle,ProcessBasicInformation,&pProcessInformation,sizeof(PROCESS_BASIC_INFORMATION),NULL); if (NT_SUCCESS(NZTP_STATUS)) { prev = pProcessInformation.PebBaseAddress; RtlUnicodeStringToAnsiString(&asProcessName,&prev->ProcessParameters->ImagePathName,TRUE); asProcessName.Buffer[asProcessName.Length] = 0x00; switch (*NtBuildNumber) { case 2600: // win xp asProcessName.Buffer[asProcessName.Length] = 0x00; break; } if(strstr( asProcessName.Buffer, HIDE_PROCESS_NAME ) != NULL) { DbgPrint("[unkill] %s , [ProcessName] : %s , [size of str] %d , [PEB] : 0x%X , Process %s , Pid 0x%d )",HIDE_PROCESS_NAME,asProcessName.Buffer,asProcessName.Length,pProcessInformation.PebBaseAddress,asProcessName.Buffer,pProcessInformation.UniqueProcessId); NZTP_STATUS = STATUS_ACCESS_DENIED; RtlFreeAnsiString(&asProcessName); return NZTP_STATUS; } else { DbgPrint("[skip] %s , [ProcessName] : %s , [size of str] %d , [PEB] : 0x%X , Pid 0x%d )",HIDE_PROCESS_NAME,asProcessName.Buffer,asProcessName.Length,pProcessInformation.PebBaseAddress,pProcessInformation.UniqueProcessId); NZTP_STATUS = OldZwTerminateProcess(ProcessHandle,ExitStatus); RtlFreeAnsiString(&asProcessName); return NZTP_STATUS; } } NZTP_STATUS = OldZwTerminateProcess(ProcessHandle,ExitStatus); return NZTP_STATUS; } Так вот когда допустим закрываю notepad.exe через таск мэнэджер, то asProcessName.Buffer указывает на taskmgr.exe , хотя pProcessInformation.UniqueProcessId равен пиду notepad, в чём глюк ? DbgView Код (Text): [skip] notepad , [ProcessName] : C:\WINNT\system32\net1.exe , [size of str] 26 , [PEB] : 0x7FFDF000 , Pid 0x308 ) [skip] notepad , [ProcessName] : C:\WINNT\system32\net.exe , [size of str] 25 , [PEB] : 0x7FFDF000 , Pid 0x352 ) [skip] notepad , [ProcessName] : C:\WINNT\system32\taskmgr.exe , [size of str] 29 , [PEB] : 0x7FFDF000 , Pid 0x668 ) [skip] notepad , [ProcessName] : C:\WINNT\system32\taskmgr.exe , [size of str] 29 , [PEB] : 0x7FFDF000 , Pid 0x860 ) /* тут notepad.exe */ [skip] notepad , [ProcessName] : C:\WINNT\system32\taskmgr.exe , [size of str] 29 , [PEB] : 0x7FFDF000 , Pid 0x800 ) /* тут сам taskmgr */
Очень смешно PEB который ты получил - это твой PEB, друг. А читаешь из памяти другого процесса ты каким образом? Присваиванием? =)
prev = pProcessInformation.PebBaseAddress; мой пеб ? ...это как, как тогда получить...стой ко мне же передаёться Handle процесса который был получен ZwOpenProcessом , т.е. хэндл процесса который надо валить...кстати что значит "мой пеб"
И что? А адресное пространство тебе что тоже оптом отдают по хэндлу? У тебя в принте выводится нормально только та инфа, которая получена через QueryInformationProcess, а эта функция возвращает *указатель* на PEB, а не саму выделенную и готовую к употреблению структуру. Так как адреса пебов одинаковые у всех процессов, при твоем обращении ты попал сам в себя =) edit: О вижу ты вроде понял. Ничего такие ошибки бывают у всех =)
Зачем по хэндлу? Есть же pid, вот и открываем процесс, читаем из него peb, читаем из peb адрес строки с путем, читаем строку. ИМХО чего то это хреновая затея с именами процессов... Нельзя фильтровать не по строчкам, а по pid? icq, конечно, бы дал, если бы там сидел
Счастливый человек =) Т.е. я открываю процес с именем notepad.exe , беру Pid и сравниваю с pProcessInformation.UniqueProcessId ?
Хмм. Я так понимаю, это что-то типа защиты от снятия... И реализуется именно по имени процесса? QueryInformationProcess возвращает структуру с указателем на PEB. Сам PEB находится в другом процессе, в PEB валяется ProcessParameters в котором лежат всякие строчки. В юзер мод (лучше практиковаться тут, безопаснее) это выглядит так: открывается процесс по pid, читается peb через ZwReadVirtualMemory, читается строчка из ProcessParameters тоже через ZwReadVirtualMemory. Все, что тут непонятного? Если хукать ZwOpenProcess, тогда для полного счастья надо ещё ZwDuplicateObject, ZwOpenThread, ZwTerminateThread прикрывать. И то это поможет только от user mode.
ya-ya, примерно так =) вот очень грязный код из старого юзермод троя Код (Text): if ((_ZwQueryInformationProcess == NULL) || (_ZwReadVirtualMemory == NULL) || (_ZwClose == NULL)) return 0; if ((cb == 0) && (uProcessId != NtHlpCurrentProcessId())) return 1;//invalid parameter HANDLE hProcess = NULL; int rc = 0; hProcess = DoOpenProcess(uProcessId, PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0); if (hProcess == NULL) { return 2;//open process fail } else { ULONG cbBuf1 = sizeof PROCESS_BASIC_INFORMATION; PPROCESS_BASIC_INFORMATION ProcessInfo = (PPROCESS_BASIC_INFORMATION)LocalAlloc(LPTR, cbBuf1); if (GetProcessInformation(hProcess, ProcessInfo, cbBuf1, ProcessBasicInformation) < 0) { LocalFree(ProcessInfo); return 3; } PPEB peb = NULL; PPROCESS_PARAMETERS proc_params = NULL; PVOID UserPool = (PVOID)LocalAlloc(LPTR, 8192); rc = _ZwReadVirtualMemory( hProcess, ProcessInfo->PebBaseAddress, UserPool, sizeof(PEB), NULL); LocalFree(ProcessInfo); peb = (PPEB)UserPool; rc = _ZwReadVirtualMemory( hProcess, peb->ProcessParameters, UserPool, sizeof(PROCESS_PARAMETERS), NULL); proc_params = (PPROCESS_PARAMETERS)UserPool; ULONG uSize = 0; LPVOID pBaseAddress = NULL; switch (uFlags) { case 0: //process command line { uSize = proc_params->CommandLine.Length; pBaseAddress = proc_params->CommandLine.Buffer; break; } case 1: //process image file name { uSize = proc_params->ImagePathName.Length; pBaseAddress = proc_params->ImagePathName.Buffer; break; } case 2: //process current directory { uSize = proc_params->CurrentDirectory.DosPath.Length; pBaseAddress = proc_params->CurrentDirectory.DosPath.Buffer; break; } } if ((uSize > cb) || (uSize <= 0)) { _ZwClose(hProcess); LocalFree(UserPool); return 4;//memory buffer too small or nothing found } rc = _ZwReadVirtualMemory( hProcess, pBaseAddress, Buffer, uSize, NULL); _ZwClose(hProcess); LocalFree(UserPool); return uSize; } }
Код (Text): function NtQueryInformationProcess(hProcess: THandle; ProcessInfoClass: Integer; ProcessInfoBuffer: Pointer; ProcessInfoBufferLength: Cardinal; BytesReturned: PCardinal): integer; stdcall; external 'ntdll.dll'; function GetCommandLine(pID: DWORD): PWChar; label err; var pbi: array [0..5] of DWORD; hProc: THandle; pProcParams: DWORD; wCmdLen: WORD; pCmdLine: DWORD; br: DWORD; begin result := nil; hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, pID); if NtQueryInformationProcess(hProc, 0, @pbi, $18, nil) <> 0 then goto err; if not ReadProcessMemory(hProc, Pointer(pbi[1] + $10), @pProcParams, 4, br) then goto err; if not ReadProcessMemory(hProc, Pointer(pProcParams + $40), @wCmdLen, 2, br) then goto err; if not ReadProcessMemory(hProc, Pointer(pProcParams + $44), @pCmdLine, 4, br) then goto err; result := GetMemory(wCmdLen); if result = nil then goto err; if not ReadProcessMemory(hProc, Pointer(pCmdLine), result, wCmdLen, br) then begin FreeMemory(result); result := nil; end; err: CloseHandle(hProc); end;
Искал ,искал так и не нашёл, что за фигня почему не компилиться ? что подключить ещё надо ? NZTP_STATUS = ZwReadVirtualMemory(remProcessHandle,remPebAddr,remUserPool, sizeof(prev),NULL); NTSYSAPI NTSTATUS NTAPI ZwReadVirtualMemory( IN HANDLE ProcessHandle,IN PVOID BaseAddress,OUT PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL); Код (Text): 1>errors in directory c:\driver 1>driver.obj : error LNK2019: unresolved external symbol __imp___ZwReadVirtualMe mory@20 referenced in function _NewZwTerminateProcess@8 1>objfre_w2k_x86\i386\driver.sys : error LNK1120: 1 unresolved externals
WIN32 Native API есть как в кернел мод (ntoskrnl), так и в юзер(ntdll), так вот эта книжка как раз про усер мод =) Если не верим, идем вот сюда и ищем эту функцию http://jedi-apilib.sourceforge.net/native/NativeList.html только сначала почитайте, то что написано внизу про разную подсветку, зеленым там - ntdll KeAttachProcess, memcopy, KeDetachProcess