Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Получение списка иконок в трее

18.07.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда приложению требуется получить список иконок, находящихся в трее, а также список приложений, которые их туда разместили. Это может быть нужно для обнаружения некоторых скрывающихся приложений, для эмуляции кликов на иконках, ну или просто для спортивного интереса. В любом случае для получения списка иконок надо сделать следующее: найти в трее панель с иконками, при помощи сообщения TB_BUTTONCOUNT получить количество иконок, а затем через отправку сообщения TB_GETBUTTON получить всю необходимую информацию по каждой иконке. Теперь рассмотрим все шаги подробнее.

Работать с вложенными окнами трея мы уже умеем, здесь практически то же самое, разница только в названиях классов дочерних окон.
  1. ; Сегмент данных
  2. section '.data' data readable writeable 
  3. ...
  4. class1  db 'Shell_TrayWnd',0    ; Название класса окна трея
  5. class2  db 'TrayNotifyWnd',0    ; Название класса панели уведомлений
  6. class3  db 'SysPager',0         ; Трей
  7. class4  db 'ToolbarWindow32',0  ; Панель с иконками
  8.  
  9. ToolbarHandle   dd ?            ; Хэндл окна с иконками
  10. ...
  11. ; Сегмент кода
  12. section '.code' code readable executable
  13.         ...
  14.         ; Найти окно трея
  15.         invoke  FindWindow,class1,NULL
  16.         or      eax,eax
  17.         jz      exit_process
  18.  
  19.         ; Найти панель уведомлений
  20.         invoke  FindWindowEx,eax,NULL,class2,NULL
  21.         or      eax,eax
  22.         jz      exit_process
  23.  
  24.         ; Найти трей
  25.         invoke  FindWindowEx,eax,NULL,class3,NULL
  26.         or      eax,eax
  27.         jz      exit_process
  28.  
  29.         ; Найти панель иконок в трее
  30.         invoke  FindWindowEx,eax,NULL,class4,NULL
  31.         or      eax,eax
  32.         jz      exit_process
  33.  
  34.         ; Сохранить хэндл окна с иконками
  35.         mov     [ToolbarHandle],eax
  36.         ...
Теперь у нас есть хэндл окна панели инструментов с иконками в трее. Получим количество иконок в панели.
  1.         ; Получить количество иконок в трее
  2.         invoke  SendMessage,eax,TB_BUTTONCOUNT,0,0
  3.         or      eax,eax
  4.         jz      exit_process
  5.  
  6.         ; Сохранить количество иконок в трее
  7.         mov     [IconsCount],eax
Количество иконок тоже есть. Осталось перебрать их в цикле и получить всю необходимую информацию. Для этого используется сообщение TB_GETBUTTON и структура TBBUTTON для получения результата. Однако, если сейчас попробовать послать окну панели сообщение TB_GETBUTTON, то в результате не получим ничего. Почему? Потому что память, в которую будут записываться данные, обязательно должна принадлежать процессу, который является владельцем окна трея (обычно это explorer.exe).

Читать статью целиком »
Просмотров: 9411 | Комментариев: 9

Построение карты памяти процесса

02.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter

Построение карты памяти процесса

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

Читать статью целиком »
Просмотров: 9348 | Комментариев: 8

Проверка и обнаружение зависших приложений

27.10.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда для работы требуется определение зависших приложений, окна которых не отвечают на сообщения. Для этого есть два способа. Первый - официально документированный, через функцию SendMessageTimeOut. Особенность ее работы заключается в том, что после отправки сообщения окну она ждет ответ заданное время, и, если ответа от приложения не последовало, то возвращает FALSE. Вот пример использования функции. Нужные константы, как обычно, в FASM не определены, пришлось брать их из других источников.
  1.         ...
  2.         ; Определить таймаут 50 миллисекунд
  3.         TIMEOUT = 50
  4.         ; Определить константу SMTO_ABORTIFHUNG
  5.         SMTO_ABORTIFHUNG = 2
  6.         ; hwnd - хэндл проверяемого окна
  7.         invoke  SendMessageTimeout,[hwnd],NULL,0,0,SMTO_ABORTIFHUNG,TIMEOUT,NULL
  8.         ; Если вернулся 0, то приложение "висит"
  9.         or      eax,eax
  10.         jz      app_hung_up
  11.         ...
Минус использования этой функции в том, что при частой проверке большого количества окон зависших приложений, каждый раз будет отрабатываться таймаут для каждого такого окна, что суммарно может дать снижение производительности вашего приложения. Но повторюсь, Microsoft официально рекомендует к использованию именно эту функцию.

Читать статью целиком »
Просмотров: 8718 | Комментариев: 2

Перехват ввода и вывода консольных программ

13.04.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Перехват ввода и вывода консольных программ бывает нужен, когда требуется получить результат их работы для обработки в нашем приложении. Также мы получаем возможность передавать консольным программам собственные данные. Как обычно в FASM'е готовых решений нет, пришлось разбираться самому и портировать с языков высокого уровня. Технически перехват ввода и вывода консоли выполняется с использованием специальных структур, называемых "Pipe". По принципу действия они и вправду похожи на трубы: в один конец информация "вливается", из другого "выливается", а перехват является просто подключением нашего "крана" к тому или иному концу трубы. Для перехвата требуется переопределить стандартные дескрипторы ввода и вывода консольного приложения на наши. Создать новые дескрипторы можно при помощи функции CreatePipe, а затем прописать в структуру STARTUPINFO запускаемого приложения. После этого новые дескрипторы будут доступны для чтения и записи как обычный файл.

В сегменте данных родительского приложения требуется определить следующие переменные и структуры:
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. ; Данные для перехвата консоли
  5. newstdin      dd ?  ; Новый дескриптор стандартного ввода
  6. newstdout     dd ?  ; Новый дескриптор стандартного вывода
  7. read_stdout   dd ?  ; Дескриптор для использования ReadFile
  8. write_stdin   dd ?  ; Дескриптор для использования WriteFile
  9. bytestoread   dd ?  ; Всего байт в буфере консоли
  10. available     dd ?  ; Счетчик байт, доступных для чтения из консоли
  11.  
  12. ; Эта структура по умолчанию не определена, сделаем это сами
  13. struct SECURITY_ATTRIBUTES
  14.        nLength               dd ?
  15.        lpSecurityDescriptor  dd ?
  16.        bInheritHandle        dd ?
  17. ends
  18.  
  19. ; Описание структур для запуска консольной программы и настройки дескрипторов
  20. sinfo      STARTUPINFO
  21. sattr      SECURITY_ATTRIBUTES
  22. pinfo      PROCESS_INFORMATION
  23.  
  24. ; Дополнительно зарезервируем буфер для чтения информации
  25. buff   rb 1024
Буфер большого размера для чтения данных лучше не использовать, вполне достаточно 1 килобайта. Количество байт, доступных для чтения из консоли, можно получить при помощи функции PeekNamedPipe. Обратите внимание, что фактически данные из консоли при этом не забираются, это надо будет сделать при помощи функции чтения файла ReadFile. Вот пример кода перехватчика вывода консоли.

Читать статью целиком »
Просмотров: 11237 | Комментариев: 13

Программы для создания патчей и лоадеров

02.02.2009 | Категория: Темная сторона Силы | Автор: ManHunter
Итак, защита успешно сломана, коммерческая программа перестала требовать денег и зарегистрирована на ваше имя. Теперь надо обязательно поделиться результатами своих трудов со всем миром! Для релиза вам может понадобиться патч, вносящий нужные изменения в файлы. Если есть время и желание, то можно написать свой, а можно воспользоваться готовыми программами для создания патчей и лоадеров. Рассмотрим некоторые из них.


Скриншот программы diablo2oo2's Universal Patcher

diablo2oo2's Universal Patcher. Бесспорный лидер среди программ для создания патчей. Написан полностью на Ассемблере, последняя версия на сегодняшний день 2.18, а промежуточные бета-версии можно время от времени проверять по прямой ссылке. Позволяет делать если не все, то очень многое: статичные и универсальные патчи, самообучающиеся лоадеры, inline-патчи для упакованных файлов, патчи реестра, запись на диск прикрепленных к патчу файлов и еще многое другое. В умелых руках dUP2 будет очень мощным инструментом. Создаваемые патчи можно дополнять трекерной музыкой в формате xm, mod, it, s3m, mtm, umx, v2m, ahx и sid, оформлять собственными скинами, в том числе и нестандартной формы, устанавливать прозрачность окна и менять главную иконку патча. Интерфейс и документация на английском языке. Отечественными умельцами для патчера написан русификатор, но в официальном комплекте его, к сожалению, нет.

Читать статью целиком »
Просмотров: 59499 | Комментариев: 114

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.0051 сек.) / Память: 4.5 Mb
Наверх