Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: 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)


Поделиться ссылкой ВКонтакте
Просмотров: 6871 | Комментариев: 28

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (05.10.2017 в 10:19):
Теоретически - да, делают же браузеры на движке webkit. Тут ведь тоже странички не из воздуха рисуются, используется библиотека IECore. Разница только в том, что IE в системе "из коробки", а в случае, например, с движком webkit, придется таскать за собой весь этот webkit.
Grey (05.10.2017 в 08:29):
А можно html аналогичным способом приклеить не к IE а к хрому или другому браузеру?
Grey (28.07.2017 в 22:07):
разобрался
VARTYPE_STRING  = 8 это и есть vt_bstr
перед строкой указывается ее длина:
LeSszInValue    dd 94  ; длина строки
szInValue       du      'StringStringStringStringString String from FASM',0
Grey (28.07.2017 в 09:24):
Иногда ест. Логика странная. Передаю указатель на GetCommandLine - видит только первый параметр, он более 16 символов, ассоциированный с расширением файл - не передает, обрезает. Даю указатель со смещением на второй параметр - обрезает до 16 символов.
Время появится - попробую wType = BSTR.
ManHunter (28.07.2017 в 08:37):
Действительно, а я раньше не обращал внимание. Поищу, может что удастся нарыть.
Grey (27.07.2017 в 23:37):
szInValue       du      'String from FASM',0
больше 16 символов не ест, невкурсе в чем дело?
ManHunter (03.02.2017 в 15:02):
Кстати, можно обойтись и без компилятора ресурсов. Например, в данных:

szUrl du 'res://filename.exe/777',0

В ресурсах эта канитель описывается следующим образом:

  directory RT_HTML,htmls
  resource htmls,\
           777,LANG_NEUTRAL,htmlpage

И затем практически чистоганом лепим текст странички:

resdata htmlpage
db '<html>'
db '<b>Hello!</b>'
db '</html>'
endres

или, если файл большой, то его можно просто заинклудить

resdata htmlpage
file 'htmlpage.html'
endres
Grey (21.06.2016 в 09:47):
Есть в винде библиотека FM20.dll которая в которой есть объект UserForm VBA. Подскажи пожалуйста можно ли чисто гипотетически вызвать ВБАшную сохраненную форму из ресурсов, например функцией FormsOpenParentUnit и налепить экзешников из своих утилит под эксель, или микософ закрыл все такие возможности. У самого мозгов не хватает.
Dolphin (12.05.2015 в 13:42):
Спасибо большое за информацию, очень помогла при прохождении CTF...
Grey (12.12.2013 в 14:36):
Еще раз отдельное спасибо. Сегодня "закатал" еще одну утилитку, выглядит солиднее чем *.hta
Grey (29.05.2013 в 16:04):
ясно. спасибо
ManHunter (29.05.2013 в 15:51):
"их" - это кого? Если html-страничка находится в ресурсах исполняемого файла, который потом обработан упаковщиком, и затем она вызывается из этого же упакованного файла, то она должна открыться. Хотя в моей практике были жалобы на Eval Javascript Unpacker, который я сперва выкладывал в сжатом виде. Там тоже в ресурсах хранилась html-страничка со скриптами. Ошибку я так и не смог воспроизвести, но файл пришлось все-таки заменить на неупакованный. Так что лучше, имхо, ресурсы не паковать.
Grey (29.05.2013 в 15:44):
ShowHTMLDialog будет их открывать без дополнительных плясок?
ManHunter (29.05.2013 в 13:45):
upx file.exe
Grey (29.05.2013 в 13:44):
Еще вопрос. Пишешь, что: "Поддерживаются упакованные и зашифрованные файлы", не могбы привести тот же пример только с упакованным html?
Grey (28.05.2013 в 15:06):
Спасибо.
ManHunter (28.05.2013 в 14:09):
Почитай, пригодится как вариант решения.
http://ru.wikipedia.org/wiki/Data:_URL
А так все делается через внешние файлы.
Grey (28.05.2013 в 14:08):
Попробовал впихнуть картинку в html <img src="res:///111.png"> из ресурса. Не отображается. Это реально?
ManHunter (07.08.2012 в 14:51):
Электронные книги на ассемблере не пишут.
Анатолий. (07.08.2012 в 14:48):
Здравствуйте!

Если у вас будет время и\или желание, не могли бы вы показать пример простой электронной книги. Я видел в сети некоторые на высокоуровневых языках, но у них одна болезнь: если есть ссылка на другой сайт, она открывается в окне Internet Explorer , а не в самой книге.

P.S.  Спасибо за ваш сайт , очень информативно. И что более понравилось, здесь не только кодинг, но и другие интересные статьи
Дмитрий (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-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0036 сек.) / Память: 4.5 Mb
Наверх