Blog. Just Blog
Получение списка иконок в трее
Иногда приложению требуется получить список иконок, находящихся в трее, а также список приложений, которые их туда разместили. Это может быть нужно для обнаружения некоторых скрывающихся приложений, для эмуляции кликов на иконках, ну или просто для спортивного интереса. В любом случае для получения списка иконок надо сделать следующее: найти в трее панель с иконками, при помощи сообщения TB_BUTTONCOUNT получить количество иконок, а затем через отправку сообщения TB_GETBUTTON получить всю необходимую информацию по каждой иконке. Теперь рассмотрим все шаги подробнее.Работать с вложенными окнами трея мы уже умеем, здесь практически то же самое, разница только в названиях классов дочерних окон.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- class1 db 'Shell_TrayWnd',0 ; Название класса окна трея
- class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений
- class3 db 'SysPager',0 ; Трей
- class4 db 'ToolbarWindow32',0 ; Панель с иконками
- ToolbarHandle dd ? ; Хэндл окна с иконками
- ...
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Найти окно трея
- invoke FindWindow,class1,NULL
- or eax,eax
- jz exit_process
- ; Найти панель уведомлений
- invoke FindWindowEx,eax,NULL,class2,NULL
- or eax,eax
- jz exit_process
- ; Найти трей
- invoke FindWindowEx,eax,NULL,class3,NULL
- or eax,eax
- jz exit_process
- ; Найти панель иконок в трее
- invoke FindWindowEx,eax,NULL,class4,NULL
- or eax,eax
- jz exit_process
- ; Сохранить хэндл окна с иконками
- mov [ToolbarHandle],eax
- ...
Code (Assembler) : Убрать нумерацию
- ; Получить количество иконок в трее
- invoke SendMessage,eax,TB_BUTTONCOUNT,0,0
- or eax,eax
- jz exit_process
- ; Сохранить количество иконок в трее
- mov [IconsCount],eax
Ненадолго отвлечемся от трея и выделим блок памяти нужного размера в контексте процесса-владельца трея. Размер блока равен размеру структуры TBBUTTON.
Code (Assembler) : Убрать нумерацию
- ; Получить ID процесса-владельца трея
- invoke GetWindowThreadProcessId,[ToolbarHandle],ProcId
- ; Открыть процесс с полным доступом
- invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,[ProcId]
- or eax,eax
- ; Фокус не удался
- jz exit_process
- ; Сохранить хэндл процесса-владельца трея
- mov [hProcess],eax
- ; Выделить блок памяти в контексте процесса
- invoke VirtualAllocEx,[hProcess],NULL,dword sizeof.TBBUTTON,\
- MEM_COMMIT,PAGE_READWRITE
- or eax,eax
- jz exit_process
- ; Сохранить указатель на блок памяти
- mov [lpData],eax
Code (Assembler) : Убрать нумерацию
- ; Структура пользовательских данных иконки
- struct EXTRADATA
- Wnd dd ? ; Хэндл родительского окна иконки
- uID dd ? ; Стиль отображения иконки
- ends
Code (Assembler) : Убрать нумерацию
- ; Перебрать все иконки в трее
- loc_loop:
- dec [IconsCount]
- ; Получить иконку из трея с индексом IconsCount
- invoke SendMessage,[ToolbarHandle],TB_GETBUTTON,[IconsCount],[lpData]
- ; Прочитать структуру иконки
- invoke ReadProcessMemory,[hProcess],[lpData],button,\
- dword sizeof.TBBUTTON,BytesRead
- or eax,eax
- jz exit_process
- ; Прочиталась вся структура?
- cmp [BytesRead],sizeof.TBBUTTON
- jnz exit_process
- ; Прочитать пользовательские данные иконки
- invoke ReadProcessMemory,[hProcess],[button.dwData],extra,\
- dword sizeof.EXTRADATA,BytesRead
- or eax,eax
- jz exit_process
- ; Прочиталась вся структура?
- cmp [BytesRead],sizeof.EXTRADATA
- jnz exit_process
- ; Это скрытая иконка?
- mov eax,[extra.uID]
- and eax,80000000h
- or eax,eax
- ; Да, пропустить
- jnz loc_loop
- ; Окно процесса существует?
- invoke IsWindow,[extra.Wnd]
- or eax,eax
- jz loc_loop
- ; Получить Id процесса, чья иконка находится в трее
- invoke GetWindowThreadProcessId,[extra.Wnd],ProcTrayId
- ; Снимок процессов системы
- invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
- mov ebx,eax
- ; Перебрать в цикле все процессы
- mov eax,sizeof.PROCESSENTRY32
- mov [ProcEntry.dwSize],eax
- invoke Process32First,ebx,ProcEntry
- @@:
- cmp eax,FALSE
- je @f
- ; Это нужный нам процесс?
- mov eax,[ProcEntry.th32ProcessID]
- cmp eax,[ProcTrayId]
- je @f
- ; Следующий процесс
- invoke Process32Next,ebx,ProcEntry
- or eax,eax
- jz loc_loop
- jmp @b
- @@:
- push eax
- ; Закрыть хэндл
- invoke CloseHandle,ebx
- pop eax
- ; Имя файла определить не удалось
- or eax,eax
- jz @f
- invoke wsprintf,buff,mask,ProcEntry.szExeFile
- add esp,12
- ; Записать имя файла в консоль
- invoke lstrlen,buff
- invoke WriteConsole,[stdout],buff,eax,BytesRead,NULL
- @@:
- ; Все иконки обработали?
- cmp [IconsCount],0
- ja loc_loop
- ; Очистить память и ресурсы
- invoke VirtualFreeEx,[ProcId],[lpData],0,MEM_RELEASE
- invoke CloseHandle,[ProcId]
В приложении консольная программа с исходником, выводящая на экран список исполняемых файлов всех приложений, иконки которых видны в трее.
Просмотров: 429 | Комментариев: 7
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(28.07.2010 в 10:15):
Дублируй, я не против.
umka
(28.07.2010 в 10:00):
А можно на Delphi продублировать???
В принципе, понятно, но есть пару мест...
Спасибо.
В принципе, понятно, но есть пару мест...
Спасибо.
ManHunter
(19.07.2010 в 19:36):
Прислали ответ:
Уважаемый [skipped],
Ваш запрос был проанализирован. Это ложное срабатывание. Исправлено.
Спасибо за сотрудничество.
--
С уважением,
Служба вирусного мониторинга ООО "Доктор Веб"
Уважаемый [skipped],
Ваш запрос был проанализирован. Это ложное срабатывание. Исправлено.
Спасибо за сотрудничество.
--
С уважением,
Служба вирусного мониторинга ООО "Доктор Веб"
Isaev
(18.07.2010 в 21:09):
Это паранойя у него... из-за ReadProcessMemory видимо
ManHunter
(17.07.2010 в 15:27):
Ладно, тогда пока не разрулится ситуация, в аттаче будет только исходник без исполняемого файла. Какой-то клинический, блин, случай.
alek64
(17.07.2010 в 15:23):
все равно ругается :)
Trojan.DownLoader1.15057
Trojan.DownLoader1.15057
ManHunter
(17.07.2010 в 11:46):
Как выяснилось, DrWeb почему-то считает скомпилированный файл вирусом. Ща отправлю вебовцам, пусть исправляют.
http://www.virustotal.com/ru/a...e-1279352768
Спасибо alek64 за информацию. Чуток подправил код, теперь порядок :)
http://www.virustotal.com/ru/a...e-1279352768
Спасибо alek64 за информацию. Чуток подправил код, теперь порядок :)
Добавить комментарий
Заполните форму для добавления комментария
Пример программы с исходным текстом (FASM)