Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как не дать запустить моё приложение из другова приложения ? [D7, Win2k, WinXP]


OlegM ©   (2011-04-15 11:34:00) 

Здрассте.
Нужно в программе как-то отсделедить что-бы она не запускалась из другой программы типа функциями ShellExecute или CreateProcess или мб еще каким способом


KSergey   (2011-04-18 14:44:00) [1]

Удалено модератором


Anatoly Podgoretsky   (2011-04-15 15:28:00) [2]

> OlegM  (15.04.2011 13:47:16)  [16]

И в ShellExecute


Rouse_   (2011-04-15 14:33:00) [3]

Ну вот как-то так:

program SimpleAntiDebugHintTrick;

{$APPTYPE CONSOLE}

uses
 Windows,
 TlHelp32,
 SysUtils;

type
 PROCESS_BASIC_INFORMATION = packed record
   ExitStatus: DWORD;
   PebBaseAddress: Pointer;
   AffinityMask: DWORD;
   BasePriority: DWORD;
   uUniqueProcessId: Ulong;
   uInheritedFromUniqueProcessId: Ulong;
 end;

function  NtQueryInformationProcess(
   ProcessHandle : THandle;
   ProcessInformationClass : Byte;
   ProcessInformation : Pointer;
   ProcessInformationLength : ULONG;
   ReturnLength : PULONG
 ): DWORD; stdcall; external 'ntdll.dll';

const
 ProcessBasicInformation = 0;
var
 dwProcessHandle: DWORD;
 Info: PROCESS_BASIC_INFORMATION;
 Entry: TProcessEntry32;
 Module: TModuleEntry32;
 Snap1, Snap2: THandle;
 SI: TStartupInfo;
 PI: TProcessInformation;
begin
 try
   DuplicateHandle(GetCurrentProcess, GetCurrentProcess, GetCurrentProcess,
     @dwProcessHandle, 0, False, DUPLICATE_SAME_ACCESS);
   if NtQueryInformationProcess(dwProcessHandle,
     ProcessBasicInformation, @Info, SizeOf(Info), nil) = NO_ERROR then
   begin
     Snap1 := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     if Snap1 <> INVALID_HANDLE_VALUE then
     try
       Entry.dwSize := SizeOf(TProcessEntry32);
       if (Process32First(Snap1, Entry)) then
       repeat
         if Entry.th32ProcessID = Info.uInheritedFromUniqueProcessId then
         begin
           Snap2 := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, Entry.th32ProcessID);
           if Snap2 <> INVALID_HANDLE_VALUE then
           try
             Module.dwSize := SizeOf(TModuleEntry32);
             if Module32First(Snap2, Module) then
             begin
               if LowerCase(Module.szExePath) <> LowerCase(ParamStr(0)) then
               begin
                 SI.cb := SizeOf(TStartupInfo);
                 CreateProcess(PChar(ParamStr(0)), nil, nil, nil,
                   False, CREATE_DEFAULT_ERROR_MODE, nil,
                   PChar(ExtractFilePath(ParamStr(0))), SI, PI);
                 ExitProcess(ERROR_ACCESS_DENIED);
               end;
             end;
           finally
             CloseHandle(Snap2);
           end;
         end;
       until not Process32Next(Snap1, Entry);
     finally
       CloseHandle(Snap1);
     end;
   end;
 except
   on E:Exception do
     Writeln(E.Classname, ': ', E.Message);
 end;
 Writeln('Now parent process is empty.');
 Readln;
end.


Rouse_   (2011-04-15 14:14:00) [4]


> все равно же запуск произойдет

Произойдет, но теперь запускающий процесс не будет иметь валидного хэндла и пайпа на руках.


> OlegM   (15.04.11 13:28) [13]
> 2 Rouse_  можно поподробней ?

Щас пример накидаю.


OlegM   (2011-04-15 13:47:00) [5]

спс бум рыть в эту сторону)


OW   (2011-04-15 13:30:00) [6]


> поискать класс окна той проги, если найдено, определить
> idprocess, если парент процесс тебя = ему,

т.е. наоборот, взять id родителя, проверить того ли класса его окно.


clickmaker   (2011-04-15 13:30:00) [7]

> если ParentID <> тебе самому, стартуй себя и

завершай ParentID )


OlegM   (2011-04-15 13:28:00) [8]

2 Rouse_  можно поподробней ?


OW   (2011-04-15 13:23:00) [9]


> Rouse_ ©   (15.04.11 13:17) [10]
> Т.е. при запуске проверяй, если ParentID <> тебе самому,
>  стартуй себя и завершайся.

не понял..
все равно же запуск произойдет


OlegM   (2011-04-15 13:18:00) [10]

2 OW ненадо иронизировать)), внутренние войны на предприятии )


Rouse_   (2011-04-15 13:17:00) [11]

Запускай себя из самого себя. Т.е. при запуске проверяй, если ParentID <> тебе самому, стартуй себя и завершайся.


OW   (2011-04-15 12:57:00) [12]

можно попробовать
поискать класс окна той проги, если найдено, определить idprocess, если парент процесс тебя = ему, значит покричать, что вся слава принадлежит не тому автору, а гению OlegM :)


OlegM   (2011-04-15 12:50:00) [13]

есть прога которая в качестве доп. функций запускает мою прогу из под себя
и получается видимость это это все сделано в одной проге.


OW   (2011-04-15 12:39:00) [14]


> есть определенная программа, не дать из под нее запустит

а если ее переименуют?


KilkennyCat   (2011-04-15 11:57:00) [15]


> clickmaker ©   (15.04.11 11:53) [5]

наверное, чтобы эта программа не убила бы заголовок и не встроила в себя.


clickmaker   (2011-04-15 11:53:00) [16]

> скажем есть определенная программа, не дать из под нее запустит

а зачем?


KilkennyCat   (2011-04-15 11:51:00) [17]

GetStartupInfo ?


OlegM   (2011-04-15 11:51:00) [18]

ну перефразирую , скажем есть определенная программа, не дать из под нее запустит


Ega23   (2011-04-15 11:50:00) [19]


>  что-бы она не запускалась из другой программы типа функциями
> ShellExecute или CreateProcess или мб еще каким способом


То, что explorer, Total Commander и т.п. используют CreateProcess для запуска твоей программы из своей оболочки - это тебя не напрягает?


KilkennyCat   (2011-04-15 11:47:00) [20]

между прочим, запуск ее "стандарным способом" подразумевает, что она запустилась из-под программы explorer.exe....


Наверх

Титульная страница Поиск, карта сайта Написать письмо