Диалоговые окна из html-файлов на Ассемблере
Использование html-файлов для создания диалоговых окон применяется чаще всего в качестве сплэш-скринов разных триальных защит (первое, что приходит на память - протектор Armadillo и wrapper'ы от различных игровых дистрибьюторов) или в некоторых "демонстрашках", использующих графические эффекты. Плюсов тут много: вместо кропотливой низкоуровневой обработки шрифтов и цветных символов, визуальных эффектов и картинок, достаточно все это описать обычным CSS и HTML-тегами в HTML-странице, а с помощью скриптов JavaScript добавить нужную интерактивность. Кроме этого можно вынести из основного программного кода часть каких-нибудь зубодробильных вычислений на JavaScript, а потом передать результат основному приложению. У меня, например, по такому принципу написана новая версия Eval JavaScript Unpacker.Для создания окна сперва надо определить в сегменте данных некоторые значения. Главные из них - имя HTML-файла и параметры открываемого окна.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- szRes du 'res://',0
- lenRes = $-szRes-2
- szName du '/htmldialog.html',0 ; Имя html-файла в ресурсах
- szParam du 'dialogWidth:350px;dialogHeight:200px;help:off;',0
- hMoniker dd ? ; Хэндл моникера
- szUrl rb 200h ; Путь к основному файлу
Для создания окна сперва надо определить полный путь до html-файла и создать из него системный моникер функцей CreateURLMoniker. Моникер - это специальная метка, которая используется для подключения к COM-объектам. Здесь есть несколько особенностей. Если используется внешний файл, надо указывать полный путь до него. Если же HTML-файл хранится в ресурсах исполняемого файла, то к путь к нему формируется по схеме "res://" + полный путь до исполняемого файла + "/" + имя html-файла. Напомню, что все пути к HTML-файлу должны быть в юникоде. Поддерживаются упакованные и зашифрованные файлы, в которых ресурсы также упакованы. Идентификатор файла в ресурсах обязательно должен быть строковым, а не числовым. FASM не позволяет использовать строки в качестве идентификаторов в ресурсах, поэтому приходится подключать внешние файлы ресурсов, предварительно откомпилировав их. После того, как моникер создан, можно открывать диалоговое окно функцией ShowHTMLDialog. Простейший код приведен ниже.
Code (Assembler) : Убрать нумерацию
- ...
- ; Создать системный моникер
- invoke CreateURLMoniker,NULL,szUrl,hMoniker
- ; Создать диалог из html-файла
- invoke ShowHTMLDialog,NULL,[hMoniker],NULL,szParam,NULL
- ...
Теперь перейдем к самой интересной части - взаимодействию между основным приложением и окном из HTML-файла. По этой теме я не нашел никакой толковой документации, пришлось все изучать на живом коде под отладчиком. Поэтому все выкладки будут в основном теоретическими, и я не удивлюсь, если случайно изобрел велосипед. В параметрах функции ShowHTMLDialog передаются указатели на две структуры: данные, передаваемые HTML-окну и данные, передаваемые родительскому приложению после закрытия HTML-окна. Обе структуры имеют одинаковый формат:
Code (Assembler) : Убрать нумерацию
- ; Структура для взаимодействия с html-окном
- struct HTMLARGUMENT
- wType dw ? ; Тип передаваемого или получаемого аргумента
- wReserved dw ? ; 2 байта, зарезервировано
- dReserved dd ? ; 4 байта, зарезервировано
- lpArg dd ? ; Указатель на аргумент
- ends
Code (Assembler) : Убрать нумерацию
- VARTYPE_INTEGER = 3 ; Целое число
- VARTYPE_STRING = 8 ; Строка
- VARTYPE_ARRAY = 9 ; Массив
Code (JavaScript) : Убрать нумерацию
- //-------------------------------------------------------------------
- // Функция получения параметров от родительского приложения
- //-------------------------------------------------------------------
- function getArguments() {
- // Получить переданные параметры
- var tmp=window.dialogArguments;
- if (tmp!='') {
- alert('Переданы данные из основного приложения: '+tmp);
- }
- else {
- alert('Ничего не передано');
- }
- }
- //-------------------------------------------------------------------
- // Функция передачи параметров родительскому приложению
- //-------------------------------------------------------------------
- function setArguments(tmp) {
- // Установить параметры, передаваемые родительскому приложению
- window.returnValue = tmp;
- // Закрыть диалоговое окно
- window.close();
- }
Просмотров: 6871 | Комментариев: 28
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
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
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.
Время появится - попробую wType = BSTR.
ManHunter
(28.07.2017 в 08:37):
Действительно, а я раньше не обращал внимание. Поищу, может что удастся нарыть.
Grey
(27.07.2017 в 23:37):
szInValue du 'String from FASM',0
больше 16 символов не ест, невкурсе в чем дело?
больше 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
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
А так все делается через внешние файлы.
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. Спасибо за ваш сайт , очень информативно. И что более понравилось, здесь не только кодинг, но и другие интересные статьи
Если у вас будет время и\или желание, не могли бы вы показать пример простой электронной книги. Я видел в сети некоторые на высокоуровневых языках, но у них одна болезнь: если есть ссылка на другой сайт, она открывается в окне 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), открываю блокнотом - тоже никак не просмотреть! Конечно, можно узнать чем упаковано, потом распаковать, но, может, можно как-то зашифровать ресурс?
Вы писали: "даже из упакованных файлов можно извлечь содержимое 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
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
Добавить комментарий
Заполните форму для добавления комментария