![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как не дать запустить моё приложение из другова приложения ? [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....