Нейроинтерфейс к GUI
Четверг, Апрель 1st, 2010Введение
В случае развития человеческих нейроимплантантов, нейроинтерфейс к GUI может пригодиться и человеку, а на более ближнюю перспективу – ИИ.
Обоснование
Пусть ИНС требуется определить количество строк в окне с таблицей. Визуально определить границы полосы прокрутки, сравнить с размером окна и средним вертикальным размером одной строки – затратно. Эти ресурсы лучше отдать ИНС для более интеллектуальной работы. Получить одно число «количество строк» напрямую от объекта таблицы минимум в тысячу раз эффективнее (особенно, если анализ пикселей будет производить сама ИНС). А если такое повышение эффективности умножается на количество тысяч просматриваемых ячеек (а иначе – распознавание различных шрифтов и текста в каждой ячейке)… Ясно, что прямой нейроинтерфейс к существующему и будущему ПО крайне желателен.
Конечно же, можно адаптировать каждую программу, добавляя нейроинтерфейсы, отличающиеся в каждом случае. Но можно написать небольшое количество универсальных нейроинтерфейсов, которые будут работать с широким классом программ.
Win32 API
В операционной системе Windows, можно перебирать все окна в системе, вместе с дочерними окнами, используя функции наподобие FindWindowEx/FindNextWindow. Они возвращают HWND – «держатель окна». Используя HWND, можно получать заголовки окон, текст внутри кнопок, надписей, списков и выпадающих списков и т. д. Для исследования иерархической структуры окон с этой позиции можно использовать программу Microsoft Spy++, которая поставляется вместе с различными версиями Microsoft Visual Studio. Эта программа также позволяет отлавливать все оконные сообщения, с возможностью фильтровать их по типу, что может пригодиться для анализа того, как окна работают и как на них можно влиять. Используя функции Win32 API, окнам можно слать любые сообщения и получать имена оконных классов. Например, в случае, если внутреннее окно – внедренное окно Internet Explorer (что определяется по классу с именем «Internet Explorer_Server»), то можно задействовать специальный код, чтобы получить объект браузера и начать работать с ним через COM – в том числе, иметь прямой доступ ко всему html-содержимому в виде DOM, произвольно его изучать и менять (примеры подобного кода можно найти в Интернете). Внедрение окон Internet Explorer встречается довольно часто, в чем можно убедиться, используя все тот же Spy++. Например, его можно встретить внутри таких приложений:
* официальный клиент ICQ отображает сообщения в окне Internet Explorer, в том числе – в окне истории сообщений
* справка Windows
* окно с карточкой форм слова (но не перевода) в Abbyy Lingvo
* просмотрщик chm-файлов
* некоторые диалоговые окна в Microsoft Visual Studio, например, мастер создания нового класса
* Нейролаборатория когда-то использовала этот браузер очень широко – от таблиц нейронов до диалоговых окон редактирования точек останова (в VC++ есть специальный класс CDhtmlDialog для создания подобных окон)
* весь интерфейс старых версий Windows Media Player
* окно отображения фотографий в Google Earth
* встроенные браузеры, типа того, что находится в окне winamp
Внедрение в чужой процесс
Перебирать окна одного процесса можно и другого процесса (внешнего). Но если работать через COM-интерфейс с объектами во внешнем процессе, то придется использовать так называемый marshalling, для передачи интерфейса во внешнее приложение. Это утомительно по многим причинам – например, внешнему приложению нельзя передавать обычные двухбайтовые строки, их обязательно нужно передавать по всем правилам, через SysAllocString/SysFreeString. Кроме того, межпроцессное взаимодействие осуществляется медленнее, чем внутрипроцессное. Поэтому во многих случаях желательно, чтобы код нейроинтерфейса работал внутри исследуюемого приложения (хотя обработанные данные потом могут передаваться во внешний процесс с нейросетью). Особенно, внутрипроцессное взаимодействие пригодится для первичного анализа и сжатия изображений перед отправкой внешнему приложению – так как во многих случаях от анализа непосредственно изображений окон отказаться полностью не выйдет. Для внедрения своего кода в чужие приложения используется техника, известная как dll injecting. Обычно она используется всякими вирусами, но, если вы контролируете свой антивирус, то можете разрешить своему приложению выполнять такие подозрительные действия. Способов dll injecting довольно много, я применял загрузку по вызову CreateRemoteThread.
Сторонние библиотеки
Все чаще современное ПО строится на основе сторонних библиотек, которые эмулируют внутренние окна самостоятельно. В таких приложениях создается только одно окно верхнего уровня на основе HWND (иначе операционная система не позволяет), а все внутренние дочерние окна прорисовываются самой библиотекой. Например, программы, написанные на Java или Qt, используют именно такой подход, в то время как программы, написанные на Delphi, используют традиционный подход окон Windows (классы Delphi в приложениях легко определять по имени, которое начинается с префикса из большой буквы T).
Кстати, мысль перевести Нейролабораторию на Qt появилась после очередного запуска Spy++, когда стало видно, что Google Earth написана на Qt (я часто запускаю Spy++ для незнакомых программ чтобы увидеть, на чем они написаны).
Если научиться работать с фреймворками типа Java/Qt, то дополнительно возникнет возможность работать и с окнами в операционных системах, отличных от Windows. К счастью, и Java, и Qt содержат довольно много метаинформации о внутренних объектах. При условии получения доступа к главному оконному объекту внутри приложения, можно перебирать все окна и многие другие объекты, подписываться на любые события и т. п. Как получить доступ к такому объекту? Наверное, можно такой доступ получить и «силой», вмешиваясь извне, наподобие dll injecting. Я такие способы в контексте qt/java пока не исследовал. В случае Qt, может потребоваться учитывать бинарную несовместимость различных компиляторов и изменение реализации системы метаинформации Qt в разных версиях Qt. В то время как байт-код java стандартизирован.
Общая схема работы следующая. Код исследует целевую программу и выбирает наиболее удобные интерфейс. В лучшем случае – код программы модифицирован заранее для удобства взаимодействия с нейросетью, в худшем – используется анализ изображений.
Java и не только
Чтобы обходить защиту модулей java, на подконтрольной системе можно поставить свою, измененную реализацию виртуальной машины – благо, их исходники доступны. Тогда появляется возможность вмешиваться в работу любых java-приложений без их персональной модификации. Это тем более перспективно, что в последнее время наметилась тенденция к переводу многих виртуальных машин других языков программирования на использование байт-кода java (http://ko.com.ua/node/47487 «Планетная система Java»).
Но на java и qt написано очень много ПО с открытым исходным кодом. Для начала, в большинстве случаев, будет достаточно умения работать только с открытым ПО.
Qt
Для Qt есть библиотека с графическим интерфейсом «Conan for Qt» ( http://sourceforge.net/projects/conanforqt/ ). Она позволяет получить представление о широчайших возможностях системы метаинформации Qt (хотя и меньших, чем в java). Сценарий работы для Qt следующий. Берутся исходники некоторой программы, к ним подключается своя библиотека с нейроинтерфейсом, и как правило модифицируется только одна строка – добавляется регистрация главного окна у нейроинтерфейса. Нейроинтерфейс перебирает окна, просматривает иерархию наследования. Например, некоторый класс наследуется от класса окна таблицы, а нейроинтерфейс умеет работать с такими окнами. Тогда он производит приведение типа указателя к известному типу, и получает широчайшие возможности. Например, получить объект «модель данных таблицы», и работать с ней напрямую – без перерисовки экрана. К любой такой таблице можно сразу присоединять систему поиска, аналогичную поиску текста в браузере, даже если исходная программа поиск не поддерживает – нейроинтерфейс будет перебирать по очереди все клетки с поиском нужного текста.
Про работу с файловой системой
Имея нейроинтерфейс к файловой системе на основе Qt или Java, автоматически обеспечивается кроссплатформенная работа с ФС.
Про работу с Html
Если требуется работа с реальными сайтами, то желательно применять насотящие браузеры, а не анализаторы html типа библиотеки libxml2, так как браузеры позволяют исполнять javascript и т. п. Для ускорения работы можно поступить, как поступили в google при автоматическом тестировании google chrome на правильность отображения веб-страниц: браузер отображал страницы не на экран, а в память.






