; Сегмент данных section '.data' data readable writeable
class1 db 'Shell_TrayWnd',0 ; Название класса окна трея class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений class3 db 'SysPager',0 ; Трей class4 db 'ToolbarWindow32',0 ; Панель с иконками
; Структура для кнопки button TBBUTTON ; Структура для пользовательских данных иконки extra EXTRADATA ; Структура для определения имени файла процесса ProcEntry PROCESSENTRY32
; Маска для вывода имени файла на консоль mask db '%s',13,10,0
stdout dd ? ; Дескриптор консольного stdout
ToolbarHandle dd ? ; Хэндл окна с иконками IconsCount dd ? ; Количество иконок в трее ProcId dd ? ; Id процесса ProcTrayId dd ? ; Id процесса hProcess dd ? ; Хэндл процесса lpData dd ? ; Указатель на блок памяти BytesRead dd ? ; Количество прочитанных символов
buff rb 500h ; Буфер для промежуточных данных
;---------------------------------------------
section '.code' code readable executable
start: ; Получить дескриптор stout invoke GetStdHandle,STD_OUTPUT_HANDLE cmp eax,INVALID_HANDLE_VALUE je exit_process or eax,eax jz exit_process
; Сохранить дескриптор stout mov [stdout],eax
; Найти окно трея 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
; Получить количество иконок в трее invoke SendMessage,eax,TB_BUTTONCOUNT,0,0 or eax,eax jz exit_process
; Сохранить количество иконок в трее mov [IconsCount],eax
; Получить 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
; Перебрать все иконки в трее 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 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]
exit_process: ; Пауза перед завершением работы invoke Sleep,9000
include 'api\kernel32.inc' include 'api\user32.inc' include 'api\comctl32.inc' include 'api\comdlg32.inc' include 'api\shell32.inc' include 'api\advapi32.inc'
Сообщение отредактировал Marra_Kesh - Воскресенье, 20.05.2012, 02:21