Blog. Just Blog

Диалоговые окна из html-файлов на Ассемблере

Версия для печати Добавить в Избранное Отправить на E-Mail 29.11.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Использование html-файлов для создания диалоговых окон применяется чаще всего в качестве сплэш-скринов разных триальных защит (первое, что приходит на память - протектор Armadillo и wrapper'ы от различных игровых дистрибьюторов) или в некоторых "демонстрашках", использующих графические эффекты. Плюсов тут много: вместо кропотливой низкоуровневой обработки шрифтов и цветных символов, визуальных эффектов и картинок, достаточно все это описать обычным CSS и HTML-тегами в HTML-странице, а с помощью скриптов JavaScript добавить нужную интерактивность. Кроме этого можно вынести из основного программного кода часть каких-нибудь зубодробильных вычислений на JavaScript, а потом передать результат основному приложению. У меня, например, по такому принципу написана новая версия Eval JavaScript Unpacker.

Для создания окна сперва надо определить в сегменте данных некоторые значения. Главные из них - имя HTML-файла и параметры открываемого окна.
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. szRes     du      'res://',0
  5. lenRes    = $-szRes-2
  6. szName    du      '/htmldialog.html',0 ; Имя html-файла в ресурсах
  7.  
  8. szParam   du      'dialogWidth:350px;dialogHeight:200px;help:off;',0
  9. hMoniker  dd      ?       ; Хэндл моникера
  10. szUrl     rb      200h    ; Путь к основному файлу
szParam - размер и дополнительные параметры создаваемого диалогового окна, их полный список и доступные значения есть в описании функции showModalDialog. Обратите внимание, что строки пути к HTML-файлу записываются в юникоде, соответственно, все функции работы со строками в вашем приложении должны быть юникодные.

Для создания окна сперва надо определить полный путь до html-файла и создать из него системный моникер функцей CreateURLMoniker. Моникер - это специальная метка, которая используется для подключения к COM-объектам. Здесь есть несколько особенностей. Если используется внешний файл, надо указывать полный путь до него. Если же HTML-файл хранится в ресурсах исполняемого файла, то к путь к нему формируется по схеме "res://" + полный путь до исполняемого файла + "/" + имя html-файла. Напомню, что все пути к HTML-файлу должны быть в юникоде. Поддерживаются упакованные и зашифрованные файлы, в которых ресурсы также упакованы. Идентификатор файла в ресурсах обязательно должен быть строковым, а не числовым. FASM не позволяет использовать строки в качестве идентификаторов в ресурсах, поэтому приходится подключать внешние файлы ресурсов, предварительно откомпилировав их. После того, как моникер создан, можно открывать диалоговое окно функцией ShowHTMLDialog. Простейший код приведен ниже.
  1.         ...
  2.         ; Создать системный моникер
  3.         invoke  CreateURLMoniker,NULL,szUrl,hMoniker
  4.         ; Создать диалог из html-файла
  5.         invoke  ShowHTMLDialog,NULL,[hMoniker],NULL,szParam,NULL
  6.         ...
После его выполнения будет создано окно заданного размера и свойств, но с иконкой браузера Internet Exlporer. В Windows 7 вместо иконки IE будет иконка документа. Это один из основных недостатков описанного метода, и я пока не нашел простого способа, чтобы заменить иконку созданного окна на свою собственную. Другой недостаток в том, что даже из упакованных файлов можно извлечь содержимое HTML-файла для просмотра и изучения.

Теперь перейдем к самой интересной части - взаимодействию между основным приложением и окном из HTML-файла. По этой теме я не нашел никакой толковой документации, пришлось все изучать на живом коде под отладчиком. Поэтому все выкладки будут в основном теоретическими, и я не удивлюсь, если случайно изобрел велосипед. В параметрах функции ShowHTMLDialog передаются указатели на две структуры: данные, передаваемые HTML-окну и данные, передаваемые родительскому приложению после закрытия HTML-окна. Обе структуры имеют одинаковый формат:
  1. ; Структура для взаимодействия с html-окном
  2. struct  HTMLARGUMENT
  3.         wType     dw ?   ; Тип передаваемого или получаемого аргумента
  4.         wReserved dw ?   ; 2 байта, зарезервировано
  5.         dReserved dd ?   ; 4 байта, зарезервировано
  6.         lpArg     dd ?   ; Указатель на аргумент
  7. ends 
Первый элемент структуры - слово wType - тип передаваемых данных. Опытным путем удалось выяснить некоторые значения:
  1. VARTYPE_INTEGER = 3   ; Целое число
  2. VARTYPE_STRING  = 8   ; Строка
  3. VARTYPE_ARRAY   = 9   ; Массив
В зарезервированных полях могут быть случайные данные, их назначение пока непонятно, но на результат они никакого влияния не оказывают. В элементе lpArg записан указатель на сами передаваемые данные. Строка должна быть записана в юникоде и заканчиваться нулем, целое число хранится в ячейке размером в DWORD, а как хранится и передается массив, я так и не осилил. Обработка входных и выходных параметров в HTML-файле выполняется средствами JavaScript, например:
  1. //-------------------------------------------------------------------
  2. // Функция получения параметров от родительского приложения
  3. //-------------------------------------------------------------------
  4. function getArguments() {
  5.   // Получить переданные параметры
  6.   var tmp=window.dialogArguments;
  7.   if (tmp!='') {
  8.     alert('Переданы данные из основного приложения: '+tmp);
  9.   }
  10.   else {
  11.     alert('Ничего не передано');
  12.   }
  13. }
  14.  
  15. //-------------------------------------------------------------------
  16. // Функция передачи параметров родительскому приложению
  17. //-------------------------------------------------------------------
  18. function setArguments(tmp) {
  19.   // Установить параметры, передаваемые родительскому приложению
  20.   window.returnValue tmp;
  21.   // Закрыть диалоговое окно
  22.   window.close();
  23. }
В приложении пример программы, использующей HTML-файл из своих ресурсов для создания диалогового окна, которое взаимодействует с родительским приложением. А также я выложил отдельно Microsoft Resource Compiler из пакета MASM32 для компиляции ресурсов.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

HTML.Dialog.Demo.zip (4,256 bytes)

Microsoft Resource Compiler 5.00.1823.1Microsoft Resource Compiler 5.00.1823.1

Resource.Compiler.5.00.1823.1.zip (58,338 bytes)


Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на Я.ру Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Поделиться ссылкой на Friendfeed Добавить в Яндекс.Закладки Добавить в закладки Memori Добавить в закладки Google
Просмотров: 2183 | Комментариев: 8

Комментарии

Отзывы посетителей сайта о статье
Дмитрий (11.07.2011 в 10:41):
Спасибо большое очень полезная статья!
jungle (14.02.2010 в 18:53):
Ну... Тада не буду, я в этом не разбираюсь. А вообще делают как-то, перехватывают все API-функции чтения памяти и отладки чужого процесса.
ManHunter (13.02.2010 в 01:59):
jungle, запускаешь, снимаешь в любом виде дамп памяти, потом из него достаешь все ресурсы. Шифровать тоже бесполезно, все равно данные где-то расшифруются, так что не трать зря силы на бесполезные навороты.
jungle (13.02.2010 в 01:12):
Здравствуйте.
Вы писали: "даже из упакованных файлов можно извлечь содержимое HTML-файла для просмотра и изучения". Я паковал при помощи UPack, через IE просмотреть нельзя (res://C:\Documents%20and%20Settings\1\Рабочий%20стол\HTML.Dialog.Demo \htmldialog.exe/HTMLDIALOG.HTML), открываю блокнотом - тоже никак не просмотреть! Конечно, можно узнать чем упаковано, потом распаковать, но, может, можно как-то зашифровать ресурс?
ManHunter (29.01.2010 в 15:56):
Тут все написано:
http://www.manhunter.ru/webmas...forumah.html
ВИКТОР (29.01.2010 в 15:55):
я только совсем не давно начал изучать MASM , и никак до меня не дойдет каким образом все это переписать под FASM?
Хорошие статьи у ВАС! Много интересного! Пишите еще, с интересом читаю.
Спасибо!

Вот все хотел спросить, а как ВЫ боретесь со спамом, тут же у ВАС нет капчи...
ManHunter (28.01.2010 в 14:48):
Есть ресурсы, посвященные MASM, там и надо спрашивать. А здесь пишут только на FASM.
ВИКТОР (28.01.2010 в 14:42):
Подскажите пожайлуста, а как тоже самое сделать из под MASM-32

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п. будут удаляться. Злостным нарушителям доступ к сайту может быть заблокирован.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2012
При использовании материалов ссылка на сайт обязательна
Время генерации: 0,47 сек. / MySQL: 2 (0,0013 сек.) / Память: 3,5 Mb
Наверх