Разное

Функции делфи: Урок 5 — Функции — The Delphi

Delphi World — Связывание функций

Связывание функций

Delphi содержит очень умный компоновщик, который исключает добавление функций без внешних ссылок в ваш конечный exe-файл.

Это действительно лучшее решение, чем то, которое предлагают (старые сведения, В.О.) все C-компоновщики, компонующие все функции данного модуля (кодового файла), если хотя бы на одну из них имеется внешняя ссылка.

…я тоже так хотел. Но одна из моих форм имела «uses dll_link», где dll_link являлся компонентом, который использовал dll. Хотя компонент и был удален из формы, программа сбоила, если на машине отсутствовала нужная DLL. Естественно, компоновщик удалил весь неиспользуемый код, но почему проблема осталась? Удаление «uses dll_link» решило проблему, и уменьшило размер exe на 100k. Очевидно, компоновщик не может это удалить сам.

Я так полагаю, что «умный» компоновщик («Smart Linking») недостаточно умен для удаления ссылок на модули, в которых нет функций со внешними ссылками.

Может, он делает это намеренно, но пока не ясно почему.

…я тоже задавался этим вопросом: почему, удаляя ссылки на ненужные мне модули, которые Delphi устанавливает по-умолчанию, размер выходного файла уменьшается — почему??? Что делает в это время умный оптимизатор — компилятор?

Я провел тест опции Delphi «Smart Linking» (умное связывание). Я создал пустое приложение, одно окно, ничего более. В обработчик события FormCreate я поместил две переменные и проинициализировал их: первая представляла собой строку, куда я поместил ‘Привет!’, вторая была Hwnd, куторой я присвоил дескриптор («handle»).

Я создал второй модуль. В этот модуль я включил ссылки на SysUtils, WinTypes и WinProcs. Я создал функцию с именем «This». «This» получает на входе два параметра: Hwnd и String. Она преобразует строку к типу C-строки, и вызывает MessageBox. Я захотел сделать так, чтобы функция «This» все-таки не была тривиальной (ну хорошо, она тривиальная).

Важным является то, что у меня в моей программе нет ни одного места, откуда бы я вызывал «This». В список модуля формы «uses» я поместил ссылку на второй модуль (где расположена функция «This»), но при этом функция «This» нигде не вызывается.

Я собрал приложение, и запомнил размер exe-файла.

Затем я создал обработчик события FormCreate. В нем я вызывал «This» с переменными, инициализированными ранее (строка и дескриптор окна).

Я собрал приложение, и запомнил размер exe-файла.

Во втором случае (с вызовом функции «This») exe-файл получился больше на 300 байт. Из этого следует, что неиспользуемые функции не линкуются к exe-файлу.

Опция «Optimize for size and load time» (оптимизировать для размера и времени загрузки) весьма отличается от опции «smart-linking» (умное связывание). Очевидно, большинство компоновщиков сами по себе являются «умными машинками». Их технологию работы сложно понять, и это является самым строгим секретом фирмы. Некоторые теоретические выкладки можно почерпнуть из статьи, напечатанной в журнале MicroSoft Systems Journal, Июль 1993, статья называется «Liposuction your Corpulent Executables and Remove Excess Fat».

Ее можно также найти на CD MSDN, если он у вас, конечно, имеется. По-крайней мере, в статье есть интересный раздел, посвященный технологии выравнивания («alignment»), которую можно сравнить с проблемой выбора размера кластера в момент создания раздела на диске. Эта технология позволяет сэкономить, или потерять свободное место на диске при большом количестве файлов. В вопросе оптимизации существует масса мелочей. Во всяком случае, «Optimize for size and load time» выполняет ту же работу, что и прорамма W8LOSS.EXE (расположенной в каталоге \Delphi\Bin) с вашим скомпилированным приложением.

Вам нужно помнить об одной вещи: если компоновщик настроен на «умное связывание», то он не будет запускать приложение чтобы посмотреть, используется ли функция/процедура, или нет. В этом случае он проверяет на «возможность» использования той или иной функции/процедуры. Я не проверял это, но, вероятно, даже в VCL наверняка существуют методы, которые включены в ее только потому, что существует «возможность» их применения, и они «тянутся» при компиляции в ваше приложение.

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

Типы не линкуются. Они используются только самим компилятором. Переменные «умным» компилятором не удаляются. Код, расположенный в секции initialization вызывается всегда. Процесс компиляции программ Delphi состоит из двух шагов: во-первых, компилируются все модули программы, после чего получаются двоичные промежуточные .DCU-файлы. Во-вторых, они полностью связываются все вместе и получается .EXE-файл. Во время второго шага удаляются любые функции/процедуры без внешних ссылок. Поэтому нет повода для беспокойства: ВСЕ функции, которые присутствуют в программе, будует помещены в .DCU-файл, и только те из них, которые реально используются, будут упакованы в EXE. Все будет работать именно так, как вы и ожидаете, нет никаких сюрпризов, в противном случае это связывание не будет ‘smart’ (умным), и эту опцию можно не включать.

49. Встроенные функции и процедуры для работы с массивами в Delphi

2) Функции массива:

Функция

Описание

Length

Число элементов массива

High

Наибольшее значение индекса

Low

Наименьшее значение индекса

3) Функции для числовых массивов:

Функция

Тип аргумента

Тип результата

Описание

MinIntValue

Array of integer

Integer

Возвращает минимальное значение элемента массива целых чисел

MaxInValue

Array of integer

Integer

Возвращает максимальное значение элемента массива целых чисел

MinValue

Array of double

Double

Возвращает минимальное значение элемента числового массива

MaxValue

Array of double

Double

Возвращает максимальное значение элемента числового массива

Sum

Array of double

Extended

Возвращает сумму элементов массива

Эти функции определены в модуле math и этот модуль должен подключаться оператором USES, чтобы компилятор их понимал.

50. Теоретические основы информатики: информатика как наука

Информатика — это фундаментальная естественная наука, изучающая процессы передачи и обработки информации. 

Источники информатики: документалистика (изучение средств и методов повышения эффективности документооборота) и кибернетика (наука об управлении).

Название «Информатика» – от французского Informatique= Informacion + Automatique (информация + автоматика).

Объект информатики – автоматизированные, основанные на ЭВМ и телекоммуникационной технике информационные системы.

Предмет информатики – информационный ресурс (его сущность, законы функционирования, механизмы взаимодействия с другими ресурсами общества и воздействия на социальный прогресс).

Как предмет информатики, информационный ресурс – это исследование информационных систем с двух сторон:

1) с формально-логической (информационной) — это развитие машинных языков, создание моделей представления знаний (фреймов), разработка информационных технологий;

2) с семантической (смысловой)- это развитие понимания процесса осознания чего – либо человеком.

В итоге закладываются основы искусственного интеллекта.

51. Информация и концепция её определения

Существование множества определений информации обусловлено сложностью, специфичностью и многообразием подходов к толкованию сущности этого понятия. Существуют 3 наиболее распространенные концепции информации, каждая из которых по-своему объясняет ее сущность.

Первая концепция (концепция К. Шеннона), отражая количественно-информационный подход, определяет информацию как меру неопределенности (энтропию) события. Количество информации в том или ином случае зависит от вероятности его получения: чем более вероятным является сообщение, тем меньше информации содержится в нем. Этот подход, хоть и не учитывает смысловую сторону информации, оказался весьма полезным в технике связи и вычислительной технике и послужил основой для измерения информации и оптимального кодирования сообщений. Кроме того, он представляется удобным для иллюстрации такого важного свойства информации, как новизна, неожиданность сообщений.

При таком понимании информация — это снятая неопределенность, или результат выбора из набора возможных альтернатив.

Вторая концепция рассматривает информацию как свойство материи. Ее появление связано с развитием кибернетики и основано на утверждении, что информацию содержат любые сообщения, воспринимаемые человеком или приборами. Наиболее ярко и образно эта концепция информации выражена академиком В.М. Глушковым. Он писал, что «информацию несут не только испещренные буквами листы книги или человеческая речь, но и солнечный свет, складки горного хребта, шум водопада, шелест травы».

То есть, информация как свойство материи создает представление о ее природе и структуре, упорядоченности и разнообразии. Она не может существовать вне материи, а значит, она существовала и будет существовать вечно, ее можно накапливать, хранить и перерабатывать.

Третья концепция основана на логико-семантическом подходе, при котором информация трактуется как знание, причем не любое знание, а та его часть, которая используется для ориентировки, для активного действия, для управления и самоуправления.

Иными словами, информация — это действующая, полезная часть знаний. Представитель этой концепции В. Г. Афанасьев, развивая логико-семантический подход, дает определение социальной информации: «Информация, циркулирующая в обществе, используемая в управлении социальными процессами, является социальной информацией. Она представляет собой знания, сообщения, сведения о социальной форме движения материи и о всех других формах в той мере, в какой она используется обществом…»

Социальная информация — многоуровневое знание. Она характеризует общественные процессы в целом — экономические, политические, социальные, демографические, культурно-духовные и т.д.; конкретные процессы, происходящие в различных ячейках общества- на предприятиях, в кооперативах, семьях и т.д.; а также интересы и стремления различных социальных групп — рабочего класса, молодежи, пенсионеров, женщин и др. В самом общем смысле под социальной информацией понимают знания, сообщения, сведения о социальной форме движения материи и о всех других ее формах в той мере, в какой они используются обществом, вовлеченными в орбиту общественной жизни. То есть информация есть содержание логического мышления, которое, воспринимаясь с помощью слышимого или видимого слова, может быть использована людьми в их деятельности.

Рассмотренные подходы в определенной мере дополняют друг друга, освещают различные стороны сущности понятия информации и облегчают тем самым систематизацию ее основных свойств. Обобщив данные подходы, можно дать следующее определение информации:

Информация — это сведения, снимающие неопределенность об окружающем мире, которые являются объектом хранения, преобразования, передачи и использования. Сведения  это знания выраженные в сигналах, сообщениях, известиях, уведомлениях и т.д.

Функции Delphi

  1. Обработка событий с помощью сценариев
  2. Объекты и функции
  3. Импортированные объекты/функции

Сервер Syncplify.me! Скриптовый движок был написан на Delphi, поэтому имеется богатый набор стандартных функций Delphi, которые можно использовать в скрипте. И не только когда вы используете PascalScript, на самом деле эти функции были импортированы и доступны для всех языков сценариев, реализованных на сервере Syncplify.me!. На данный момент, пожалуйста, обратитесь к официальной документации Delphi, чтобы узнать, как использовать эти функции:

 
function IntToStr(i: Integer): String
function FloatToStr(e: Extended): String
function DateToStr(e: Extended): String
function TimeToStr(e: Extended): String
function DateTimeToStr(e: Extended) : String Функция
 VarToStr(v: Variant): String
  Функция
 StrToInt(s: String): Integer Функция
 StrToFloat(s: String): Расширенная функция
 StrToDate(s: String): Расширенная функция
 StrToTime(s: String) ): Расширенная функция
 StrToDateTime(s: String): Расширенная
 
функция Format(Fmt: String; Args: array): String
функция FormatFloat(Fmt: String; Value: Extended): String
функция FormatDateTime(Fmt: String; DateTime: TDateTime): String
функция FormatMaskText(EditMask: string ; Значение: строка): строка
 
функция EncodeDate(Год, Месяц, День: Слово): TDateTime
процедура DecodeDate(Дата: TDateTime; var Год, Месяц, День: Слово)
функция EncodeTime(Час, Мин, Сек, Мсек : Word): процедура TDateTime
DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSsec: Word)
функция Дата: TDateTime
функция Время: TDateTime
функция Сейчас: TDateTime
функция DayOfWeek(aDate: DateTime): целое число
функция IsLeapYear(Year: Word): логическое значение
функция DaysInMonth(nYear, 0 nMonth 3 0 функция): Длина(s: String): Целое число
 функция Copy(s: String; from, count: Integer): String
 function Pos(substr, s: String): Integer
 процедура Delete(var s: String; from, count: Integer ): String
procedure Insert(s: String; var s2: String; pos: Integer): String
функция Верхний регистр (s: String): String
функция Нижний регистр(s: String): String
функция Trim(s: String): String
функция NameCase(s: String): String
функция CompareText(s, s1: String) : Integer
function Chr(i: Integer): Char
function Ord(ch: Char): Integer
процедура SetLength(var S: String; L: Integer)
 
function Round(e: Extended): Integer
функция Trunc( e: Extended): функция Integer
 Int(e: Extended): функция Integer
 Frac(X: Extended): Extended 9Функция 0013 Sqrt(e: Расширенный): Расширенная функция
 Abs(e: Расширенный): Расширенная функция
 Sin(e: Расширенный): Расширенная функция
 Cos(e: Расширенный): Расширенная функция
 ArcTan(X: Расширенный): Расширенный Функция
Tan(X: Extended): Расширенная функция
Exp(X: Extended): Расширенная функция
Ln(X: Extended): Расширенная функция
Pi: Расширенная процедура

Inc(var i: Integer; incr: Integer = 1 )
процедура Dec(var i: Integer; decr: Integer = 1)
процедура Randomize 9Функция 0013 Random: Расширенная функция
ValidInt(cInt: String): Булева функция
ValidFloat(cFlt: String): Булева функция
ValidDate(cDate: String): Булева функция
VarArrayCreate(Bounds: Array; Typ: Integer9): 0 Variant1

Блог Вход в песочницу — часть 14: Чтение старых свитков Delphi…

16 марта 2017 г. в Пакетный анализ, кластеризация, форматы файлов ZOO, реверсирование, песочница в то же время. Мониторинг API тривиален. Что не то не то:

  • Безумное количество функций API (Native, Win32)
  • Вызовы функций, которые немного сложнее отслеживать, поскольку функциональность предоставляется через сложный лабиринт виртуальных таблиц, например. COM
  • Мониторинг функций или методов, находящихся на более высоком уровне абстракции, напр. скрипты (AutoIT, VBS, VBA), а также установщики (например, NullSoft)
  • Разнообразие библиотечных функций, включенных в исполняемые файлы (статически)

Последний пункт в списке требует немного большего внимания.

Перехватывать API или перехватывать их вызовы каким-либо другим способом относительно легко, если вы знаете, где они находятся (и, возможно, сможете хорошо обработать украденные байты, поскольку некоторые вредоносные программы используют этот трюк). С кодом, встроенным непосредственно в исполняемый файл, нет ни таблицы импорта, ни списка указателей любого типа, ни виртуальных таблиц, ни RTTI, ничего. Конечно, используя такие инструменты, как IDA, или хорошую библиотеку дизассемблирования, или, возможно, инструментальное выполнение, можно определить точное расположение этих функций, но это довольно сложная и трудоемкая задача, особенно для коммерческих песочниц, которые должны работать БЫСТРО.

Кроме того, есть еще одна проблема. Код не находится по фиксированному адресу, но может быть размещен где угодно. Нет, я не говорю о ASLR. Я говорю об обертках, которые используют RunPE для запуска исполняемых файлов из памяти. Если вы перехватываете вызовы Windows API, запуск программ через RunPE не имеет значения — API в конечном итоге будут выполняться из известного места внутри системных библиотек в памяти. С перемещенным кодом статически связанные функции должны быть найдены _каждый_ раз, когда исполняемый файл загружается, сопоставляется с другим процессом или просто перемещается (прямая вставка кода, опустошение процесса, некоторые распаковщики и т. д.). Да, для вредоносной программы, которая порождает несколько дочерних процессов и несколько раз играет с RunPE в течение сеанса, это значительно замедляет тегирование функций в памяти.

Итак… после небольшого паники давайте посмотрим на очень хороший пример.

enfant ужасно программ, которые действительно раздражают при анализе, — это исполняемые файлы Delphi (и все другие марки исполняемых файлов Delphi, например, Embarcadero). Они в значительной степени зависят от пользовательских библиотек Delphi, и поэтому их трудно понять, независимо от того, отлажены они или дизассемблированы. Конечно, существуют хорошие декомпиляторы, которые могут очень помочь, и флирт-сигнатуры для исполняемых файлов Delphi также делают много волшебства при статическом анализе программы. Однако я не знаю ни одной из доступных песочниц или мониторов, выполняющих динамический анализ кода Delphi во время выполнения.

Я помню момент, когда тестировал первую перехватку функций Delphi, которую реализовал несколько лет назад. Мой разум был взорван. Внезапное понимание бизнес-логики программы, которое дало мне перехват, было невероятным… !!!

Я надеюсь, что скоро эта функциональность будет реализована в коммерческих песочницах. Существует огромное количество метаданных, которые только и ждут, чтобы их обнаружили…

Давайте посмотрим на пару примеров — приведенный ниже показывает прогрессивный разбор конфигурации трояна:

 LStrPos |, |1337|IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, |1337|IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, |1337|IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, 1337|IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, 1337|IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, 1337|IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, IPKServer|IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, IPKMutex|encpassword|-1|AdobeART. exe|AdobeART|-1|
LStrPos |, IPKMutex|encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, encpassword|-1|AdobeART.exe|AdobeART|-1|
LStrPos |, -1|AdobeART.exe|AdobeART|-1|
LStrPos |, -1|AdobeART.exe|AdobeART|-1|
LStrPos |, -1|AdobeART.exe|AdobeART|-1|
LStrPos |, AdobeART.exe|AdobeART|-1|
LStrPos |, AdobeART.exe|AdobeART|-1|
LStrPos |, AdobeART.exe|AdobeART|-1|
LStrPos |, AdobeART|-1|
LStrPos |, AdobeART|-1|
LStrPos |, AdobeART|-1|
LStrPos |, -1|
LStrPos |, -1|
LStrPos |, -1|
LStrPos |,
 

В этом примере показано сравнение символов, и строка «апокалипсис» может быть прочитана из серии сравнений строк:

 LStrCmp2 (substring=a, string=|)
LStrCmp2 (подстрока=p, строка=|)
LStrCmp2 (подстрока=o, строка=|)
LStrCmp2 (подстрока=c, строка=|)
LStrCmp2 (подстрока=a, строка=|)
LStrCmp2 (подстрока=l, строка=|)
LStrCmp2 (подстрока=y, строка=|)
LStrCmp2 (подстрока=p, строка=|)
LStrCmp2 (подстрока=s, строка=|)
LStrCmp2 (substring=e, string=|) 

Другой пример почти мгновенно сообщает мне, что программе требуется параметр командной строки:

 WStrCmp (substring=, string=/debug)
 

Как насчет антиподпрограмм на основе Delphi? Это совершенно новая неизведанная область!!!

 LStrPos (подстрока = SNIFFER, строка = EXPLORER.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *