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

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

Как определить запуск кокого либо приложения? [D6, Win2k]


Страницы:   1 2

Piople ©   (2003-11-17 09:08:00) 

Скажите пожалуйста как можно перехватить запуск приложения, плизз. Я ставлю глобальный хук через dll на WM_create, но он ловит все сообщения в системе, а мне нужно только чтобы ловились вновь стартующие приложения, заранее ШПАШИБО.


Piople   (2003-11-19 08:29:00) [21]

Усем, упасиба, за усЁ :)


Demetrius2003   (2003-11-18 12:08:00) [22]

Удалено модератором
Примечание: Offtopic


Digitman   (2003-11-18 11:59:00) [23]


> А нет еще каких нибудь ссылок


а как же ? есть !

http://www.gramota.ru

с нее и начни, очень полезно будет для тебя, думаю

ну так ты статью-то на этом сайте изучил ? примеры разобрал ? сравнил со своим кодом ?


Demetrius2003   (2003-11-18 11:46:00) [24]

>Piople ©
Разберись, что такое адрессное пространство процесса
Разберись , что такое ДЛЛ, и зачем она нужна, а потом сам всё поймёшь.
Джеффри Рихтер в помощь


Piople   (2003-11-18 11:42:00) [25]

Удалено модератором
Примечание: Offtopic


Digitman   (2003-11-18 08:44:00) [26]


> Piople


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

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

изучи статью и примеры в ней, кое-что оч важное касаемое глоб.хуков у тебя при этом прояснится


Piople   (2003-11-18 08:41:00) [27]

Удалено модератором
Примечание: Offtopic


Digitman   (2003-11-18 08:38:00) [28]


> Piople


а ведь Demetrius2003 © (18.11.03 08:34) [11] действительно прав !

тебе для начала нужно разобраться во всех тонкостях установки глоб.хука В ПРИНЦИПЕ, а уж затем "нагружать" хук-DLL предметной функциональностью.

Вникни в то , что я тебе сказал в [9] и исправь как минимум одну явную и серьезную ошибку в логике и принципах установки глоб.хука


Piople   (2003-11-18 08:35:00) [29]

Удалено модератором
Примечание: Offtopic


Demetrius2003   (2003-11-18 08:34:00) [30]

>Digitman
:))))
Ну вы даёте, человек и хук толком ставить не умеет, а вы ему
перехватывай все winapi-вызовы CreateWindow[Ex], он, наверное, и не понял, что это такое.
>Piople ©
Рано тебе ещё WinApi функции перехватывать(без обид)


Piople   (2003-11-18 08:27:00) [31]

Конкретизирую, мне надо хэндл главного окна, и если ты говоришь что не будт работать, то что мне надо подправить


Digitman   (2003-11-18 08:24:00) [32]


> глаб хук на запуск нового приложения, но вот как получить
> его Хэндл


хэндл есть у процесса, хэндл есть у окна , хэндл есть у ... и т.д. и т.п.

но у приложений НЕТ никакого хэндла !

это - раз.

второе.

код твой работать не будет, потому что при ПЕРВОЙ ЖЕ попытке выполнения строчки

Result:=CallNextHookEx(SysHook, Code, wParam, lParam);

произойдет AV-исключение, ибо переменных SysHook будет столько, сколько экземпляров хук-DLL система создаст и загрузит в ВАП разлисных GUI-процессов при установке хука. Ты же инициализируешь только самый первый экз-р переменной, т.е. тот который фигурирует в явно загружаемом тобой экз-ре хук-DLL с целью вызова процедуры hook()


Piople   (2003-11-18 07:02:00) [33]

У меня немного попроще. Вообщем я сам дапетрил как поставить глаб хук на запуск нового приложения, но вот как получить его Хэндл, для дальнейшей с ним работы я не знаю. Может быть подскажите. Заранее спасибо. Вот сам листинг:

library hook_dll;

uses
Windows,
Messages,
Forms;

var
SysHook : HHook = 0;
Wnd : Hwnd = 0;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code = HSHELL_WINDOWCREATED then
begin

//Сдесь делаем с окном все что нужно

end;

Result:=CallNextHookEx(SysHook, Code, wParam, lParam);
end;

procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_SHELL, @SysMsgProc, hInstance, 0);

if SysHook <> 0 then MessageBox(0, "HOOK2 установлен !", "Message", 0)
else MessageBox(0, "HOOK2 установить не удалось !", "Message", 0);
end
else
begin
if UnhookWindowsHookEx(SysHook) then MessageBox(0, "HOOK2 снят !","Message", 0)
else MessageBox(0, "HOOK2 снять не удалось !", "Message", 0);
SysHook := 0;
end;
end;

exports hook;

begin
end.


Digitman   (2003-11-17 10:29:00) [34]


function SetProcAddress(hModule: THandle; lpProcName: PChar; pProcAddr: Pointer): Boolean;
var
Peb: PPeb;
hProcess, hImporter: THandle;
pOptHdr: PImageOptionalHeader;
pImpDir: PImageImportDescriptor;
pExpDir: PImageExportDirectory;
pIATEntry: PImageThunkData;
pOldProcAddr: Pointer;
pdwNamePtr, pdwEntryPoint: PDWord;
pName: PChar;
pwOrdinalPtr: PWord;
i, nOrdinal, dwNewProcAddrRVA, dwProtect: DWord;
pLdrData : PPEB_LDR_DATA;
pLoadOrderList : PPLIST_ENTRY;
pInLoadModuleEntry: PModuleEntry;
pModuleNfo: PModuleInfo;
pImpModuleNfo: PModuleInfo;
sModuleName: String;
dwDirSize: DWord;
begin
Result := False;
if (hModule = 0) or (lpProcName = nil) then Exit;
peb := GetCurrentPEB;
LockLoader(Peb);
try
pModuleNfo := FindModuleInfo(hModule);
if not Assigned(pModuleNfo) then Exit;
sModuleName := WideCharToString(pModuleNfo^.BaseDllName.Buffer);
pOptHdr := PImageOptionalHeader(hModule + PImageDosHeader(hModule)._lfanew + SIZE_OF_NT_SIGNATURE + IMAGE_SIZEOF_FILE_HEADER);
dwDirSize := pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
if (pOptHdr^.NumberOfRvaAndSizes < 16) or (dwDirSize = 0) then Exit;
pExpDir := PImageExportDirectory(hModule + pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
pdwEntryPoint := nil;
pwOrdinalPtr := PWord(hModule + DWord(pExpDir^.AddressOfNameOrdinals));
if HiWord(DWord(lpProcName)) = 0 then
begin
nOrdinal := LoWord(DWord(lpProcName)) - pExpDir^.Base;
if (nOrdinal < pExpDir^.NumberOfFunctions) then
pdwEntryPoint := PDWord(hModule + DWord(pExpDir^.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
end
else
begin
pdwNamePtr := PDWord(hModule + DWord(pExpDir^.AddressOfNames));
for i := 0 to pExpDir^.NumberOfNames - 1 do
begin
pName := PChar(PDWord(hModule + PDword(pdwNamePtr)^));
if lstrcmp(pName,lpProcName) = 0 then
begin
nOrdinal := pwOrdinalPtr^;
pdwEntryPoint := PDWord(hModule + DWord(pExpDir^.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
Inc(nOrdinal, pExpDir^.Base);
Break;
end
else
begin
Inc(pdwNamePtr);
Inc(pwOrdinalPtr);
end
end;
end;
if not Assigned(pdwEntryPoint) then Exit;
pOldProcAddr := Pointer(hModule + pdwEntryPoint^);
if pOldProcAddr = pProcAddr then
Result := True
else
try
dwNewProcAddrRVA := DWord(pProcAddr) - hModule;
hProcess := OpenProcess(PROCESS_VM_OPERATION, False, GetCurrentProcessId);
Win32Check(hProcess <> 0);
try
Win32Check(VirtualProtectEx(hProcess, pExpDir, dwDirSize, PAGE_WRITECOPY, dwProtect));
try
pdwEntryPoint^ := dwNewProcAddrRVA;
finally
VirtualProtectEx(hProcess, pExpDir, dwDirSize, dwProtect, dwProtect);
end;
pName := PChar(sModuleName);
pLdrData := Peb^.LdrData;
pLoadOrderList := @pLdrData.InLoadOrderModuleList;
pInLoadModuleEntry := PModuleEntry(pLoadOrderList^);
while PPListEntry(pInLoadModuleEntry) <> pLoadOrderList do
begin
pImpModuleNfo := @pInLoadModuleEntry.ModuleInfoData;
if pImpModuleNfo <> pModuleNfo then
begin
hImporter := THandle(pImpModuleNfo^.DllBase);
pOptHdr := PImageOptionalHeader(hImporter + PImageDosHeader(hImporter)._lfanew + SIZE_OF_NT_SIGNATURE + IMAGE_SIZEOF_FILE_HEADER);
if pOptHdr^.NumberOfRvaAndSizes = 16 then
begin
dwDirSize := pOptHdr^.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
if dwDirSize > 0 then
begin
pImpDir := PImageImportDescriptor(hImporter + pOptHdr^.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while Assigned(PChar(pImpDir^.RVAImportModuleName)) do
begin
if lstrcmpi(PChar(hImporter + pImpDir^.RVAImportModuleName), pName) = 0 then
begin
pIATEntry := PImageThunkData(hImporter + DWord(pImpDir^.RVAImportAddressTable));
while Assigned(pIATEntry^.Func) do
begin
if pIATEntry^.Func = pOldProcAddr then
begin
Win32Check(VirtualProtectEx(hProcess, pIATEntry, SizeOf(pIATEntry), PAGE_WRITECOPY, dwProtect));
try
pIATEntry^.Func := pProcAddr;
finally
VirtualProtectEx(hProcess, pIATEntry, SizeOf(pIATEntry), dwProtect, dwProtect);
end;
Break;
end;
Inc(pIATEntry);
end;
end;
Inc(pImpDir);
end;
end;
end;
end;
pInLoadModuleEntry := PModuleEntry(pInLoadModuleEntry.InLoadOrderLinks.Flink);
end;
finally
CloseHandle(hProcess);
end;
Result := True;
except
end;
finally
UnLockLoader(Peb);
end;
end;


Piople   (2003-11-17 10:09:00) [35]


> при инициализации хук-DLL перехватывай все winapi-вызовы
> CreateWindow[Ex], выполняемые в контексте данного процесса

А, это исходника нет, для наглядности :)


Digitman   (2003-11-17 10:06:00) [36]

при инициализации хук-DLL перехватывай все winapi-вызовы CreateWindow[Ex], выполняемые в контексте данного процесса


Piople   (2003-11-17 09:59:00) [37]


> а я не понял, что значит "обратится"

Вообщем я хочу сделать так чтобы все главные формы приложений появлялись плавно, я использую для этого Alpha, все работает если напремую указать хэндл окна, но как быть только с вновь появляющимися


Digitman   (2003-11-17 09:49:00) [38]


> Не понял так как тогда обратится та к этому процессу


а я не понял, что значит "обратится"


Piople   (2003-11-17 09:26:00) [39]


> после установки любого глоб.хука хук-DLL автоматически внедряется
> во все существующие GUI-процессы.
>
> с этого момента, как только будут стартовать новые GUI-процессы,
> система будет автоматически внедрять твою хук-DLL в эти
> процессы.
>
> это и можно считать фактом старта нового GUI-процесса, т.е.
> процедура инициализации твоей DLL будет получать управление
> всякий раз, когда система будет внедрять твою DLL во вновь
> стартовавший GUI-процесс. перехват же wm_create - это уже
> лишнее.

Не понял так как тогда обратится та к этому процессу


Digitman   (2003-11-17 09:18:00) [40]

после установки любого глоб.хука хук-DLL автоматически внедряется во все существующие GUI-процессы.

с этого момента, как только будут стартовать новые GUI-процессы, система будет автоматически внедрять твою хук-DLL в эти процессы.

это и можно считать фактом старта нового GUI-процесса, т.е. процедура инициализации твоей DLL будет получать управление всякий раз, когда система будет внедрять твою DLL во вновь стартовавший GUI-процесс. перехват же wm_create - это уже лишнее.


Страницы:   1 2

Наверх

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