Microteam
Осваивающий
- Сообщения
- 74
- Репутация
- 34
Всем привет! Всех с рождеством! Итак, мы сейчас с Вами напишем exe компилятор на autoit для выдуманного на ходу командного языка программирования Au3Comm. Описывать, я свой "язык программирования" тут не буду. Если Вам интересно, статью можете почитать тут: клац!
А мы с Вами начнём написание exe компилятора. Итак, мы конечно же можем, транслировать команды в машинный код, это будет будет работать быстрее самого AutoIt'a. Но, мы с Вами создадим свою среду времени Выполнения, а.к.а Runtime. Как это будет работать?
1. Мы создаем ядро runtime на autoit;
2. Читаем данные по сигнатуре(уникальной подписи, которую мы придумаем);
3. Выполняем.
Итак вот код нашего рантайма:
Как видите программа читает сама себя и ищет там сигнатуру(подпись), если сигнатура найдена, то считывает все данные после сигнатуры и исполняет. Для солидности: после компиляции меняем расширение с exe на bin.
А вот исходник компилятора:
Здесь алгоритм тоже очень прост, мы читаем файл a3cruntime.bin (скомпилированный код выше) и склеиваем с сигнатурой и самим исходником a3c скрипта. и сохраняем в exe файл. Вот и наша компиляция.
Теперь, если мы откроем наш скомпилированный a3c скрипт, то увидим, что наши сигнатура и исходник скрипта находятся в конце. Как видите, исходник наш видно и его можно без труда прочитать. Для исправления этого, используют так называемую "обфускацию". Сам исходник, в принципе шифруют и вставляют. А в рантайме пишут функцию, которая расшифровывает скрипт и исполняет, или же можно зашифровать файл алгоритмом RC4 и при запуске запрашивать пароль.
Сам язык Au3Comm конечно не круче самого AutoIt'a, но могу сказать, что он круче языка HQ9+ ;D
Вы можете скачать исходники тут: http://yadi.sk/d/F_HQjPpCFckHt
В примере присутствуют компилятор и интерпретатор.
А мы с Вами начнём написание exe компилятора. Итак, мы конечно же можем, транслировать команды в машинный код, это будет будет работать быстрее самого AutoIt'a. Но, мы с Вами создадим свою среду времени Выполнения, а.к.а Runtime. Как это будет работать?
1. Мы создаем ядро runtime на autoit;
2. Читаем данные по сигнатуре(уникальной подписи, которую мы придумаем);
3. Выполняем.
Итак вот код нашего рантайма:
Код:
#cs
Исходник времени выполнения Au3Comm
Au3Comm Runtime
#ce
Global $FilePath = @ScriptFullPath; в этой глобальной переменной будет храниться путь до выполняемого скрипта
Global $FileDir = @ScriptDir; в это переменной будет храниться папка из которой запущен скрипт
; Подключаем движок интерпретатора
#include "..\lib\engine.au3"
; Подключаем список команд и их обработчики
#include "..\lib\commands.au3"
; Подключаем сигнатуру нашего скрипта
#include "..\lib\signature.au3"
If Not @Compiled Then Exit
$script = FileRead(@ScriptFullPath) ; Читаем текущий файл
$sign_pos = StringInStr($script, $Signature) ; Узнаем позицию сигнатуры в нашем файле
; Если сигнатура не найдена, то начинаем быковать
If $sign_pos = 0 Then
MsgBox(16, "Au3Comm Runtime error", "Сигнатура не найдена");
Exit
EndIf
$source_pos = $sign_pos + $Signature_size ; узнаем с какого места начинается наш код.
; Если размер исполняемого файла больше чем позиция сигнатуры, быкуем. Потому-что быть такого не может
If $source_pos > FileGetSize(@ScriptFullPath) Then
MsgBox(16, "Au3Comm Runtime error", "Ошибка чтения кода")
Exit
EndIf
$script_source = StringMid($script, $source_pos) ; Читаем наш скрипт
ParseCode($script_source, $Commands); Выполняем его
А вот исходник компилятора:
Код:
#NoTrayIcon
#include<File.au3>
; Подключаем файл с сигнатурой
#include "lib\signature.au3"
If Not FileExists(@ScriptDir&"\runtime\a3cruntime.bin") Then
MsgBox(48, "Ошибка компиляции", "Не могу найти файл a3cruntime.bin")
Exit
EndIf
$Runtime = FileRead(@ScriptDir&"\runtime\a3cruntime.bin"); Читаем наш рантайм
Global $ScriptFile = FileOpenDialog("Au3Comm скрипт", @ScriptDir, "Скрипт Au3Comm (*.a3c)|Все файлы (*.*)")
If Not $ScriptFile Then Exit
$ScriptSource = FileRead($ScriptFile); ЧИтаем наш скрипт
Local $szDrive, $szDir, $szFName, $szExt
_PathSplit($ScriptFile, $szDrive, $szDir, $szFName, $szExt)
$OutFile_Name = $szFName&'.exe'; Формируем название exeшника из названия файла a3c
$OutFile_Path = $szDrive&$szDir&$OutFile_Name; Формируем путь сохранения файла
$OutFile_Out = $Runtime & $Signature & $ScriptSource ; Собираем наш exe файл склеивая рантайм сигнатуру и сам скрипт
FileWrite($OutFile_Path, $OutFile_Out) ; Записываем наш exe файл
If @error = 0 Then
MsgBox(64, "Au3Comm Compiller", 'Файл "'&$szFName&$szExt&'" успешно скомпилирован!');
Else
MsgBox(48, "Au3Comm Compiller" , "Ошибка компиляции файла!")
EndIf
Теперь, если мы откроем наш скомпилированный a3c скрипт, то увидим, что наши сигнатура и исходник скрипта находятся в конце. Как видите, исходник наш видно и его можно без труда прочитать. Для исправления этого, используют так называемую "обфускацию". Сам исходник, в принципе шифруют и вставляют. А в рантайме пишут функцию, которая расшифровывает скрипт и исполняет, или же можно зашифровать файл алгоритмом RC4 и при запуске запрашивать пароль.
Сам язык Au3Comm конечно не круче самого AutoIt'a, но могу сказать, что он круче языка HQ9+ ;D
Вы можете скачать исходники тут: http://yadi.sk/d/F_HQjPpCFckHt
В примере присутствуют компилятор и интерпретатор.