Blog. Just Blog
Диалоговые окна из 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();
- }
Просмотров: 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), открываю блокнотом - тоже никак не просмотреть! Конечно, можно узнать чем упаковано, потом распаковать, но, может, можно как-то зашифровать ресурс?
Вы писали: "даже из упакованных файлов можно извлечь содержимое 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
Добавить комментарий
Заполните форму для добавления комментария
Пример программы с исходным текстом (FASM)