Чтобы понять, для чего нужен компонент, достаточно внимательно рассмотреть его название, которое можно перевести как список действий. Компонент хранит список действий, которые вы можете использовать в приложении. А зачем они нужны в виде списка?
Допустим, что какое-то событие может вызываться из нескольких мест программы или от разных компонентов. Классический пример — пункт меню и дублирующая кнопка в панели задач. В большинстве программ присутствует панель задач, в которой есть кнопки, дублирующие действия меню. Вы можете и пункту меню и кнопке назначить один и тот же обработчик события, но управлять этим будет все равно не так удобно. Намного лучше будет создать действие Action в списке ActionList и назначить его кнопке и пункту меню.
Давайте создадим пример, который будет использовать действия. Создайте новое приложение и поместите на него компонент ActionList. Обратите внимание, что он выглядит как прямоугольник с иконкой, и такой компонент не будет видимым во время выполнения программы. Список действий и не должен быть виден, поэтому данный класс происходит не от TControl, а от TComponent.
✅AlphaControls лучшее решение для тех кто программирует на делфи! | ИДИАЛЬНОЕ решение
Дважды щелкните по компоненту ActionList, и перед вами откроется редактор действий. Окно разделено на две половины, слева вы можете видеть категории, а справа список действий выбранной категории. На панели инструментов четыре кнопки. Давайте посмотрим, для чего они предназначены, начиная с левой:
- создание нового действия;
- удалить выделенное действие;
- поднять выделенное действие на одну позицию вверх;
- опустить выделенное действие на одну позицию вниз.
Последние две кнопки используются для упорядочивания действий и чисто для эстетических целей.
Итак, создадим новое действие. Для этого можно нажать соответствующую кнопку на панели задач или просто нажать клавишу . Выделите созданное действие и посмотрите в объектный инспектор. Здесь у нас есть следующие действия:
- AutoCheck— если это свойство равно истине, то свойство checked будет автоматически переключаться при выполнении действия;
- caption— заголовок действия. Этот заголовок будет копироваться в свойство caption всем компонентам, которым будет назначено данное действие;
- category— категория. Здесь можно выбрать уже существующую или напечатать новое имя для создания новой категории;
- Enabled — доступно ли действие;
- Groupindex— индекс группы. Если у двух действий указан один и тот же индекс группы, т. е. они сгруппированы в одну группу, то при выделении одного действия (свойства checked устанавливаются true) другие действия этой группы сбрасываются (свойства checked устанавливаются false);
- image index— индекс иконки. С иконками мы еще не работали, но пару слов скажу. У самого компонента ActionList есть свойство images, где можно указать список иконок (компонент imagesList). Так вот, назначив действию картинку из этого списка, т. е. указав индекс картинки, она будет появляться на панелях и меню, поддерживающих картинки;
- secondaryshortcut — вторичное сочетание клавиш быстрого вызова;
- shortcut — первичное сочетание клавиш быстрого вызова.
Давайте назовем действие Выход, а на вкладке Events создадим обработчик события onExecute и напишем в нем всего одну строку — вызов метода close ().
Создание меню программы | Программирование на Delphi
Теперь в свойстве shortcut напишите Esc, т. е. горячей клавишей будет клавиша . Уже сейчас вы можете запустить программу, нажать — и соответствующее событие сработает, и будет вызван метод close (). И это несмотря на то, что действие еще ничему не было назначено.
Теперь попробуем поместить на форму кнопку TButton и в свойстве Action указать имя созданного вами ранее действия. Обратите внимание, что заголовок кнопки автоматически изменится. Обратное действие также работает. Если изменить свойство Caption у действия, то изменится заголовок у всех компонентов, которым назначено действие. Это очень удобно — из одного контейнера действий управлять ими, изменять заголовки, горячие клавиши, обработку сообщения и т. д.
Источник: delphicomponent.ru
Delphi. Messages. Первые наивные пробы
Решил разобраться с устройством Windows, в частности с сообщениями. Народ в сети массово отправляет к Рихтеру и Русиновичу. Книги приобрел – начал читать. Что хочу сказать – первое впечатление – информация ценнейшая для разработки под Windows. Ещё и на русском языке.
Но поскольку практика это лучший инструмент познания, решил сделать несколько простых примеров до основательного чтения этих книг. После чтения сделаю ещё несколько примеров, чтобы сравнить насколько лучше понимаю предмет.
Как отправить сообщение из приложения?
Рассмотрим на примере закрытия окна. Сообщение будет WM_CLOSE. Список всех сообщений для Windows можно посмотреть здесь.
Итак, из того, что я понял на данный момент, чтобы отправить сообщения определенному окну, часто используются функции
Delphi/Pascal
SendMessage ( Form2 . Handle , WM_CLOSE , 0 , 0 ) ;
//а также функция
PostMessage ( Form2 . Handle , WM_CLOSE , 0 , 0 ) ;
Оба сообщения закроют окно c Handle равным Form2.Handle Первый параметр – Handle окна, второй параметр – собственно сообщения, а третий и четвертый – дополнительные параметры, которые задействуются или нет от случая к случаю, например координаты курсора. В приведенном примере оба параметра занулены. Если поместить эти инструкции, скажем в обработчик кнопки окна, то после нажатия в ядро Windows будет направлено сообщение о закрытии окна, а Windows, соответственно просто закроет окно.
Где найти полный список сообщений?
В принципе таких ресурсов много. Вот один из них.
Слушает ли Delphi программа сообщения?
Определенно да. Вот простой пример. Поймаем сообщение нажатия правой кнопкой мыши на любом из компонентов приложения.
Delphi/Pascal
procedure TForm2 . FormCreate ( Sender : TObject ) ;
Application . OnMessage := AppMessage ;
Delphi/Pascal
procedure TForm2 . AppMessage ( var Msg : TMsg ; var Handled : Boolean ) ;
if Msg . message = WM_RBUTTONDOWN then showmessage ( ‘Сообщение поймано’ ) ;
Если нажмем правой клавишей мыши на любом компоненте приложения, то увидим
Здесь мы отлавливали сообщение о нажатии правой кнопки мыши. Таким же образом можно отлавливать любые другие сообщения из списка.
Как отправить “кастомное” сообщение?
Под кастомным сообщением я подразумеваю сообщение не из списка, а какое-то свое сообщение, например WM_USER+2001. Вот как можно отправить такое кастомное сообщение. Пример основан на официальной документации
Объявляем глобальную константу
Delphi/Pascal
WM_CUSTOM = WM_USER + 2001 ;
Далее создаем и присваиваем обработчик
Delphi/Pascal
procedure TForm . FormCreate ( Sender : TObject ) ;
Application . OnMessage := AppMessage ; // Присваиваем обработчик
//Создаем обработчик
procedure TForm . AppMessage ( var Msg : TMsg ; var Handled : Boolean ) ;
if ( Msg . hwnd = Form . Handle ) and
( Msg . message = WM_CUSTOM )
Showmessage ( ‘Кастомное сообщение поймано’ ) ;
И последний штрих – отправляем сообщения
Delphi/Pascal
procedure TForm2 . bSendMessageClick ( Sender : TObject ) ;
PostMessage ( Form2 . Handle , WM_CUSTOM , 0 , 0 ) ;
Ещё вариант отправки кастомного сообщения
Определяем свою константу (она должна быть прописана выше, чем метод, который её использует, то есть, например, до описания типов)
Delphi/Pascal
WM_CUSTOM = WM_USER + 2001 ;
Далее определяем обработчик сообщения в методах класса формы, например, таким образом
Delphi/Pascal
procedure MyMessageHandler ( var Msg : TMessage ) ; message WM_CUSTOM ;
Далее прописываем его
Delphi/Pascal
procedure TForm2 . MyMessageHandler ( var Msg : TMessage ) ;
showmessage ( ‘Кастомное сообщение поймано’ ) ;
Далее отправляем PostMessage, скажем, по нажатию кнопки
Delphi/Pascal
procedure TForm2 . bSendMessageClick ( Sender : TObject ) ;
PostMessage ( Form2 . Handle , WM_CUSTOM , 0 , 0 ) ;
Аpplication.ProcessMessages
Наконец, чтобы окончательно налепить всего в кучу про сообщения рассмотрим пример с сайта delphi-manual.ru, который очень хорошо демонстрирует работу Application.ProcessMessages.
Насколько я понял, сообщения в Windows выстраиваются в очередь. Отправка через PostMessage это постановка сообщения в конец очереди, отправка через SendMessage это отправка сообщения мимо очереди – оно будет выполнено одним из первых, не смотря на других ожидающих. Аналогичное действие у Application.ProcessMessages
Этот код с сайта delphi-manual.ru очень хорошо демонстрирует действие Application.ProcessMessages
В данном случае мы пытаемся добиться моргания текста в Edit1.Text, если не пользоваться Application.ProcessMessages, то этого моргания не будет, потому что сообщения в конце очереди, а если раскомментировать Application.ProcessMessages, то сообщения будут в начале очереди
Источник: digital-flame.ru
Взлом Борландии: изящная декомпиляция Delphi
Начинающие хакеры обычно испытывают большие трудности при взломе программ, написанных на Delphi и Builder, поскольку классические трюки, типа бряка на GetWindowTextA, не работают. И чтобы не пилить серпом по яйцам, требуется учитывать особенности библиотеки VCL, которая только с виду кажется неприступной, а в действительности ломается даже проще, чем чистые Си-программы! Не веришь? Убедись сам!
Для начала.
Два основных орудия хакера — это отладчик и дизассемблер, которые могут использоваться как по отдельности, так и совместно друг с другом. Первая (и самая сложная) фаза атаки — разведывательная. Прежде чем наносить основной удар по врагу, необходимо локализовать защитный механизм в мегабайтах мирного программного кода, после чего выстелить битхаком, поменяв JE на JNE, либо, разобравшись с алгоритмом процедуры регистрации, написать свой собственный генератор ключей/серийных номеров.
Ударная фаза практически не зависит от специфики ломаемого приложения и отрабатывается годами, представляя собой неромантичный кропотливый труд, а вот комплекс разведывательных мероприятий гораздо более интеллектуальное занятие, требующее хитрых мозгов и, конечно же, хвойно-новогодних опилок, которые мы будем настойчиво курить. И ожесточенно долбить. По клавиатуре! Ведь Новый год — семейный праздник, и всякий уважающий себя хакер проводит его наедине с самым близким ему существом — компьютером. Для создания атмосферы праздника нужно будет зажечь свечи (не те, что от геморроя), послать всех девушек в /dev/null, зарядить бурбулятор свежей порцией man’ов и начать маньячить. Ведь юзеры ждут
подарков, а лучшего подарка, чем новый кряк, для компьютерщика, пожалуй, и не придумаешь!
Короче, надо хачить. Поехали!
Осваиваем DeDe
DeDe – это такой декомпилятор программ, написанных на Delphi и Builder’е. Бесплатный и очень мощный. Мы будем использовать менее процента от его возможностей. Кто там говорит, что это расточительство? Нет, расточительство — это выбрасывать елку в мусор после праздника.
Полная декомпиляция в наши задачи не входит. Наша цель — локализация дислокации штаб-квартиры защитного механизма, то есть определение адресов процедур, проверяющих введенный пользователем регистрационный номер. Вот для этого нам и нужен DeDe, а все остальное можно сделать и руками. То есть дизассемблером. Вообще-то, в состав DeDe входит интегрированный дизассемблер в духе WIN32DASM, однако по своему качеству он значительно
уступает даже халявной версии IDA, не говоря уже о полном боекомплекте тяжелой артиллерии в виде IDA Pro + SoftICE. Это просто ужас какой-то! Это все равно что засунуть еловую ветку Стиву Б. в задницу, даже круче! Намного круче!
Последняя известная мне версия DeDe носит порядковый номер 3.50.02 и датируется серединой 2003 года. Похоже, что DaFixer полностью утратил интерес к своему детищу, решив похоронить DeDe на свалке истории. Полные исходные тексты версии 3.10b выложены в публичный доступ, однако желающих продолжить благородное дело что-то не наблюдается, и потому DeDe обречен на медленное и мучительное вымирание. Программы, собранные новыми компиляторами от Багдада, DeDe либо вообще не переваривает, либо декомпилирует неправильно (вот потому чуть позже мы рассмотрим, как ломать Борландию своими руками без посторонней помощи).
Архив DeDe.3.10b.realy.complete.src.zip (который, в частности, можно скачать с www.wasm.ru/baixado.php?mode=tool DATA XREF: .data:0040E614^o
.data:0040E88D dw 11h
.data:0040E88F dd offset _TForm1_FormCreate
.data:0040E893 db 10,’FormCreate’
.data:0040E89E dw 12h
.data:0040E8A0 dd offset _TForm1_FormDestroy
.data:0040E8A4 db 11,’FormDestroy’
.data:0040E8B0 dw 17h
.data:0040E8B2 dd offset _TForm1_Comm1ReceiveData
.data:0040E8B6 db 16,’Comm1ReceiveData’
.data:0040E8C7 dw 13h
.data:0040E8C9 dd offset _TForm1_Button1Click
.data:0040E8CD db 12,’Button1Click’
.data:0040E8DA dw 13h
.data:0040E8DC dd offset _TForm1_Button4Click
.data:0040E8E0 db 12,’Button4Click’
.data:0040E8ED dw 13h
.data:0040E8EF dd offset _TForm1_Button2Click
.data:0040E8F3 db 12,’Button2Click’
.data:0040E900 dw 12h
.data:0040E902 dd offset _TForm1_Timer1Timer
.data:0040E906 db 11,’Timer1Timer’
.data:0040E912 dw 13h
.data:0040E914 dd offset _TForm1_Button3Click
.data:0040E918 db 12,’Button3Click’
.data:0040E925 dw 13h
.data:0040E927 dd offset _TForm1_Button5Click
.data:0040E92B db 12,’Button5Click’
.data:0040E938 dw 13h
.data:0040E93A dd offset _TForm1_Button6Click
.data:0040E93E db 12,’Button6Click’
.data:0040E94B dw 13h
.data:0040E94D dd offset _TForm1_Button7Click
.data:0040E951 db 12,’Button7Click’
.data:0040E95E aTform1 db 6,’TForm1′ ; DATA XREF: .data:0040E61C^o
Скажем сразу, это довольно сложный для взлома случай, поскольку программист использовал названия элементов по умолчанию, потому и получилось TForm1, Button1Click, Button2Click. Это не названия кнопок, это названия методов класса, отвечающих за обработку нажатий кнопок, а вот каким реально кнопкам они соответствуют, так сразу и не скажешь, поэтому придется хитрить.
Перемещаем курсор на название функции, автоматически назначенное Идой на основе текстовой строки (например, «_TForm1_Button3Click»), и нажимаем , переходя на ее тело, где мы видим) мы видим, что функция расположена по адресу, ну скажем, 040286Ch. Загружаем файл в hiew, нажимаем для перехода в шестнадцатеричный режим, давим (goto) и вводим адрес перехода (в данном случае «.040286C»). Точка в начале адреса сообщает hiew’у, что это действительно адрес, а не смещение (по умолчанию). Активируем режим редактирования по (Edit) и пишем CC – опкод точки останова, соответствующий машинной команде INT 03h. Сохраняем изменения по и выходим.
Запускаем программу, вызываем обозначенную форму и давим по очереди на все кнопки. Когда мы нажмем Button3, на экран выскочит системное сообщение о том, что у программы рвет крышу и она будет аварийно завершена в добровольно-принудительном порядке. Так и должно быть.
В отсутствие отладчика команда INT 03h приводит к критической ошибке, что позволяет довольно быстро найти необходимые нам кнопки, после чего останется только хакнуть соответствующие им функции. Логично? Всенепременно!
Хорошо, а как быть, если в нашем распоряжении нету Иды, а есть только hiew? Первая мысль — идти топиться — отметается как идеологически неправильная. Топиться в Новый год — это по меньшей мере негуманно. У всех людей праздник, настроение соответствующие, и тут бац — дохлый труп с порезанными венами в ванной. Неэстетично!
Таким путем мы приходим ко второй мысли: бедность — это не порок, а естественное студенческое состояние; и все, что нас не убивает, делает нас сильнее. Хорошо подумав головой, мы сумеем обойтись одним hiew’ом. Хотя почему бы на Новый год не подарить себе любимому лицензионную Иду?
Ладно, hiew так hiew. Это только с виду кажется, что hiew — беспонтовая программа. На самом деле это очень даже мощный зверь типа «гепард». Сильный и шустрый. К тому же компактный.
Правда, увы, с некоторых пор далеко не бесплатный. Но найти hiew намного проще, чем Иду. Да и стоит hiew несоизмеримо дешевле, чем IDA Pro (это при его-то возможностях).
Поиск указателя на структуру формы в hiew’e:
Вокруг точек останова
Самые сложные случаи взлома — это упакованные программы, загружающие VCL-библиотеку на лету и не использующие никаких вразумительных имен в методах классов. Ломать такие защиты в дизассемблере — напрасно тратить время. Здесь лучше воспользоваться отладчиком, в роли которого может выступать не только тяжелая (SoftICE), но и легкая артиллерия в лице OllyDebbuger.
Загружаем программу в Olly, в списке модулей () находим VCLxx.bpl, давим на и, просматривая список импорта (), находим желаемое имя. Давим для установки программной точки останова или , , Breakpoint, «Hardware, on execution» для установки аппаратной точки останова соответственно. Аппаратные точки намного надежнее, но, увы, их всего четыре, а вот количество программных точек останова ничем не ограничено.
Остается только выбрать подходящие функции для бряканья. Краткий перечень наиболее важных из них (с точки зрения хакера) представлен ниже:
Праздничное заключение
Как видно, во взломе программ из Багдада ничего сложного нет, и они хакаются со скоростью пробки, вылетающей из бутылки шампанского. Даже еще быстрее! Так что подарок к Новому году обеспечен!
Полную версию статьи
читай в декабрьском номере Хакера! Последний релиз DeDe v. 3.50.02 ты можешь скачать с нашего сайта или взять на DVD
Источник: xakep.ru