воскресенье, 31 июля 2011 г.

Расширенная RTTI информация классов

Это перевод Extended Class RTTI. Автор: Hallvard Vassbotn.

Как я упоминал ранее, Delphi (начиная с версии 7) поддерживает генерацию расширенной RTTI информации о методах класса - через компиляцию класса в режиме $METHODINFO ON. Эта RTTI информация включает в себя информацию о сигнатуре public и published методов. Delphi использует её для реализации поддержки скриптинга в фреймворке WebSnap - см. модуль ObjAuto и его друзей для более подробных сведений.

Я сумел написать свои собственные определения и подпрограммы, которые выдёргивают и сохраняют расширенную RTTI информацию классов в формат, удобный для внешнего использования. Как обычно, моё тестовое приложение будет дампить тестовый класс, воссоздавая его псевдо-объявление.

суббота, 30 июля 2011 г.

Расширенная RTTI информация интерфейсов

Это перевод Extended Interface RTTI. Автор: Hallvard Vassbotn.

Чтобы поддерживать базовые механизмы SOAP архитектуры, Delphi добавила поддержку расширенной RTTI информации для интерфейсов начиная с версии 7. Как мы видели в предыдущей статье, все интерфейсы поддерживают базовую информацию RTTI: имя интерфейса, его GUID, имя модуля с объявлением, родительский интерфейс и число методов.

Чтобы добавить к интерфейсу расширенную RTTI информацию, его нужно собрать в режиме {$M+}/{$TYPINFO ON} или {$METHODINFO ON}. Альтернативно, вы можете просто унаследовать свой интерфейс от IInvokable (определённого в модуле System с $M+). Это расширит генерируемую RTTI для интерфейса информацией по сигнатуре каждого метода.

пятница, 29 июля 2011 г.

Простая RTTI информация интерфейсов

Это перевод Simple Interface RTTI. Автор: Hallvard Vassbotn.

Delphi поддерживает получение RTTI информации для всех интерфейсов, но она не включает (не генерирует) информацию о методах для "нормальных" интерфейсов:
type
  {$M-}
  IMyMMInterface = interface
    procedure Foo;
  end;

четверг, 28 июля 2011 г.

Раскапывая детали SOAP и WebSnap

Это перевод Digging into SOAP and WebSnap. Автор: Hallvard Vassbotn.

В предыдущих статьях этого блога мы досконально разобрали внутреннюю кухню работы published методов, и предположили, что RTTI для них не включает в себя сведения о сигнатуре вызова. Затем мы разработали грязный (и довольно бесполезный) хак, который откапывал параметры published методов, сопоставляя методы с событиями с RTTI, которые ссылались на этот метод в run-time. Как я кратко упомянул в моём предыдущем посте, David Glassborow указал мне на расширенный RTTI, который появился в Delphi 6.

среда, 27 июля 2011 г.

RTTI классов

Это перевод Class RTTI. Автор: David Glassborow.

Этот пост является продолжением моего предыдущего поста, который говорил про RTTI интерфейсов в Delphi и был вдохновлён серией постов Hallvard-а по RTTI. Этот пост рассказывает о некоторых продвинутых возможностях RTTI для классов, описания которых я больше нигде не видел.

вторник, 26 июля 2011 г.

RTTI интерфейсов

Это перевод Interface RTTI. Автор: David Glassborow.

Чтение этой статьи Hallvard-а по RTTI и её дополнения вдохновило меня собрать вместе несколько постов о двух связанных частях RTTI в Delphi. В частности, это был один из комментариев в блоге Hallvard-а по использованию RTTI для вызова методов объектов в манере позднего связывания. Этот и следующие посты покроют использование продвинутой RTTI информации, описание которого я нигде больше не видел. Этот пост опишет некоторые возможности мета-данных интерфейсов, а следующий расскажет о более богатом классовом RTTI для методов.

понедельник, 25 июля 2011 г.

Детали реализации published полей

Это перевод Published fields details. Автор: Hallvard Vassbotn.

В предыдущей статье мы посмотрели на то, как published поля используются IDE и VCL, чтобы сделать простыми работу с компонентными ссылками и нахождение классовых ссылок по именам типов. Сейчас мы заглянем глубже в детали реализации published полей.

воскресенье, 24 июля 2011 г.

Published поля

Это перевод Published fields. Автор: Hallvard Vassbotn.

В нашей небольшой серии по обратной разработке (reverse engineering) недокументированных полей VMT классов Delphi, мы видели поле FieldTable. Это поле указывает на структуры, которые описывают published поля класса. В Delphi published поля должны быть ссылками на объекты и в основном используются формами (form) и модулями данных (datamodule) для хранения ссылок на свои компоненты в логически именованных полях для удобства доступа (потому что альтернативой к полям является использование массива Components, что включает в себя поиск и преобразования типов).

суббота, 23 июля 2011 г.

Хак №10: получение параметров published методов

Это перевод Hack #10: Getting the parameters of published methods. Автор: Hallvard Vassbotn.

Этот хак не очень полезен на практике, он был сделан под вдохновением от комментария к посту о published методах. Тогда я начал расследование, как это можно сделать. Вспомните, что компилятор сейчас не кодирует сигнатуру метода в RTTI для published методов - сохраняются только адрес и имя метода.

Так что с первого взгляда кажется, что получить эту информацию - невозможно. Но давайте сделаем шаг назад и подумаем о том, как IDE обрабатывает события и published методы в design-time. Если у вас уже объявлено несколько обработчиков событий (реализованных в нескольких published методах формы), то инспектор объектов отфильтрует их и покажет только те методы (в выпадающем списке), сигнатура которых совместима с событием. Как IDE узнаёт, какие методы нужно показывать в списке, а какие - нет?

пятница, 22 июля 2011 г.

Под капотом published методов

Это перевод Under the hood of published methods. Автор: Hallvard Vassbotn.

Теперь, когда я рассказал, что такое published методы, как IDE и VCL используют их при сохранении/загрузке .DFM и как использовать их полиморфно, мы готовы погрузиться глубже в их детали реализации под капотом языка.

четверг, 21 июля 2011 г.

Чистые интерфейсы в Delphi

Это перевод Pure interfaces in Delphi. Автор: Hallvard Vassbotn.

В комментарии к последнему посту Huseyn спросил:
В Delphi все интерфейсы являются наследниками IUnknown (или IInterface - Hallvard Vassbotn), но в мире C есть ещё более базовая сущность - интерфейсы, не являющиеся наследниками IUnknown. Я встретил такой интерфейс в одной DLL, которую мне надо было использовать. Но я не могу это сделать в Delphi.
Да, это верно, что в Delphi создание интерфейса всегда подразумевает неявное наследование от IUnknown или IInterface (два имени для отличий COM и Delphi интерфейсов). И это означает, что все интерфейсы в Delphi будут иметь три метода QueryInterface, _AddRef и _Release. Это, конечно, делает сложным (или невозможным) реализацию чистого интерфейса из не-COM DLL с использованием синтаксиса объявления интерфейсов в Delphi.

среда, 20 июля 2011 г.

Получение списка реализуемых интерфейсов

Это перевод Getting a list of implemented interfaces. Автор: Hallvard Vassbotn.

Френк задал такой вопрос:
Есть ли какой-нибудь способ узнать, какие интерфейсы (список интерфейсов) поддерживает определённый компонент (я не знаю интерфейсы, так что не могу запросить у него конкретные интерфейсы)?
Да, способ есть.

вторник, 19 июля 2011 г.

Published методы

Это перевод Published methods. Автор: Hallvard Vassbotn.

Обычно о них не думают как о возможностях объектно-ориентированного программирования, но published методы основаны на RTTI, чтобы можно было выполнять поиск методов, используя строку с именем метода, во время выполнения (run-time). Эта возможность широко используется IDE и VCL при написании обработчиков событий во время разработки.

понедельник, 18 июля 2011 г.

Хак №9: структура таблицы динамических методов

Это перевод Hack #9: Dynamic method table structure. Автор: Hallvard Vassbotn.

Один из слотов в магической структуре компилятора из классовой виртуальной таблицы методов (VMT) является указателем на динамическую таблицу методов (DMT) этого же класса. Класс имеет DMT, только если он объявляет или перекрывает один или несколько динамических методов (или методов-сообщений). DMT содержит 16-разрядный (word) Count, за которым следует массив [0.. Count-1] of Smallint индексов и массив [0..Count-1] of Pointer, содержащий адреса кода реализации динамических методов. Обратите внимание, что массивы "встроены" в структуру DMT (в ней нет указателей на эти массивы).

воскресенье, 17 июля 2011 г.

Реализация динамических методов компилятором

Это перевод Dynamic methods compiler implementation. Автор: Hallvard Vassbotn.

В предыдущей статье мы рассмотрели как компилятор реализует вызовы не виртуальных и виртуальных методов. Мы также обсудили обоснование и семантику динамических методов. Как вы помните, динамические методы работают так же, как и виртуальные методы, только медленнее. В этой статье мы зароемся в магию компилятора и поддержку RTL, которые используются для поддержки динамических методов. Отметим, что большая часть механики, используемой для динамических методов, используется также для методов-сообщений (message methods) - с той лишь разницей, что методы-сообщений позволяют программисту указывать индекс метода (он же - номер сообщения, положительное 16-разрядное число).

суббота, 16 июля 2011 г.

Динамические методы и inherited

Это перевод Dynamic methods and inherited. Автор: Hallvard Vassbotn.

В предыдущем сообщении блога мы рассмотрели, как работают виртуальные методы и вызовы унаследованных методов. В Delphi есть и другой вид полиморфных методов: динамические методы (dynamic methods). Заметим, что эта серия постов про полиморфизм говорит только про Native Win32, но достаточно упомянуть, что в Delphi для .NET динамические методы, на самом деле, идентичны виртуальным методам. В Win32 методы сообщений (message methods) используют те же базовые структуры компилятора и механизм диспетчеризации, что и динамические методы, в то время как в .NET используется решение на базе атрибутов и отражения (reflection). Мы рассмотрим методы сообщений в следующем посте.

пятница, 15 июля 2011 г.

Хак №8: явные вызовы VMT

Это перевод Hack #8: Explicit VMT calls. Автор: Hallvard Vassbotn.

Чтобы приспособить двоичный протокол COM в до-интерфейсной эпохе Delphi 2, все определяемые пользователем виртуальные методы имели положительные смещения VMT. Это также означает, что виртуальные методы, определенные самим TObject, имеют отрицательные смещения VMT. Кроме того, VMT также содержит ряд "магических" полей для поддержки таких возможностей, как ссылки на родительский класс, получение имени класса, таблицы динамических методов, таблицы опубликованных (published) методов, таблицы RTTI, таблицы инициализации волшебных полей, (устаревшей) таблицы OLE Automation и таблицы реализованных интерфейсов.

четверг, 14 июля 2011 г.

Реализация вызовов методов компилятором

Это перевод Method calls compiler implementation. Автор: Hallvard Vassbotn.

Чтобы поддерживать множество возможностей языка, компилятор Delphi использует несколько различных структур данных и шаблонов генерации машинного кода. Чтобы помочь в понимании того, как реализуются компилятором возможности языка Delphi, чтобы было проще опознавать эти шаблоны и структуры при низкоуровневой отладке ассемблерного кода и чтобы было возможным понимать, что вы делаете при патчинге кода в run-time - я расскажу про некоторые из этих шаблонов в этом посте.

среда, 13 июля 2011 г.

Виртуальные методы и inherited

Это перевод Virtual methods and inherited. Автор: Hallvard Vassbotn.

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

вторник, 12 июля 2011 г.

Полиморфизм ad nauseum

Это перевод Polymorphism ad nauseum. Автор: Hallvard Vassbotn.

Как и все объектно-ориентированные языки, Delphi (Object Pascal) поддерживает концепцию полиморфизма. Полиморфизм - это греческое слово, буквально означающее "много форм". В применении к программированию это слово означает идею, что вызов концептуальной операции отделён от её реальной реализации. Фактически, в run-time эта реализация может существенно меняться, в зависимости от типа объекта, выполняющего операцию.

понедельник, 11 июля 2011 г.

Люди очень чувствительны к виду иконок

Это перевод People are very sensitive to how the icons look. Автор: Реймонд Чен.

Windows XP поставляется с новыми значками для многих распространенных элементов в Оболочке (Shell), и Windows Vista будет иметь ещё больше новых иконок. Одна из вещей, с которыми дизайнеры должны быть осторожны при рисовании этих значков - нужно убедиться, что иконки не выглядит как что-нибудь уже известное. Позвольте мне уточнить.

воскресенье, 10 июля 2011 г.

Штурмуя пользователя диалоговыми окнами

Это перевод Assaulting users with dialog box after dialog box. Автор: Реймонд Чен.

Все чаще я вижу решения проблем за счёт добавления новых диалоговых окон. Спрашивать пользователя слишком часто - так же плохо, как и не спрашивать достаточно часто.

суббота, 9 июля 2011 г.

пятница, 8 июля 2011 г.

Перенаправление вывода может изменить поведение программы

Это перевод Redirecting output can result in altered program behavior. Автор: Реймонд Чен.

Рассмотрим программу, которая выводит результат в консоль так (я пометил каждую строку потоком, в который она пишется):
stdout: line 1
stderr: err 1
stdout: line 2
stderr: err 2
Вы хотите захватить оба потока (обычный и вывод ошибок), так что вы запускаете программу и добавляете ">output 2>&1" к командной строке, чтобы захватить оба потока в файл output. Но если вы посмотрите содержимое этого файла, то увидите это:
line 1
line 2
err 1
err 2
Что произошло?

четверг, 7 июля 2011 г.

Оператор перенаправления может стоять в середине командной строки

Это перевод The redirection operator can occur in the middle of the command line. Автор: Реймонд Чен.

Хотя оператор перенаправления традиционно пишется в конце командной строки, это вовсе не обязательно.

среда, 6 июля 2011 г.

Опасайтесь цифр перед оператором перенаправления

Это перевод Beware of digits before the redirection operator. Автор: Реймонд Чен.

Если вы хотите записать строку "Meet at 2" в файл schedule, вы можете попытаться использовать
echo Meet at 2>schedule
Но если вы попробуете это выполнить, то вы увидите строку "Meet at" на экране, а файл schedule будет пуст.

Что произошло?

вторник, 5 июля 2011 г.

Перенаправление командной строки выполняется интерпретатором командной строки

Это перевод Command line redirection is performed by the command line interpreter. Автор: Реймонд Чен.

Волшебные символы вроде <, > и | в командных строках вроде
myprogram.exe | sort > output.txt
интерпретируются командным интерпретатором CMD.EXE; они не встроены в функцию CreateProcess. Это довольно очевидно, если вы подумаете об этом.

понедельник, 4 июля 2011 г.

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

Это перевод The first word on the command line is the program name only by convention. Автор: Реймонд Чен.

Формат командной строки, возвращаемой GetCommandLine = "программа аргументы", но это просто соглашение. Если вы передадите nil в параметр lpApplicationName функции CreateProcess, то CreateProcess будет считать первое слово (с учётом кавычек) в lpCommandLine именем программы. Однако если вы передадите значение в lpApplicationName, то именно эта строка будет определять, какую программу запускать, а строка из lpCommandLine для этого использоваться не будет.

воскресенье, 3 июля 2011 г.

Решения, которые ничего не решают

Это перевод Solutions that don't actually solve anything. Автор: Реймонд Чен.

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

суббота, 2 июля 2011 г.

Тонкие способы, которыми ваша невинная программа может стать Интернет-ориентированной

Это перевод Subtle ways your innocent program can be Internet-facing. Автор: Реймонд Чен.

В последний раз я грозился обсудить способы, которыми ваша обычная невинная программа может быть подвержена атакам из Интернета, когда вы даже не осознаёте этого - и, вероятно, наиболее частым местом для этой проблемы является командная строка.

пятница, 1 июля 2011 г.