Форум: "Начинающим";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];
ВнизКак не дать запустить моё приложение из другова приложения ? Найти похожие ветки
← →
OlegM (2011-04-15 11:34) [0]Здрассте.
Нужно в программе как-то отсделедить что-бы она не запускалась из другой программы типа функциями ShellExecute или CreateProcess или мб еще каким способом
← →
KilkennyCat © (2011-04-15 11:47) [1]между прочим, запуск ее "стандарным способом" подразумевает, что она запустилась из-под программы explorer.exe....
← →
Ega23 © (2011-04-15 11:50) [2]
> что-бы она не запускалась из другой программы типа функциями
> ShellExecute или CreateProcess или мб еще каким способом
То, что explorer, Total Commander и т.п. используют CreateProcess для запуска твоей программы из своей оболочки - это тебя не напрягает?
← →
OlegM (2011-04-15 11:51) [3]ну перефразирую , скажем есть определенная программа, не дать из под нее запустит
← →
KilkennyCat © (2011-04-15 11:51) [4]GetStartupInfo ?
← →
clickmaker © (2011-04-15 11:53) [5]> скажем есть определенная программа, не дать из под нее запустит
а зачем?
← →
KilkennyCat © (2011-04-15 11:57) [6]
> clickmaker © (15.04.11 11:53) [5]
наверное, чтобы эта программа не убила бы заголовок и не встроила в себя.
← →
OW © (2011-04-15 12:39) [7]
> есть определенная программа, не дать из под нее запустит
а если ее переименуют?
← →
OlegM (2011-04-15 12:50) [8]есть прога которая в качестве доп. функций запускает мою прогу из под себя
и получается видимость это это все сделано в одной проге.
← →
OW © (2011-04-15 12:57) [9]можно попробовать
поискать класс окна той проги, если найдено, определить idprocess, если парент процесс тебя = ему, значит покричать, что вся слава принадлежит не тому автору, а гению OlegM :)
← →
Rouse_ © (2011-04-15 13:17) [10]Запускай себя из самого себя. Т.е. при запуске проверяй, если ParentID <> тебе самому, стартуй себя и завершайся.
← →
OlegM (2011-04-15 13:18) [11]2 OW ненадо иронизировать)), внутренние войны на предприятии )
← →
OW © (2011-04-15 13:23) [12]
> Rouse_ © (15.04.11 13:17) [10]
> Т.е. при запуске проверяй, если ParentID <> тебе самому,
> стартуй себя и завершайся.
не понял..
все равно же запуск произойдет
← →
OlegM (2011-04-15 13:28) [13]2 Rouse_ можно поподробней ?
← →
clickmaker © (2011-04-15 13:30) [14]> если ParentID <> тебе самому, стартуй себя и
завершай ParentID )
← →
OW © (2011-04-15 13:30) [15]
> поискать класс окна той проги, если найдено, определить
> idprocess, если парент процесс тебя = ему,
т.е. наоборот, взять id родителя, проверить того ли класса его окно.
← →
OlegM (2011-04-15 13:47) [16]спс бум рыть в эту сторону)
← →
Rouse_ © (2011-04-15 14:14) [17]
> все равно же запуск произойдет
Произойдет, но теперь запускающий процесс не будет иметь валидного хэндла и пайпа на руках.
> OlegM (15.04.11 13:28) [13]
> 2 Rouse_ можно поподробней ?
Щас пример накидаю.
← →
Rouse_ © (2011-04-15 14:33) [18]Ну вот как-то так:
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.
← →
Anatoly Podgoretsky © (2011-04-15 15:28) [19]> OlegM (15.04.2011 13:47:16) [16]
И в ShellExecute
← →
KSergey © (2011-04-18 14:44) [20]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.07.24;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.003 c