Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBScript/JScript/WSH/WMI/HTA
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
#1

Быстрая "распаковка" бинарного ресурса из HTA на основе ADO.Stream - VBScript/JScript/HTA

12.11.2013, 01:54. Просмотров 3498. Ответов 15
Метки нет (Все метки)

Предисловие.
HTA - HyperText Application.
Приложение с расширением .HTA, исходый код которого состоит из HTML/DHTML и одного из скриптовых языков - JScript/VBScript.
Вызывается на исполнение процессором mshta.exe (c:\windows\system32, c:\windows\SysWOW64)
http://www.cyberforum.ru/vbscript-wsh/thread1994857.html

Пример простейшего HTA с кнопкой

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<head>
  <title>DEMO HTA Project</title>
 
  <HTA:APPLICATION
    APPLICATIONNAME="Example Application"
    ID="objHTA"
  />
 
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
 
<script language="VBScript">
 
Sub Window_onLoad()
    'Фокус на окно
    self.Focus()
    'Изменение размера окна
    x=400: y=200
    window.resizeTo x, y
    'Центрирование
    window.moveTo (screen.availWidth / 2) - (x / 2), (screen.availHeight / 2) - (y / 2)
End Sub
 
Sub StartMSG()
    Msgbox "Мое первое HTA приложение."
End Sub
 
</script>
 
<html>
  <body style="background-color: darkblue; color: white;">
    <td style="vertical-align: top; width: 400px; text-align: center;">
        <button onclick="StartMSG" style="border-color: green; font-weight: bold; background-color: yellow; width: 120px; height: 50px; margin-left: 10px; font-size: 10pt; text-align: center;">Вывести<br>сообщение</button><br>
    </td>
  </body>
</html>


Расшифровка свойств окна HTA: http://www.script-coding.com/HTA.html
Справка по специфическим контролам:
1. http://technet.microsoft.com/en-us/library/ee692768.aspx
2. http://technet.microsoft.com/ru-RU/library/ee692769.aspx


Недавно мы проводили эксперименты с FraidZZ-ом на счет возможностей присоединения ёмкого ресурса (~ 15 Мб.) в конец HTA-файла.

При этом начало и конец ресурса сопровождались знаками комментария:
HTML5
1
2
3
<!--
  Ресурс
//-->
Как выяснилось, HTA легко загружается в память, но некоторые файлы внутри него, как например, архив WinRAR,
часто содержит в своей бинарной структуре знак окончания комментария //-->, что неминуемо вызывает падение скрипта от переполнения памяти.

В этой теме:
- предлагаем готовые реализации. Они ведь есть, но для меня это все в новинку. И нет времени искать.
- предлагаем свои алгоритмы.
- помогаем мне с реализацией моего алгортма. (FraidZZ - будет время - поможешь?)

Итак мой алгоритм заключается в 2 вариантах:

Пока просьба помочь составить из кусков рабочий вариант 1-го (упаковщик/распаковщик):

Способ 1. Простой.
Упаковка всех ресурсов в один архив и кодирование в формат Base64.

Код 1.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
'
' Call via cmd: cscript ReadFileEncodeBase64DecodeBase64WriteFile.vbs [pathToFile]
'
' - Reads file from arg into byte array
' - Encodes byte array to Base64 String
' - Decodes Base64 String to byte array
' - Writes byte array to new file
'
' Sample WITHOUT any warrenty! Use at own risk! Copyright 2008 Gerhard Balthasar
'
  
Option Explicit
' common consts
Const TypeBinary = 1
Const ForReading = 1, ForWriting = 2, ForAppending = 8
  
' getting file from args (no checks!)
Dim arguments, inFile, outFile
  
Set arguments = WScript.Arguments
inFile = arguments(0)
outFile = "new_" & inFile
  
Dim inByteArray, base64Encoded, base64Decoded, outByteArray
 
inByteArray = readBytes(inFile)
base64Encoded = encodeBase64(inByteArray)
  
Wscript.echo "Base64 encoded: " + base64Encoded
  
base64Decoded = decodeBase64(base64Encoded)
writeBytes outFile, base64Decoded
  
Wscript.echo "Finished!"
  
private function readBytes(file)
  dim inStream
  ' ADODB stream object used
  set inStream = WScript.CreateObject("ADODB.Stream")
  ' open with no arguments makes the stream an empty container 
  inStream.Open
  inStream.type= TypeBinary
  inStream.LoadFromFile(file)
  readBytes = inStream.Read()
end function
  
private function encodeBase64(bytes)
  dim DM, EL
  Set DM = CreateObject("Microsoft.XMLDOM")
  ' Create temporary node with Base64 data type
  Set EL = DM.createElement("tmp")
  EL.DataType = "bin.base64"
  ' Set bytes, get encoded String
  EL.NodeTypedValue = bytes
  encodeBase64 = EL.Text
end function
  
private function decodeBase64(base64)
  dim DM, EL
  Set DM = CreateObject("Microsoft.XMLDOM")
  ' Create temporary node with Base64 data type
  Set EL = DM.createElement("tmp")
  EL.DataType = "bin.base64"
  ' Set encoded String, get bytes
  EL.Text = base64
  decodeBase64 = EL.NodeTypedValue
end function
  
private Sub writeBytes(file, bytes)
  Dim binaryStream
  Set binaryStream = CreateObject("ADODB.Stream")
  binaryStream.Type = TypeBinary
  'Open the stream and write binary data
  binaryStream.Open
  binaryStream.Write bytes
  'Save binary data to disk
  binaryStream.SaveToFile file, ForWriting
End Sub


Код 2.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
base64.vbs
Function Base64Encode(sText)
    Dim oXML, oNode
 
    Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
    Set oNode = oXML.CreateElement("base64")
    oNode.dataType = "bin.base64"
    oNode.nodeTypedValue =Stream_StringToBinary(sText)
    Base64Encode = oNode.text
    Set oNode = Nothing
    Set oXML = Nothing
End Function
 
Function Base64Decode(ByVal vCode)
    Dim oXML, oNode
 
    Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
    Set oNode = oXML.CreateElement("base64")
    oNode.dataType = "bin.base64"
    oNode.text = vCode
    Base64Decode = Stream_BinaryToString(oNode.nodeTypedValue)
    Set oNode = Nothing
    Set oXML = Nothing
End Function
 
'Stream_StringToBinary Function
'2003 Antonin Foller, [url]http://www.motobit.com[/url]
'Text - string parameter To convert To binary data
Function Stream_StringToBinary(Text)
  Const adTypeText = 2
  Const adTypeBinary = 1
 
  'Create Stream object
  Dim BinaryStream 'As New Stream
  Set BinaryStream = CreateObject("ADODB.Stream")
 
  'Specify stream type - we want To save text/string data.
  BinaryStream.Type = adTypeText
 
  'Specify charset For the source text (unicode) data.
  BinaryStream.CharSet = "us-ascii"
 
  'Open the stream And write text/string data To the object
  BinaryStream.Open
  BinaryStream.WriteText Text
 
  'Change stream type To binary
  BinaryStream.Position = 0
  BinaryStream.Type = adTypeBinary
 
  'Ignore first two bytes - sign of
  BinaryStream.Position = 0
 
  'Open the stream And get binary data from the object
  Stream_StringToBinary = BinaryStream.Read
 
  Set BinaryStream = Nothing
End Function
 
'Stream_BinaryToString Function
'2003 Antonin Foller, [url]http://www.motobit.com[/url]
'Binary - VT_UI1 | VT_ARRAY data To convert To a string 
Function Stream_BinaryToString(Binary)
  Const adTypeText = 2
  Const adTypeBinary = 1
 
  'Create Stream object
  Dim BinaryStream 'As New Stream
  Set BinaryStream = CreateObject("ADODB.Stream")
 
  'Specify stream type - we want To save binary data.
  BinaryStream.Type = adTypeBinary
 
  'Open the stream And write binary data To the object
  BinaryStream.Open
  BinaryStream.Write Binary
 
  'Change stream type To text/string
  BinaryStream.Position = 0
  BinaryStream.Type = adTypeText
 
  'Specify charset For the output text (unicode) data.
  BinaryStream.CharSet = "us-ascii"
 
  'Open the stream And get text/string data from the object
  Stream_BinaryToString = BinaryStream.ReadText
  Set BinaryStream = Nothing
End Function


А этот на закуску (напишем, когда найдется свободное время):

Способ 2. Сложный.
Поиск закрывающих комментариев среди всех подключаемых ресурсов
и их подмена с записью в массив исключений по порядковому номеру байта.

Кликните здесь для просмотра всего текста

Смысл заключается в том, что длина ресурса не увеличится,
а упаковка в архив для меня неприемлема в силу некой специфики проекта.

Итак, все по порядку:

а) Упаковщик


Код чтения в байтовый массив... записи обратно в двоичный файл.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sub main(SourceFile, DestFile, sFilter)
    With CreateObject("ADODB.Stream")
                 ' Читаем в Stream
        .Type = 1 'adTypeBinary
        .Open
        .LoadFromFile SourceFile
                ' Создаем массив Char
        varByteArray = .Read()
        .Close
 
                ' Преобразовуем в строку (см.ниже)
        sText = ByteArray2Text(varByteArray)
                ' Здесь делаем любые преобразования
                ' ...
 
                ' Пишем снова в файл
        .Open
        .Type = 2 'adTypeText
        .CharSet = "us-ascii"
        .WriteText sText
        .SaveToFile DestFile, 2 'adSaveCreateOverWrite
        .Close
    End with
end sub
Код выше зависит от функции быстрого преобразования массива Char в строку
через рекордсет (грубо говоря - некое подобие StringBuilder-a):

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function ByteArray2Text(varByteArray)
'Convert byte array into a string with ADODB.Recordset
Dim rs
Const adLongVarChar = 201
    Set rs = CreateObject("ADODB.Recordset")
    rs.Fields.Append "temp", adLongVarChar, LenB(varByteArray)
    rs.Open
    rs.AddNew
    rs("temp").AppendChunk varByteArray
    rs.Update
    ByteArray2Text = rs("temp")
    rs.Close
    Set rs = Nothing
End Function


Получили строку. Теперь в ней ищем последовательность //--> и заменяем на //--<
Visual Basic
1
2
3
4
5
6
7
pos = instr(sText, "//-->")
Do while pos
  'Здесь записываем позицию pos+4 в массив исключений
  '...
  'Сканируем строку дальше
  pos = instr(pos+1, sText, "//-->")
Loop
Итак файл прочитан. Можно дописывать ресурс к HTA.

1) Формируем хидер:
1-я строка:
_RESOURCE_FILE: "ID=1" "Filename.ext" "Кол-во байт файла" "А здесь можно даже быструю чексумму написать, например сумму Char-ов"
2-я строка:
EXCLUDE: "7,100,156,258, .... и.т.д. - все позиции подмененных байт"
3-я строка:
Сам бинарный файл в модифицированном виде.

Это пример для 1-го файла.
Для нескольких файлов следует предусмотреть начальное сканирование относительной структуры подкаталогов,
и внесение этой структуры перед хидером с присвоением каждому файлу своего уникального идентификатора,
например:
_RESOURSE_DIRECTORY_STRUCTURE: "IDs=кол-во ID"
ID:1 "Tools\FAQ.txt"
ID:2 "Tools\calc.exe"
ID:3 "My Doc.doc"


б) Распаковщик:


Распаковку организуем методом копирования потоков.

1. Считываем весь файл в объект Stream.
2. Преобразовуем в строку.
3. Ищем секцию _RESOURSE_DIRECTORY_STRUCTURE
4. Читаем ее до первого vbCr
5. Читаем кол-во ID.
6. Читаем все ID и записываем соответсвие ID <-> относительное расположение
7. Переходим к смещению _RESOURCE_FILE
8. Считываем размер бинарного файла.
9. Устанавливаем начальную позиция рекордсета в номер 1-го байта ресурса,
а конечную в тек.+размер.
10. Копируем один поток в другой (вот пример).
11. Записываем поток № 2 в файл. И идем по кругу.

++ Алгоритм может быть ускорен, если удалить этап преобразования в строку.
Для этого нужно "сообразить" алгоритм поиска последовательности байт в Char-овском массиве.



Одному мне кажется, что я изобрел велосипед?
А ведь как хочется реализовать такую сложную штучку =))))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2013, 01:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос HTA Быстрая "распаковка" бинарного ресурса из HTA на основе ADO.Stream (VBScript/JScript):

HTA (Jscript) быстрая загрузка и выгрузка данных из txt?
Технология старая, но только она доступа, HTA-приложение на Jscript (windows)....

Использование ADO в HTA-приложении
Здравствуйте! Мне нужно HTA-приложение, отображающее с помощью ADO данные из...

HTA: не работает атрибут windowstate в теге <hta:application>
какое бы значение этому атрибуту не присваивал (normal |minimize | maximize),...

Хочу обсудить недавно "обнаруженную" "уязвимость" процессоров Intel и не только
Наверное, эту тему уже много где обсуждали. Возможно, я ошибся разделом - но,...

Как скачать с сайта все изображения с графиками "5" и "d"?
Здравствуйте, подскажите как скачать картинки из этого сайта, нужны 5 и D...

15
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
12.11.2013, 01:57  [ТС] #2
Цитата Сообщение от Dragokas Посмотреть сообщение
Упаковка всех ресурсов в один архив
Здесь только один тонкий момент.
Если перед кодированием упаковать все в архив, то по условиям задачи, программы распаковки у нас нет.
Можно, конечно использовать нативную (но она мне как-то не по душе):

Кликните здесь для просмотра всего текста

И еще пару тем:
http://www.cyberforum.ru/visual-basic/thread987773.html
http://www.cyberforum.ru/visual-basic/thread771976.html
http://www.cyberforum.ru/visual-basic/thread867497.html

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
'/// Класс создания ZIP-файла средствами Windows
'/// Автор: ALX_2002
 
'/// Пример работы с классом 
Set FileSytemObject = CreateObject("Scripting.FileSystemObject") 
 
'/// Получаем путь до каталога в котором находимся 
ParentFolderName = FileSytemObject.GetParentFolderName(Wscript.ScriptFullName) 
 
'/// Строим путь для создания тестового файла 
SourceFilePath = FileSytemObject.BuildPath(ParentFolderName,"Текстовый документ.txt") 
 
'/// Создаём и заполняем файл содержимым 
FileSytemObject.OpenTextFile(SourceFilePath,2,True).write "Содержимое файла" 
 
'/// Создаём архив 
DestFilePath = FileSytemObject.BuildPath(ParentFolderName,"1.zip") 
 
'/// Создаём класс создания ZIP файла 
Set Zip = New ZipClass 
 
'/// Открываем новый архив 
Zip.CreateArchive DestFilePath 
'/// Добавляем файл в архив 
Zip.CopyFileToArchive SourceFilePath 
'/// Закрываем архив 
Zip.CloseArchive 
 
MsgBox "Архив создан",vbInformation,"ZipClass" 
 
 
'/// Код класса 
Class ZipClass 
        Private Shell 
 
        Private FileSystemObject 
 
        Private ArchiveFolder 
 
        Private ItemsCount 
        
        Private Sub Class_Initialize() 
            Set Shell = CreateObject("Shell.Application") 
            Set FileSystemObject = CreateObject("Scripting.FileSystemObject") 
        End Sub 
 
        Function CreateArchive(ZipArchivePath) 
 
            If UCase(FileSystemObject.GetExtensionName(ZipArchivePath)) <> "ZIP" Then 
                Exit Function 
            End If 
            
            Dim ZipFileHeader 
            
            ZipFileHeader = "PK" & Chr(5) & Chr(6) & String(18, 0) 
            
            FileSystemObject.OpenTextFile(ZipArchivePath, 2, True).Write ZipFileHeader 
            
            Set ArchiveFolder = Shell.NameSpace(ZipArchivePath) 
        
                if Not (ArchiveFolder is Nothing) Then CreateArchive = True 
        End Function 
 
        Function CopyFileToArchive(FilePath) 
                if (ArchiveFolder is Nothing) Then Exit Function 
            ArchiveFolder.CopyHere FilePath 
                ItemsCount = ItemsCount + 1 
        End Function 
 
        Function CopyFolderToArchive(FolderPath) 
                if (ArchiveFolder is Nothing) Then Exit Function 
            ArchiveFolder.CopyHere FolderPath 
                ItemsCount = ItemsCount + 1 
        End Function 
 
        Function CloseArchive 
                if (ArchiveFolder is Nothing) Then Exit Function 
                Set WsriptShell = CreateObject("Wscript.Shell") 
      if IsObject(Wscript) Then 
         Do 
            Wscript.Sleep 100 
                    Loop Until ArchiveFolder.Items.Count => ItemsCount 
      Else 
         ServerSleep 
      End if 
           ItemsCount = 0 
        End Function 
 
   Private Function ServerSleep 
                Set WsriptShell = CreateObject("Wscript.Shell") 
      Do 
         WsriptShell.Popup "",1,"" 
                Loop Until ArchiveFolder.Items.Count => ItemsCount 
   End Function 
 
        Function MoveFileToArchive(FilePath) 
                if (ArchiveFolder is Nothing) Then Exit Function 
            ArchiveFolder.MoveHere FilePath 
        End Function 
End Class
0
Вложения
Тип файла: zip ParseNULL.zip (8.2 Кб, 11 просмотров)
Тип файла: zip Example.HTA.zip (757 байт, 13 просмотров)
Тип файла: zip Base64.zip (1.8 Кб, 12 просмотров)
Тип файла: zip ZIPClass.zip (1.1 Кб, 13 просмотров)
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
12.11.2013, 02:45  [ТС] #3
Что-то я посмотрел на табличку теста скорости и немного разочаровался в варианте № 1
http://www.motobit.com/tips/detpg_Base64Encode/

Может, стоит сразу пересмотреть язык реализации...

Добавлено через 39 минут
Короче.
Вариант № 2.
Структура "HTA+Ресурс" по-проще:

Код
[Тело HTA]
[Бинарные файлы, идущие друг за другом впритык (в порядке, указанном в секции ниже)]
[Расположение файлов] - например: "относительный путь\имя файла" "Размер в байтах"
[Последние 10 байт - размер секции "Расположение файлов" в байтах]
Какая вероятность, что антивирусы начнут "материться" на этот "упакованный" файл?
FraidZZ - I need help - нужна реализация AutoIT-распаковщика указанного формата файла. С VBS то я справлюсь.
0
Eva Rosalene
Male-to-Female
4049 / 1586 / 301
Регистрация: 06.01.2013
Сообщений: 4,176
Завершенные тесты: 2
12.11.2013, 14:38 #4
Цитата Сообщение от Dragokas Посмотреть сообщение
нужна реализация AutoIT-распаковщика
Спецификацию формата подкинешь? А то меня в гугле забанили ничего дельного найти не смог. Можно, конечно, нечто свое слепить, но смысла изобретеать велосипед не вижу.
1
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
12.11.2013, 16:28  [ТС] #5
Я тоже не нашел плохо искал, поэтому придумал свое.
Более подробное описание и пример файла скину позже.
2
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
12.11.2013, 21:16 #6
Я как-то искал. Нарыл следующее:
- на хабре http://habrahabr.ru/post/132876/
- на скрипт-кодинг http://forum.script-coding.com/viewtopic.php?id=5880
1
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
12.11.2013, 21:38  [ТС] #7
Smitis, видел. К сожалению, это не то.
Те же грабли. 1) Base64 (и то 10 Кб рекомендуют).
2) хранение картинки, а если встретиться знак комментария, HTA не запустится.
1
Smitis
1628 / 337 / 39
Регистрация: 15.10.2012
Сообщений: 529
12.11.2013, 22:04 #8
Я тогда исходил из принципа - если можно картинку хранить, значит можно и другие бинарные данные. Но разбираться не было времени (сейчас файлы так и валяются отдельно от hta).

Но мне кажется, хранить в hta бинарные незакодированные файлы не стоит.
Если base64 такой медленный, может, например, в hex-виде? (да, увеличение объёма данных в два раза, но если это компенсируется скорость...)
1
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
12.11.2013, 22:45  [ТС] #9
Я ресурсы упаковую в HTA.
А HTA -> в ZIP.

Цель - возможность запуска утилиты прямо из архива, поэтому дополнительное уплотнение не требуется.
Увеличение объема ресурсов - тоже не айс.

Поэтому свой алгоритм преданализа бинарных файлов и замена в них вероятных знаков завершающих комментариев на другой символ считаю наиболее быстрым и оптимальным.

Что же. Сегодня можно и позаниматься реализацией.

Добавлено через 36 минут
Итак, спецификация формата ресурса:

Код
[HTA]<!--[Modified Binary][Unpacked Files Structure][Size of Structure Block]//-->
1) HTA
Стандартный файл формата HTA.

2) <!--
Знак начала комментария.

3) [Modified Binary]
Бинарные файлы, которые идут подряд друг за другом без разделителей.
В них предварительно проводится скан последовательности сиволов //-->
И если найдена, то символ > заменяется на <
Позиция от начала файла замененного байта запоминается в массив и записывается в блок [Unpacked Files Structure] - см.ниже.

3) [Unpacked Files Structure]
Оригинальное расположение файлов + <TAB> + размер в байтах + <;> + массив позиций замененных байт (через <,>) + <Lf>.
Одна строка - 1 файл.
Путь указывается относительным.
Порядок строк соответствует порядку бинарных файлов, "склеянных" в ресурс HTA.
Пример:
manual\document.doc 38654;168,13877,34441

4) [Size of Structure Block]
Размер блока [Unpacked Files Structure] в байтах.
Этот блок должен занимать ровно 10 байт, если это не так, в его конец дописываются пробелы.

5) //-->
Знак завершения комментария
1
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
14.11.2013, 03:22  [ТС] #10
Упаковщик готов.
Осталось совсем немного.

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<HTML><HEAD><TITLE>Resource Packer Project</TITLE>
<HTA:APPLICATION id=objHTA 
APPLICATIONNAME="Example Application" />
<META content="text/html; charset=windows-1251" http-equiv=Content-Type>
<SCRIPT language=VBScript>
 
Option Explicit
 
Dim HTA: HTA = location.pathname
Dim HTA_Path: HTA_Path = Left(HTA,InStrRev(HTA,"\"))
Dim HTA_Name: HTA_Name = Mid(HTA,instrrev(HTA,"\") + 1)
 
Dim oFSO:   Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim oShell: Set oShell = CreateObject("WScript.Shell")
Dim oShap:  Set oShap = CreateObject("Shell.Application")
 
'////// RESOURCE PACKER-UNPACKER
'Key - "Path\Name.ext"
'Value - Size, Array of Exclude bytes position
Dim oDictFiles: Set oDictFiles = CreateObject("Scripting.Dictionary")
 
Const CommentEND = "//-->"
Dim ArrReplacerByte, ArrOriginalByte 'Byte "<" and Byte ">"
Dim MainStream
'//////
 
Sub Window_onLoad()
    'Фокус на окно
    self.Focus()
    'Изменение размера окна
    Dim x, y: x=400: y=250
    window.resizeTo x, y
    'Центрирование
    window.moveTo (screen.availWidth / 2) - (x / 2), (screen.availHeight / 2) - (y / 2)
End Sub
 
 
Sub ScanFolderToResource(oFolder)
    Dim oFiles: Set oFiles = oFolder.Files
    If oFolder.Attributes >= 1024 Then Exit Sub
 
    Dim oFile, RelativePath
    For Each oFile in oFiles
        if StrComp(oFile.Path, HTA, vbTextCompare) <> 0 then
            RelativePath = Mid(oFile.Path, len(HTA_Path) + 1)
            oDictFiles.Add RelativePath, oFile.Size & ";"
            AddFileToResource oFile.Path, RelativePath
        end if
    Next
 
    Dim oFolders: Set oFolders = oFolder.SubFolders
    Dim oSubFolder
    For Each oSubFolder in oFolders
        ScanFolderToResource oSubFolder
    Next
End Sub
 
Sub AddFileToResource(sPath, RelativePath)
    With CreateObject("ADODB.Stream")
        .Type = 1: .Open: .LoadFromFile sPath
        if .Size >= 5 then
            Dim varStr: varStr = ByteArrayToString(.Read())
    
            'Ищем в строке последовательность закрывающего комментария
            Dim ThereWasExcludes: Dim pos: pos = 0
            Do
                pos = instr(pos + 1, varStr, CommentEND)
                if pos then
                    'Нашли: заменяем символ > на <
                    oDictFiles(RelativePath) = oDictFiles(RelativePath) & (pos + 3) & ","
                    .Position = (pos + 3): ThereWasExcludes = true
                    .Write ArrReplacerByte
                end if
            Loop While pos
            if ThereWasExcludes then oDictFiles(RelativePath) = Left(oDictFiles(RelativePath), Len(oDictFiles(RelativePath)) - 1)
        end if
    
        'Устанавливаем позицию курсора главного потока в конец и копируем в него содержимое текущего потока
        MainStream.Position = MainStream.Size
        .Position = 0: .Flush: .CopyTo MainStream: .Close
    End With
End Sub
 
Function ByteArrayToString(varByteArray)
    Dim rs: Set rs = CreateObject("ADODB.Recordset")
    rs.Fields.Append "temp", 201, LenB(varByteArray) 'adLongVarChar
    rs.Open
    rs.AddNew
    rs("temp").AppendChunk varByteArray
    rs.Update
    ByteArrayToString = rs("temp")
    rs.Close: Set rs = Nothing
End Function
 
Function StringToByteArray(sText)
    Dim BS: Set BS = CreateObject("ADODB.Stream")
    BS.Type = 1 'adTypeBinary
    BS.Open
    Dim TS: Set TS = CreateObject("ADODB.Stream")
    With TS
        .Type = 2: .Open: .Charset = "windows-1251": .WriteText sText: .Position = 0: .CopyTo BS: .Close
    End With
    BS.Position = 0: StringToByteArray = BS.Read()
    BS.Close: Set BS = Nothing: Set TS = Nothing
End Function
 
Sub Res_Pack()
    Set MainStream = CreateObject("ADODB.Stream")
    With MainStream
        .Type = 1: .Open: .LoadFromFile HTA: .Position = .Size: .Write StringToByteArray("<!--")
    End With
 
    ArrReplacerByte = StringToByteArray("<")
    Dim Root: Set Root = oFSO.GetFolder(HTA_Path)
    ScanFolderToResource Root
    Set Root = Nothing
    
    Dim sFileStruct, sPath
    For Each sPath in oDictFiles.Keys
        sFileStruct = sFileStruct & sPath & vbTab & oDictFiles(sPath) & vbLf
    Next
 
    With MainStream
        .Write StringToByteArray(sFileStruct & Left(Len(sFileStruct) & "         ",10) & CommentEND)
        .SaveToFile HTA & "_", 2: .Close
    End With
    Set MainStream = Nothing
End Sub
 
Sub Res_UnPack()
    Msgbox Chk_DeleteFiles.Checked
End Sub
 
</SCRIPT>
 
<BODY style="COLOR: white; BACKGROUND-COLOR: darkblue"><TD style="VERTICAL-ALIGN: top; TEXT-ALIGN: center; WIDTH: 400px">
<P align=center><BUTTON onclick="Res_Pack" 
style="FONT-SIZE: 10pt; HEIGHT: 50px; BORDER-TOP-COLOR: green; FONT-WEIGHT: bold; BORDER-BOTTOM-COLOR: green; TEXT-ALIGN: center; MARGIN-LEFT: 10px; BORDER-RIGHT-COLOR: green; WIDTH: 249px; BACKGROUND-COLOR: yellow; BORDER-LEFT-COLOR: green">
<DIV align=center>Упаковать в ресурс<BR>все файлы/папки рядом с HTA</DIV></BUTTON></P>
<P align=center><INPUT class="c" type=checkbox ID="Chk_DeleteFiles">
Удалить файлы после упаковки</P>
<P align=center><BUTTON onclick="Res_UnPack" 
style="FONT-SIZE: 10pt; HEIGHT: 50px; BORDER-TOP-COLOR: green; FONT-WEIGHT: bold; BORDER-BOTTOM-COLOR: green; TEXT-ALIGN: center; MARGIN-LEFT: 10px; BORDER-RIGHT-COLOR: green; WIDTH: 169px; BACKGROUND-COLOR: yellow; BORDER-LEFT-COLOR: green">
<DIV align=center>Распаковать ресурс</DIV></BUTTON></P></TD></BODY></HTML>
2
Вложения
Тип файла: zip Example.zip (2.3 Кб, 18 просмотров)
Eva Rosalene
14.11.2013, 08:21
  #11

Не по теме:

Круто...

0
Eva Rosalene
Male-to-Female
4049 / 1586 / 301
Регистрация: 06.01.2013
Сообщений: 4,176
Завершенные тесты: 2
15.11.2013, 23:09 #12
HTA в разработке...
AutoIT reader в предбоевом состоянии, но я не совсем просек все-равно ситуацию с --> в тексте файла
0
Eva Rosalene
Male-to-Female
4049 / 1586 / 301
Регистрация: 06.01.2013
Сообщений: 4,176
Завершенные тесты: 2
07.07.2015, 05:21 #13
Цитата Сообщение от Alex Dragokas' Blog
Быстрая "распаковка" бинарного ресурса из HTA на основе ADO.Stream [ 50% завершено ]
Dragokas, напомни, а мы разве не допилили это до конца? Вот мнится мне, что запускал я сию приблуду, полностью написанную, у себя на компе. Может, в ЛС стоит покопаться за тот период, не знаю.

Добавлено через 8 минут
Поискался. Кажись, он реально до конца не доведён. Хотя у меня что-то фурычило, это у тебя оно не завелось, кажись, причина так и не была найдена...)
0
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
07.07.2015, 12:27  [ТС] #14
Готов только упаковщик.

На распаковщик у меня не хватило времени его написать.
0
alexsamos33
617 / 597 / 326
Регистрация: 26.04.2014
Сообщений: 1,968
07.07.2015, 22:58 #15
Цитата Сообщение от Dragokas Посмотреть сообщение
- нужна реализация AutoIT-распаковщика указанного формата файла. С VBS то я справлюсь.
В AutoIt же есть функция FileInstall, так вот, можно все файлы засунуть в неё и всё...
Ещё можно создать SFX архив, например через WinRAR, и в конфигурации указать чтобы после разпоковки запускался скрипт, и уже в этот архив наложить файлов
Этот архив будет например распаковываться в %temp%, запускаться скрипт, а потом все данные из temp можно удалить...
0
Dragokas
Эксперт WindowsАвтор FAQ
16922 / 7007 / 851
Регистрация: 25.12.2011
Сообщений: 10,803
Записей в блоге: 16
08.07.2015, 14:50  [ТС] #16
FraidZZ поднял тему 2-х годовалой давности так что уже неактуально.
Эта тема нужна была для проекта ViruLogs, а сама по себе имеет только посредственную ценность.
Естественно, сторонними средствами это можно реализовать как угодно и намного проще.
Цель была "запихнуть" бинарный ресурс именно в файл формата .HTA
AutoIt здесь упоминался только ради промежуточных тестов. Ничего более.
0
08.07.2015, 14:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2015, 14:50
Привет! Вот еще темы с решениями:

Надо разобраться с терминами "установочный диск", "загрузочный диск" и прочая
То есть я хочу сделать такой диск: выбираю в биос &quot;загрузка с диска&quot;, после...

Как через Stream "разобрать" файл в одном месте и "собрать" в другом?
Пожалуйста, покажите как стримить файлы, например, у меня есть большой файл....

Распаковка "exe" файла в "au3" формат
Всем привет, помогите пожалуйста в распаковке файла. Не могу распокавать файл...

Как написать регулярное выражение для выдергивания английских букв и символов: "+", ",", ":", "-", " ", "!", "?" и "."
Не могу ни как собразить как написать регулярное выражение для выдергивания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru