IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

3 страниц V < 1 2 3  
 Ответить  Открыть новую тему 
> Хук на HCBT_CREATEWND
сообщение
Сообщение #41


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Цитата
прекрасно удаляет ту самую DLL-ку, которая была в прошлом проекте,


Да, действительно. Мою, впрочем, тоже удаляет обычный deletefile, когда я запускаю программу простым даблкликом. Оказался виноват довольно специфичный авторан. Никогда бы на него не подумал, дошло только в ходе экспериментов. Кажется, там мой процесс с какими-то другими привилегиями запускается, что ли... Помог отказ от FreeLibrary (да, каюсь, так не надо писать программы, ну святых тоже не бывает, та же delphi, по словам Ган-блоггера)). Я нагуглил топик, где у кого-то на FreeLibrary вылетало исключение, и он в итоге убрал совсем и помогло, мне тоже помогло)

Цитата

До тех пор, пока счетчик этот не станет = 0, DLL выгружена не будет.


На одном форуме в качестве совета для принудительной выгрузки dll видел совет сделать бесконечный цикл из FreeLibrary, наверное, "пока не сдохнет" lol.gif

Ещё раз спасибо за советы, всё получилось smile.gif

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #42


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


И ещё незадача.. я тут пробовал на разные приложения хук нацеливать, и заметил, что некоторые (это не антивирусы, на них не пробовал smile.gif ), когда запрещаешь их создание в хуке (result:=1), выдают звук ошибки, и вдобавок вылетает ошибка windows (отправить отчёт\не отправлять). С этим можно что-нибудь сделать?


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #43


Гость






"Некоторые" - это какие, например? (желательно - из самых известных, чтоб можно было проверить) Что сообщает Системный Журнал в таком случае, из-за чего ошибка произошла?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #44


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Например мессенджер QIP, в журнале такое: Ошибка приложения qip.exe, версия 8.0.8.1, модуль kernel32.dll, версия 5.1.2600.2180, адрес 0x0001eb33.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #45


Гость






И какой класс окна ты запрещаешь, чтоб "погасить" QIP?

Добавлено через 4 мин.
Кстати, вот тут: CBTProc and HCBT_CREATEWND говорится, что подобное поведение может быть признаком не совсем правильно написанной программы:
Цитата
Well, it may be that the creator of the window didn't presume that the create could fail and it is possible that you are uncovering a bug.
В случае с QIP-ом вполне возможный вариант...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #46


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Ну для инфиума, например - TFRMMAN (в полном названии ещё был суффикс .unicode, ну там всё равно pos используется).
Цитата

В случае с QIP-ом вполне возможный вариант...


Ага, вот и не юзай тут всякие хитроумные функции smile.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #47


Гость






Цитата
Ну для инфиума, например - TFRMMAN
Ага, щаззз smile.gif Ты знаешь, сколько Инфиум создает всякой гадости ДО TFrmMan.UnicodeClass? Вот лог создания окон (имена классов) при первом запуске QIP Infium (еще ничего не настроено - появляется только окно приглашения создать новый аккаунт или выбрать существующий):

madToolsMsgHandlerWindow$a28$40cf4c
madToolsMsgHandlerWindow$a28$40cf4c
TApplication
IME
TPUtilWindow
TPUtilWindow
TPUtilWindow
GDI+ Hook Window Class
IME
OleMainThreadWndClass
TPUtilWindow
TPUtilWindow
TPUtilWindow
TfrmCore.UnicodeClass
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
xxxxWorker
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TPUtilWindow
TfrmMan.UnicodeClass
TInfuButton.UnicodeClass
TInfuComboBox.UnicodeClass
ComboLBox
Edit
CicMarshalWndClass
MSCTFIME UI
TInfuBitBtn.UnicodeClass
TInfuEdit.UnicodeClass
TInfuCheckBox.UnicodeClass
TPUtilWindow
TPUtilWindow
TfrmNewRegWiz.UnicodeClass
TPUtilWindow
IcsWndControlWindowClass
IcsWndControlWindowClass
IME
TfrmNewRegWiz.UnicodeClass
TInfuPanel.UnicodeClass
TInfuPanel.UnicodeClass
TInfuBitBtn.UnicodeClass
TInfuBitBtn.UnicodeClass
TInfuBitBtn.UnicodeClass
TInfuBitBtn.UnicodeClass
TInfuBitBtn.UnicodeClass
TInfuBitBtn.UnicodeClass
TInfuBitBtn.UnicodeClass
TInfuBitBtn.UnicodeClass

А ты говоришь, TFrmMan... Ну, убьешь ты его, и что? smile.gif Получишь окошко QIP-а об ошибке "не могу найти хендл объекта", так? Даже пробовать не буду, ибо знаю, что так и есть. Не зря столько служебных окон создается перед главным.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #48


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


blink.gif Фигассе я наивный... А можно название программки, которая этот лог сделала? Или можно воспользоваться этим же хуком, фильтруя ClassName'ы квипа?

И чего теперь, мне атомную бомбу на всю эту толпу кидать?))


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #49


Гость






Цитата
А можно название программки, которая этот лог сделала?
Я тебе лучше покажу, как DLL-ку изменить, чтоб такое лог получать, ладно? Вот функция хука (в DLL):

function CBTProc(Code: integer; myWParam: WPARAM;
myLParam: LPARAM): LRESULT; stdcall;
var
className: string;
ACopyData: TCopyDataStruct;
begin
if Code < 0 then
begin
Result := CallNextHookEx(rHookRec^.HookID, code, myWParam, myLParam);
exit;
end;

case Code of
HCBT_CREATEWND:
begin
className := GetClName(myWParam);
with aCopyData do
begin
dwData := 0;
cbData := Length(className) * SizeOf(Char);
lpData := PChar(className);
end;
SendMessage(RHookRec^.AppWindow, WM_COPYDATA, 0, LPARAM(@ACopyData));

if pos(UpperCase('notepad'), UpperCase(GetClName(myWParam))) > 0 then // или className
begin
PostMessage(RHookRec^.AppWindow, MY_MESSAGE, myWParam, 0);
result := 1; Exit;
end;
end;
end;
result := 0;
end;

, а вот так это ловится:
// в классе формы - заголовок
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;

// и реализация
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
Info: string;
Len: Integer;
begin
Len := Msg.CopyDataStruct.cbData div sizeof(Char);
SetLength(Info, Len);
Move(Msg.CopyDataStruct.lpData^, PChar(Info)^, Len * sizeof(Char));
Memo1.Lines.Add(Info);
end;
устанавливаешь хук и запускаешь любое приложение значком быстрого вызова, который лежит на десктопе, чтоб лишние окна не создавались - получаешь список всех классов, созданных при запуске приложения.

Цитата
И чего теперь
А теперь искать, какой из этих классов занимается собственно созданием приложения, и убивать именно его...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #50


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Хм.. попробовал тормозить все классы, стоящие до TfrmMan (и вместе, и по отдельности - они там повторяются, кстати) - окошко квипа так же появлялось, а если тормозить и TfrmMan - то все, багрепорт) Я вот чего думаю, поставил я хук, ведь пока сообщение не пройдет все ловушки, к квипу не придёт? Можно ведь "приостанавливать" процесс запуска, а в это время убивать процесс, хэндл-то есть... и хитроумная процедура тоже)

Добавлено через 15 мин.
Да, так получается, в принципе.. Ловлю самый первый класс и завершаю процесс. Правда, тут применяю и первую "хитроумную" процедуру, для получения пути к файлу, т.к. для завершения процесса второй хитроумной нужно знать имя exe. У любителей superqip.exe не сработает, правда.. smile.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #51


Гость






Цитата
Хм.. попробовал тормозить все классы, стоящие до TfrmMan (и вместе, и по отдельности - они там повторяются, кстати) - окошко квипа так же появлялось

Неправда smile.gif

      if (pos(UpperCase('tapplication'), UpperCase(GetClName(myWParam))) > 0) or
(pos(UpperCase('madToolsMsgHandler'), UpperCase(GetClName(myWParam))) > 0) or
(pos(UpperCase('madExceptWndClass'), UpperCase(GetClName(myWParam))) > 0) or
(pos(UpperCase('tfrmcore'), UpperCase(GetClName(myWParam))) > 0) then


begin
PostMessage(RHookRec^.AppWindow, MY_MESSAGE, myWParam, 0);
result := 1; Exit;
end;

Этого достаточно, чтоб убить QIP. Ну, в смысле, то окно выбора аккаунта. Тебе надо было всего навсего добавить в возвращаемую в приложение строку еще и хендл объекта и хендл его предка, и посмотреть, от чего же так зависит появление окна на экране. И кто владелец того окна, на котором заканчивается лог (и выбрасывается окно с сообщением об ошибке). Последовательно проходишь назад, уничтожая всех предков, и вот оно, чудо !!! smile.gif

Так что не надо никаких бомб, опытный снайпер с хорошей оптикой может принести гораздо больше вреда smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #52


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Кажется, поправку на ветер забыл smile.gif У меня багрепорта теперь нет, но звук ошибки всё равно булькает.) Тоже по умолчанию выпрыгивает окно выбора аккаунта. Кстати, на единичном уничтожении tfrmcore у меня уже всё крошилось) А чем с теоретической точки зрения плох мой вариант, если не считать перенесение exe в произвольную папку?

В предыдущем посте три смайла образуют равнобедренный тупоугольный треугольник, тонко lol.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #53


Гость






Цитата
Можно ведь "приостанавливать" процесс запуска, а в это время убивать процесс, хэндл-то есть...
Можешь показать, как именно ты "приостанавливаешь процесс"? Где это происходит? И как именно ты убиваешь процесс? А потом я скажу, чем будет чреват такой подход, ладно? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #54


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


//uses tlhelp32;

function KillTask(ExeFileName: string): integer;stdcall; //вроде как это из тех 10% кода из сети, который не..
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

function CBTProc(Code: integer; myWParam: WPARAM;
myLParam: LPARAM): LRESULT; stdcall;
var i:integer;
s:string;
begin
if Code < 0 then
begin
Result := CallNextHookEx(RHookRec^.HookID, code, myWParam, myLParam);
exit;
end;
case Code of
HCBT_CREATEWND:
begin
//s:=getclname(mywparam);
sn:=uppercase(handtopath(mywparam));
for i:=1 to fc do begin
if pos(wins[i],sn)>0 then begin
PostMessage(RHookRec^.AppWindow, MY_MESSAGE,wparam(i), 0);
killtask(extractfilename(sn));
break;
end;
end;
end;
end;
result := 0;
end;


Точнее, тут ничего не приостанавливается, просто по создании первого класса будет передан хэндл, по которому сразу опознается, вычислится и уничтожится процесс.. и дальше дело не пойдёт..теоретически)

Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #55


Гость






Ну не знаю... Ловить HCBT_CREATEWND, и вместо того, чтобы просто вернуть 1 - вызывать стороннюю процедуру, которая будет уничтожать процессы через TerminateProcess (который был, кстати, создан совсем для других целей) - это как-то... Входит как раз в 90% smile.gif Да, а что насчет работы под Win64? Уверен?

Кстати, если уж TerminateProcess - то перебор всех процессов совсем не обязательно делать, достаточно:
  case Code of
HCBT_CREATEWND:
begin
if (pos(UpperCase('tfrmman'), UpperCase(GetClName(myWParam))) > 0) then
begin
PostMessage(RHookRec^.AppWindow, MY_MESSAGE, myWParam, 0);
GetWindowThreadProcessId(myWParam, PID);
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), PID), 0);
result := 1; Exit;
end;

end;

, это точно так же снесет QIP... Останется только провести мышой над треем (или каким-то образом обновить трей, чтоб иконка убитого приложения ушла оттуда).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #56


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Ловить HCBT_CREATEWND, и вместо того, чтобы просто вернуть 1

Ну по сути result:=1 и терминатор делают одно и то же, только для первого надо для каждого приложения искать нужные классы, а тут раз и всё smile.gif


Цитата
Да, а что насчет работы под Win64? Уверен?


Попробовал на своей win7 home 64 - перехват работает хорошо - нужные окна виду не показывают. Но вот PostMessage, кажется, недокидывает до основной программы сообщение, но это уже наверное мой косяк.. или не мой..)

Цитата

это точно так же снесет QIP...


Легким движением руки 20 строк превращаются...)))

Ну вроде пока всё работает, спасибо smile.gif


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #57


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 20.09.2010 0:44) *

это точно так же снесет QIP... Останется только провести мышой над треем (или каким-то образом обновить трей, чтоб иконка убитого приложения ушла оттуда).


вот кстати вопросик (да и чтобы темы не плодить)...
как можно чужую иконку оттуда убрать... и как её туда вернуть?

удалить то по моему легко можно... а вот как обратно её добавить (и зарегистрировать на родную программу)...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #58


Гость






Цитата
как можно чужую иконку оттуда убрать... и как её туда вернуть?
Попробуй посмотреть вот тут: http://rouse.drkb.ru/winapi.php#fwsystrayinfo , у Rouse_ с Исходников есть пример работы с иконками для WinXP. Чтоб иметь возможность восстановить иконку, надо перед удалением запомнить где-то у себя ту иконку (одну или несколько), которые установлены нужным приложением, а потом послать приложению Shell_NotifyIcon + NIM_ADD
 К началу страницы 
+ Ответить 
сообщение
Сообщение #59


Пионер
**

Группа: Пользователи
Сообщений: 72
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 20.09.2010 10:28) *

Попробуй посмотреть вот тут: http://rouse.drkb.ru/winapi.php#fwsystrayinfo , у Rouse_ с Исходников есть пример работы с иконками для WinXP. Чтоб иметь возможность восстановить иконку, надо перед удалением запомнить где-то у себя ту иконку (одну или несколько), которые установлены нужным приложением, а потом послать приложению Shell_NotifyIcon + NIM_ADD


о.... спасибо... поковыряю...

> а потом послать приложению Shell_NotifyIcon + NIM_ADD
системному трею послать же?

Сообщение отредактировано: Snake_B -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #60


Гость






Ну да, трею, разумеется...
 К началу страницы 
+ Ответить 

3 страниц V < 1 2 3
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.12.2024 7:50
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name