#1 02-03-2007 10:17:45

ZwTerminateProcess глючит ?

В общем, перехватываю ZwTerminateProcess в ядре, код :

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

[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 */

Отредактировано WIN32 (02-03-2007 10:30:57)


Всех простил.

Вне форума

#2 02-03-2007 10:36:04

Re: ZwTerminateProcess глючит ?

Очень смешно ;) PEB который ты получил - это твой PEB, друг. А читаешь из памяти другого процесса ты каким образом? Присваиванием? =)


Ring0 - the source of inspiration

Вне форума

#3 02-03-2007 10:42:28

Re: ZwTerminateProcess глючит ?

prev = pProcessInformation.PebBaseAddress; мой пеб ? ...это как, как тогда получить...стой ко мне же передаёться Handle процесса который был получен ZwOpenProcessом , т.е. хэндл процесса который надо валить...кстати что значит "мой пеб"


Всех простил.

Вне форума

#4 02-03-2007 10:43:06

Re: ZwTerminateProcess глючит ?

ааа всё понял =)
это мне ещё повезло что PEBы совпались да ? =)
Тогда как получить PEB по Handle ?

Отредактировано WIN32 (02-03-2007 10:44:08)


Всех простил.

Вне форума

#5 02-03-2007 10:43:28

Re: ZwTerminateProcess глючит ?

deleted...

Отредактировано WIN32 (02-03-2007 10:44:29)


Всех простил.

Вне форума

#6 02-03-2007 10:45:45

Re: ZwTerminateProcess глючит ?

И что? А адресное пространство тебе что тоже оптом отдают по хэндлу? У тебя в принте выводится нормально только та инфа, которая получена через QueryInformationProcess, а эта функция возвращает *указатель* на PEB, а не саму выделенную и готовую к употреблению структуру. Так как адреса пебов одинаковые у всех процессов, при твоем обращении ты попал сам в себя =)

edit:

О вижу ты вроде понял. Ничего такие ошибки бывают у всех =)

Отредактировано EP_X0FF (02-03-2007 10:46:34)


Ring0 - the source of inspiration

Вне форума

#7 02-03-2007 10:53:11

Re: ZwTerminateProcess глючит ?

Тогда как получить PEB по Handle ? =)
кстати, дайте ваше ICQ если можно %))

Отредактировано WIN32 (02-03-2007 10:54:04)


Всех простил.

Вне форума

#8 02-03-2007 11:01:48

Re: ZwTerminateProcess глючит ?

WIN32 написал ранее:

Тогда как получить PEB по Handle ? =)

Зачем по хэндлу? Есть же pid, вот и открываем процесс, читаем из него peb, читаем из peb адрес строки с путем, читаем строку. ИМХО чего то это хреновая затея с именами процессов... Нельзя фильтровать не по строчкам, а по pid?

icq, конечно, бы дал, если бы там сидел :)


Ring0 - the source of inspiration

Вне форума

#9 02-03-2007 11:07:48

Re: ZwTerminateProcess глючит ?

icq, конечно, бы дал, если бы там сидел :)

Счастливый человек =)
Т.е. я открываю процес с именем notepad.exe , беру Pid и сравниваю с pProcessInformation.UniqueProcessId ?


Всех простил.

Вне форума

#10 02-03-2007 11:09:07

Re: ZwTerminateProcess глючит ?

Может сразу перехватывать ZwOpenProcess ? +)


Всех простил.

Вне форума

#11 02-03-2007 11:19:08

Re: ZwTerminateProcess глючит ?

WIN32 написал ранее:

Т.е. я открываю процес с именем notepad.exe , беру Pid и сравниваю с pProcessInformation.UniqueProcessId ?

WIN32 написал ранее:

Может сразу перехватывать ZwOpenProcess ? +)

Хмм. Я так понимаю, это что-то типа защиты от снятия... И реализуется именно по имени процесса? QueryInformationProcess возвращает структуру с указателем на PEB. Сам PEB находится в другом процессе, в PEB валяется ProcessParameters в котором лежат всякие строчки. В юзер мод (лучше практиковаться тут, безопаснее) это выглядит так: открывается процесс по pid, читается peb через ZwReadVirtualMemory, читается строчка из ProcessParameters тоже через ZwReadVirtualMemory. Все, что тут непонятного?

Если хукать ZwOpenProcess, тогда для полного счастья надо ещё ZwDuplicateObject, ZwOpenThread, ZwTerminateThread прикрывать. И то это поможет только от user mode.


Ring0 - the source of inspiration

Вне форума

#12 02-03-2007 11:33:44

Re: ZwTerminateProcess глючит ?

http://www.codeguru.com/forum/archive/index.php/t-315861.html


Всех простил.

Вне форума

#13 02-03-2007 11:40:41

Re: ZwTerminateProcess глючит ?

ya-ya, примерно так =) вот очень грязный код из старого юзермод троя

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;
	}
}

Ring0 - the source of inspiration

Вне форума

#14 02-03-2007 12:44:32

Re: ZwTerminateProcess глючит ?

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;

Отредактировано n0name (02-03-2007 12:45:24)


То, что не удается запрограммировать на ассемблере, приходится паять.

Вне форума

#15 02-03-2007 13:40:27

Re: ZwTerminateProcess глючит ?

Искал ,искал так и не нашёл, что за фигня почему не компилиться ? что подключить ещё надо ?
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);

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

Всех простил.

Вне форума

#16 02-03-2007 14:09:36

Re: ZwTerminateProcess глючит ?

Товарищ WIN32, такой функции в ядре в экспортном виде нет. Её ручками обычно пишут =)


Ring0 - the source of inspiration

Вне форума

#17 02-03-2007 14:17:17

Re: ZwTerminateProcess глючит ?

балин как так нету, у Гэри Нэббета она описана почемуто


Всех простил.

Вне форума

#18 02-03-2007 14:22:03

Re: ZwTerminateProcess глючит ?

Потому что у него книжка про юзермод


Ring0 - the source of inspiration

Вне форума

#19 02-03-2007 14:30:17

Re: ZwTerminateProcess глючит ?

Native Api Reference =) EP_XOFF вы чтото путаете.
Ну пример хотя бы есть ?


Всех простил.

Вне форума

#20 02-03-2007 14:42:48

Re: ZwTerminateProcess глючит ?

WIN32

Native API есть как в кернел мод (ntoskrnl), так и в юзер(ntdll), так вот эта книжка как раз про усер мод =)

Если не верим, идем вот сюда и ищем эту функцию http://jedi-apilib.sourceforge.net/native/NativeList.html только сначала почитайте, то что написано внизу про разную подсветку, зеленым там - ntdll

KeAttachProcess, memcopy, KeDetachProcess

Отредактировано EP_X0FF (02-03-2007 14:43:24)


Ring0 - the source of inspiration

Вне форума

#21 02-03-2007 15:26:15

Re: ZwTerminateProcess глючит ?

Ладно спасибо , будем пробовать =) кстати
IRQL_NOT_LESS_OR_EQUAL что за ошибка ?

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);
}

Отредактировано WIN32 (02-03-2007 15:32:51)


Всех простил.

Вне форума

#22 02-03-2007 15:37:34

Re: ZwTerminateProcess глючит ?

В KeAttachProcess должен отправляться не PEB, а EPROCESS процесса.


Ring0 - the source of inspiration

Вне форума

#23 02-03-2007 16:44:35

Re: ZwTerminateProcess глючит ?

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.

А я получаю так :

	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 то выходит синий экран, блин =(

Отредактировано WIN32 (02-03-2007 16:45:24)


Всех простил.

Вне форума

#24 02-03-2007 16:49:28

Re: ZwTerminateProcess глючит ?

Есть совет - выкинуть левые примеры и посмотреть на реализацию функций ядра. Вот описание функций, которые тебе нужны.

VOID
__stdcall
KeAttachProcess (
    IN PEPROCESS Process
);

VOID
__stdcall
KeDetachProcess (
    VOID
);

А уж как получить EPROCESS это сам подумай. Никаких peb'ов в эти функции передаваться не должно и в помине. Вообще, прежде чем лезть в ядро, неплохо бы ознакомиться с его устройством хотя бы поверхностно.


Ring0 - the source of inspiration

Вне форума

#25 02-03-2007 16:52:02

Re: ZwTerminateProcess глючит ?

http://forum.shelek.com/index.php?action=printpage;topic=3464.0
http://www.wasm.ru/forum/viewtopic.php?pid=139225

почитай ка это

Вне форума

Board footer

Работает на FluxBB.
Перевод FluxBB RU.