IT-Блог о программировании и операционных системах
Класс TForGirlsDebug
Защита Delphi-программ от взлома. Часть IV - Защита от декомпилятора DeDe (Delphi Decompiler).
- Защита Delphi-программ от взлома. Часть I – Инструментальная
- Защита Delphi-программ от взлома. Часть II – Защитно-обзорная
- Защита Delphi-программ от взлома. Часть III – Навесная
Что там по поводу e-zine по Delphi ?
В общем, нужно воодушевиться, товарищи программисты! Что скажете?
Теперь у меня есть именная, пожизненная лицензия на CodeMerger (RDX Software)
Вот уж действительно не думал, как говорится, не гадал… Можете поздравить меня, Влада, ГанСмокера и Алексея Тимохина! Все мы получили очень хороший подарок от разработчиков компании RDX Software, а именно систему CodeMerger! Мне действительно очень приятно! Я ещё никогда ничего не выигрывал в Интернете, а тут бац!… такой презент! Я искренне желаю компании RDX всех благ и процветания, успешных продаж и доброжелательных пользователей. Молодцы мужики!
Напомню, что получили мы этот драгоценный приз за то, что просто высказали свои пожелания насчёт дальнейшего развития Delphi!
- Желания Алексея Тимохина ( TDelphi )
- Отладочные мечты Александра Алексеева ( Gun Smoker )
- Пожелания Влада (WebDelphi)
До скорых встреч, уважаемые посетители и подписчики блога Delphi Day!
Акция! Бесплатное рекламное место для Delphi блога!
Всё, что требуется сделать, для получения бесплатного рекламного места в сайдбаре блога FreeVCL – это:
• Написать у себя на блоге мини-обзор (хотя можно просто постовой, одно или два предложения) для FreeVCL, указав прямую, интерактивную ссылку.
• Залить своё изображение размера 125x125 себе на хостинг (можете прислать мне)
• Написать мне письмом, или в ICQ, указав ссылку на пост
• Я размещу ваш баннер на месяц или полтора.
Хоть FreeVCL и молодой блог, но его посещает уже более 100 человек в день. Вообщем, выгодно и нам и вам :) Спасибо, что откликнулись. С уважением, Егор.
Защита Delphi-программ от взлома. Часть III – Навесная (часть1)
В этой части рассмотрим ещё одну технику защиты приложений, а именно мы рассмотрим некоторые навесные защиты.
Навесная защита – это некая программа, при помощи которой можно модифицировать свой исполняемый модуль так, чтобы затруднить непосредственно взлом своего программного обеспечения. Эта программа может сжать секцию данных и кода, уменьшив тем самым размер исполняемого файла, но основной функцией протектора является как раз не сжатие (чем занимаются упаковщики), а защита программного кода.
Что означает “защита программного кода”? Это просто комплекс мер, призванный для того, чтобы вашу программу было труднее взломать. Например, это может быть подмена устойчивой сигнатуры, при помощи которой программы – анализаторы (типа PEiD, DiE) узнают, чем защищена программа или на чём она написана. Большое число антиотладочных приёмов и хитростей.
Продвинутый протектор может например зашифровать секции, или поубивать процессы известных крякерских инструментов. Вообщем, цель протектора – сделать всё и как можно больше, для того, чтобы по максимуму затруднить взлом.
Themida - это мощная система защиты программного обеспечения для разработчиков, которые хотят защитить свои приложения от взлома. Themida использует систему защиты SecureEngine, что делает ее почти неуязвимой к традиционным и новейшим инструментам для взлома ПО.
Themida была разработана, чтобы полностью отсеять новичков, а также опытных крекеров от взлома ваших программ, что позволяет избежать значительных потерь доходов от распространения кряков и кейгенов.
Некоторые полезные возможности данного протектора:
- Антиотладочные техники против любого вида отладчиков.
- Антидемпинговые техники, против любых ring3 и ring0 дамперов.
- Разные шифровальные алгоритмы.
- Защита против API-сканнеров, которая предотвращает восстановление оригинальной таблицы импорта.
- Антидизассемблерные техники против любых статических и интерактивных дизассемблеров.
- Улучшенная техника защиты оригинальной точки входа (OEP)
- Защита против патчинга памяти процесса и CRC
- Метаморфный движок, для защиты кода
- Динамическое шифрование вашего приложения
- Сжатие кода приложения, секции ресурсов, а также и кода распаковщика.
- И многое другое…
Наиболее интересные опции защиты:
Anti-debugger detection. Данная опция включает обнаружение отладчика в системе. Отладчик уровня ядра или пользователя – неважно! Примечание: если опция в положении Ultra, может вызывать некоторые проблемы, особенно если файл заражён вирусом, также, эта опция может быть несовместима с платформами отличными от Windows.
Anti-dumpers. Как вы знаете, одним из самых опасных инструментов против защищённой (запакованной) программы является дампер памяти. Взломщик может скинуть в файл распакованный код и данные, а затем попытаться восстановить его в первоначальный вид (до расспаковки). SecureEngine предлагает много техник защиты от сдампливания. Эта опция включает наиболее действенные техники нацеленные против дампа памяти в файл на диск.
Resources Encryption. Шифрование ресурсов программы. Если включить эту опцию, то движок SecureEngine зашифрует все ресурсы так, чтобы взломщик не смог проанализировать и\или изменить их. Распаковка ресурсов происходит тогда, когда этого потребует ваше приложение.
VMWare / Virtual PC. Опция позволяет предотвратить запуск вашего приложения на общеизвесных эмуляторах, таких как VMWare, Virtual PC, Virtual Box или Microsoft VM.
Advance API-Wrapping. Эта опция позволяет включить упаковку API, что не позволит взломщику идентифицировать используемые в приложении функции. Можно выбирать уровень упаковки. Имейте ввиду, что чем выше уровень упаковки, тем большее процессорное время затрачивается для оной! Например, использование этой функции с уровнем “2” может в несколько раз уменьшить время запуска вашего приложения!
Anti-Patching. Предотвращает попытки запуска измененной копии программы. То есть, если например файл заражён вирусом, или его изменил взломщик, Themida это распознает и покажет окно (которое кстати тоже можно настроить), что мол файл изменён и всё такое, а затем завершит выполнение.
Metamorph Security. Эта опция позволяет изменить все инструкции защитного кода на другие, но одинаковые по действию. Это затрудняет взломщику процесс распознания устойчивых кусков кода защиты.
Delphi/BCB form protection. Защита форм приложений, которые скомпилированы в Делфи или Билдере. Взломщик не сможет извлечь информацию о формах с помощью специальных инструментов.
Themida поддерживает ещё достаточное количество приёмов и функций, о которых можно узнать обратившись к справочной системе. Themida по праву считается одним из самых сильных протекторов, который способен помочь вам защитить ваши продукты от взлома. К сожалению, на тематических форумах появляется всё больше и больше сообщений о том, что фемида взломана. Появляются статьи и видео, которые показывают нам, как ее снять. Но нужно отдать должное – продукт развивается, в отличии например от Armadillo, которая по словам крекеров, умерла.
Замечание: Themida не поддерживает упаковку динамических библиотек, которые статически прилинкованы к проекту. Придётся использовать динамическое связывание.
Отечественная разработка от компании VMPSoft. Как видно из названия, главной (но далеко не единственной) фишкой данного протектора является выполнение кусков кода на виртуальной машине. Как утверждает описание продукта, архитектура виртуальной машины кардинально отличается от обычных процессоров, что делает использование большинства крэкерских инструментов совершенно бессмысленным.
Хорошей особенностью является то, что в VMProtect встроена своя система лицензирования, которая позволяет генерировать и проверять серийные номера.
VMProtect можно совместно использовать с другим протектором или упаковщиком. Эта возможность помогает ещё сильнее защитить Ваше приложение.
Некоторые возможности VMProtect
Виртуализация кода. В отличии от большинства защит, которые шифруют исполняемый код программы, а потом, перед исполнением основного кода расшифровывают его, VMProtect никогда не расшифровывает код программы. VMProtect переводит исполняемый код программы в код, который работает только на виртуальной машине. Набор команд этого процессора не имеет ничего общего с системой команд x86 & x64 и может меняться с каждой защитой программы.
Форматы файлов. Данный протектор позволяет защищать как исполняемые модули, так и динамические библиотеки (DLL, OCX, BPL), а также драйверы (SYS).
Поддержка 64-битных платформ.
Система лицензирования. Как я говорил, VMProtect позволяет генерировать и проверять серийные номера. Серийные номера могут ограничиваться по сроку действия, могут привязываться к железу. Также интересной особенностью VMProtect является то, что он может сделать физически невозможным запуск программы в отсутствии серийного номера.
К сожалению, уже даже к последней версии этого протектора китайцы написали автораспаковщик (в лице скрипта для олли). Но кто сказал что это идеальная защита? Протектор реально помогает только тогда, когда и код программной защиты (Ваш) написан грамотно.
Вердикт: Достаточно хороший протектор исполняемых файлов, который в состоянии дать отпор взломщику начального и среднего уровня.
Приложение 1
Статья, которая обьясняет некоторые приёмы использования VMProtect для защиты делфи-приложения. Тыц.
Ещё парочку приличных протекторов мы рассмотрим в следующей части.
Защита Delphi-программ от взлома. Часть II – Защитно-обзорная (№1).
Итак, в прошлой статье (ссылка) мы рассмотрели, какие инструменты может использовать крэкер для взлома нашего программного обеспечения. В этой статье давайте поговорим о том, какие методы защиты мы можем предложить на пробу взломщику.
Все они достаточно разные. У каждой есть свои сильные и слабые стороны. Какие-то отламываются быстрее быстрого, а над какими-то нужно посидеть несколько больше. А какие-то в принципе не отламываются (да, есть такая).
Итак, давайте рассмотрим самые распространённые из них и поговорим об их сильных и слабых сторонах. Но для начала, чтобы развеять все ваши грёзы, запомните одно очень сильное и основное правило:
Защита Delphi-программ от взлома. Часть I – Инструментальная
Немного истории или cracked by Bill Gilbert
Во времена титанов, древних богов, мифов и легенд... Ах, нет, простите, на самом деле это случилось гораздо позднее, годах эдак в 80х. Во времена небезызвестных Спекки существовали программы. Были они всякими, маленькими и большими, нужными и не очень, всякие, в общем, они были. Создавались и игрушки разных мастей. Ну это и естественно, куда же без них, без игр? Кто-то до сих пор не прочь запустить на эмуляторе старый добрый Саботейр и порулить крутым ниндзя, надавать врагам по голове, спасти мир и улететь на вертолёте во вторую часть игры, в которой как ни странно фигурирует уже не ниндзя, а ниндзюха (или ниндзяха?), короче ниндзя - женщина (эдакая женониндзя). На самом же деле это была сестра того ниндзя, который из первой части. Ну вот, опять отвлекаюсь на свою любимую игрушку для Speccy...
Кому-то очень захотелось чтобы и жизнь бесконечная и патроны как говорится не кончались, ну знаете, как в американском кино, где главный герой (хороший парень или попросту - "наш") выстреливает в главного злодея все 30 патронов из своей Береты 92, в которой по определению больше 15ти не помещается. Но и это не всё! У него остаётся один патрон для последнего фаталити, коим он воспользуется и застрелит таки злодея. Супер-герой чувствует себя умеренно нормально, при этом у него как минимум 3 ранения и кровь хлещет как со свиньи! Но он должен выжить, ведь он - наш, хороший парень.
Так почему бы и своим компьютерным хорошим парням не дать тот бесконечный боезапас, не подарить "немного" дополнительной жизни? Так, скорее всего думал паренёк с именем (или скорее всего ником) Bill Gilbert. Этого парня, похоже, знают все, кто знает что такое ZX-Spectrum. Он взломал огромное колличество программ под Speccy, особенно игрушек. Так, этот Билл Гиллберт стал одним из первых реверс инженеров играющих свои роли как говорится Just for fun (на самом деле они все делают это JFF. Об этом я ещё расскажу). Cracked by Bill Gilbert - так теговал свои релизы один из первых крэкеров на одноимённой сцене... В ряде отломанных игрушек использовал нестандартные загрузочные картинки, автором которых выступал художник M. Stawicki.
Но что происходило позже? А позже появился платный софт. Появилась защита. А вот люди, которые знали, как поменять пару байт в программе так, чтобы она вела себя так, как хотят они, уже были. И продолжают быть до сих пор... И вот уже наш Билл отламывает защиты на фирмовых игрушках, которые в большинстве своём мы и видели на наших Спектрумах.
Современная реверс-сцена
Громадное количество материалов, статей, утилит по теме крэкинга - всё это пишут, создают люди. Сколько их, откуда они и в конце концов кто они - это вопросы, на которые никто и никогда не сможет ответить точно (среди них например, есть юристы, каратеки, инженеры, писатели, архитекторы и даже флористы (да, есть) ). Но мы можем точно сказать, что они - прежде всего достойные программисты. Беру на себя определённую долю смелости и говорю, что они, указывают нам на наши же ошибки (Панацея от говно-кода?). Да и правда, кто как ни они стимулируют на создание всё новых и новых методов защиты? Некоторые скажут: - "Ага, ну как же! Ломать - не строить!", и будут совершенно не правы. В большинстве случаев, взлом даже самой маломальской защиты требует не дюжинных знаний, сосредоточенности и усидчивости.
В данной сфере заняты далеко не глупые люди. Достаточно большие сообщества существуют как в рунете, так и в зарубежном сегменте глобальной паутины. За примерами далеко ходить не нужно, достаточно набрать в гугле соответствующий запрос все следующие ссылки ваши. Оживлённые форумы и конференции - вот, что вы можете увидеть. И все эти люди ломают защиты. Здесь есть и свои звезды, и даже отдельные команды собравшихся вместе людей, которые объединились, чтобы вместе изучать то, что им интересно.
Посмотрите на профессиональные инструменты, которые создают эти люди. Многие из них достойны высшей похвалы. Взгляните например на Kerberos (который не протокол).
На самом деле реверс-инженеров намного больше, чем кажется. Любой человек, который увлекается программированием на ассемблере (или хотя бы немного разбирается в нём) способен взломать ваш софт (более того, можно вообще не иметь представления об ассемблере и программировании вообще и тем не менее взламывать. Я расскажу об этом позже.) Дело в том, что разработка на ассемблере - это больше половины времени проведённого в отладчике (имеется ввиду от времени разработки), а отладчик для реверсера - это первый и самый важный профессиональный инструмент. Об инструментах далее и пойдёт речь.
Профессиональный инструментарий реверс-инженеров
Во время исследования программного обеспечения взломщик прибегает к помощи некоторых профессиональных инструментов, а именно:
Дизассемблеры. Помогают преобразовать машинные коды программы в удобочитаемый ассемблерный код. Могут быть как автоматические (например, Sourcer), так и интерактивные (например, IDA Pro).
Декомпиляторы. Используются для перевода машинного кода в максимально приближенный к исходному на том же языке, на котором была разработана программа. На деле, как вы уже поняли, всё далеко не так. Хотя есть HexRays для IDA Pro, который по заявлениям генерит код на Си. Но и там не всё радужно. Об этом, когда-то писал Крис Касперски. Для Delphi существует DeDe (сейчас проект ведёт другой разработчик, и название изменилось на Delphi Decompiler). Кстати, не стоит думать, что он генерит чистый дельфовый код, нет. Но безусловно, он очень помогает в исследовании программ написанных на Delphi и Builder.
Отладчики. Первым делом - это инструмент, который помогает найти трудноуловимые ошибки в коде (чаще в логике) программы. Позволяет выполнять программу пошагово, устанавливать в ней точки останова (брейкпоинт), а так же, изменять или контролировать значения переменных. Функции отладчика типа изменения кода являются скорее второстепенными, но всё же очень важными.
Шестнадцатеричные редакторы (Hex-редакторы). Менее распространенное название - редакторы двоичных файлов. Инструмент для редактирования и просмотра бинарных данных в шестнадцатеричном представлении. Хорошие редакторы имеют в своём распоряжении ещё и дизассемблер (плюс много других интересных возможностей). Такие редакторы применяются реверсерами в основном для патча некоторых байт, что позволяет им обходить ограничения незарегистрированной копии.
Анализаторы и редакторы исполняемых файлов. Позволяют получить (или изменить) информацию об исполняемом файле. Например, значения полей его заголовков, название и версию компилятора, или упаковщика (протектора), если оный защищён навесной защитой. Экономит взломщику кучу времени и даёт всю необходимую информацию. Кроме того, может показать взломщику дополнительную важную информацию о секциях и точке входа. Пример анализатора - PEiD, DiE, редактора - PETools или LordPE. В основном все анализаторы работают по принципу распознавания сигнатур.
Программы мониторинга (работы с файлами, реестром, сетью, мониторинг вызова функций WIN API...). Позволяют следить, к какому файлу (файлам) обращается приложение, какие порты открывает, с какими адресами устанавливает соединения, какие функции WinAPI активно использует, какие ключи реестра мониторит, меняет или читает…
Оконные шпионы. Позволяют узнать класс, дескриптор любого windows-окна. Будь то кнопка или мемо. Позволяет изменить его стиль (например, убрать установить WS_VISIBLE), узнать всё о дочерних и родительских окнах, изменить их свойства и даже узнать адрес оконной процедуры. Узнать id процесса. Пример грамотного оконного шпиона - WinSpy++ (от J.Brown).
Редакторы и перекройщики ресурсов. Редакторы ресурсов - незаменимые инструменты. Порой достаточно просто удалить назойливое окно-напоминание (Nag-screen) из ресурсов и программа взломана (как например в WinRAR). Так же можно изменять стили элементов управления, что позволяет, например неактивное сделать активным, или невидимое - видимым. Ещё эти программы часто применяют для создания локализаций для программного обеспечения. Примерами таких утилит могут служить Resource Hacker или Restorator.
Перекройщики ресурсов в свою очередь используются для того, чтобы восстанавливать секцию ресурсов (.rsrc), после распаковки программы, или снятия с неё навесного протектора. Например, инструмент под названием ResFixer (от seeQ) достаточно хорошо справляется с этой задачей.
Автоматические распаковщики. Сами по себе не столь важны, но тоже позволяют сэкономить уйму времени взломщику. А что, очень удобно например не тратить своё драгоценное время на распаковку того же AsPack или UPX (которые кстати реальной защиты дают ровно нуль, так как снимаются буквально за минуты даже вручную), а скормить его распаковщику и дело в шляпе. Для большинства упаковщиков существуют подобные программы, в основном для самых простых и распространенных, но против более сильных особей приходится сражаться вручную. Примерами автоматических распаковщиков могут служить следующие разработки: Quick Unpack, RL!dePacker.
Дамперы. Программы, которые сохраняют слепок программы в памяти на диск. Используются в большинстве случаев при распаковке. Так, дамп обычно снимается, когда подопытная программа полностью распаковалась в памяти. Остаётся восстановить таблицу импорта и присобачить ее к этому слепку, чем занимается следующий класс инструментов.
Программы для восстановления импорта. Эти программы собирают всю информацию о импортируемых программой функциях, систематизируют, сортируют и анализируют полученную информацию и на ее основе, создают новую таблицу, которая будет совместима с загрузчиком Windows. Затем просто клеят дамп и новую таблицу, получая (если повезло) новый, уже распакованный и работоспособный исполняемый файл.
Следует сказать, что существует ещё масса полезных для взломщика инструментов. Их действительно очень много, но основные и самые нужные, я (как мне кажется) описал.
Материалы, которые ожидаются в июне месяце
Здравствуйте уважаемые посетители нашего информационного Delphi-блога!
Составил для себя небольшой план, которому постараюсь придерживаться в этом месяце. По моему, это очень удобно, когда есть определённый намеченный план. Это лучше чем каждый раз думать и вспоминать, какие материалы подготовить, какие отпостить, отредактировать и т.д. По большому счёту – этот план примерный, так что не исключаются изменения (но я думаю надеюсь, это будут скорее дополнения). Как всегда, материал попытается быть для вас интересным, так что, если вы всё ещё не подписались на RSS-новости, не откладывайте это дело. Итак…
- Защита ваших Delphi-приложений от взлома (а так же их взлом глазами реверс инженера)
- Избитая, но всё ещё больная тема или размер Delphi-приложения
- Тематические форумы, сообщества и группы. А были ли специалисты?
- Работа с PE-файлами в Delphi.
- Компонента для работы с PE-файлами.
- Уроки по Delphi для новичков (не уверен, нужно ли… Буду думать. Комментарии?)
- Флеш-уроки по Olly (Лень, но подумаю…)
Пожалуй хватит на июнь, хотя сомневаюсь конечно, что и это успею. Но, терпение и труд - всё перетрут. Рад буду услышать ваши комментарии. До встречи!
Чего мне не хватает в Delphi
- Хотелось бы иметь возможность задавать значение выравнивания программных секций. Всё таки моя программа – хочу будет 2, а захочу 256. Да и нафиг мне куча ненужных мне нулей?
- Хотелось бы иметь возможность замены штатного стаба в компилированных программах. Мелочь, а приятно.
- Как я уже писал в своем комментарии на блоге Алексея, было бы очень неплохо, если бы Delphi сама могла проверять целостность себя и своих файлов. Это бы разом решило все проблемы с подобного рода вещами.
Хотелось бы иметь в палитре компонентов переключалку, которая бы позволяла вводить не начальное имя искомого компонента, а любые символы последовательно встречающиеся в имени. (Реализовано в 2009. Реализовано в Delphi 2010, может быть и раньше, но по 2006 включительно - нет. Спасибо Александру Алексееву за комментарий. )- К предыдущему неплохо бы переключалку, позволяющею вводить имя вкладки, на которой этот компонент висит. Я например, часто помню только название вкладки.
- Желания Алексея Тимохина ( TDelphi )
- Отладочные мечты Александра Алексеева ( Gun Smoker )
- Пожелания Влада (WebDelphi)
P.S. Хочу ещё, чтобы войны не было
О вложенных подпрограммах в Delphi
Доброго времени суток, дорогие читатели. Данная заметка может быть не очень большая, но тем не менее, довольно информативная. В ней я расскажу о такой полезной возможности языка Delphi, как вложенные процедуры и функции (далее автор подразумевает, что значения слов “процедура” и “функция” одинаковы. Для удобства и по привычке). На самом деле, многие программисты Delphi знают, что такая возможность в языке есть, но вот используют ее единицы. Скажу больше – многие так называемые NewSchool Delphi-программисты вообще не имеют представления, что существует подобный вид подпрограмм.
Внедрение своей DLL в среду Delphi
Данная заметка, является логическим продолжением предыдущего материала по расширению возможностей IDE. На этот раз мы внедрим в среду свою DLL-библиотеку. Для чего это можно применить? Хороший вопрос! Если честно – я пока и сам не знаю. Но надеюсь, что по мере написания данного материала, некая шальная мысля ударит в мою голову. А пока, давайте будем расценивать данную статью просто как очередную авторскую заметку, с его мыслями и соображениями. Итак, как всё будет происходить? Мы напишем некую DLL, которая будет выполнять некие полезные (?) действия, перед стартом среды.
Итак, первым делом нам нужно написать саму библиотеку. Я долго не мог придумать, что такого полезного она будет делать и моей фантазии хватило только на то, чтобы она позволяла нам выбирать, какие мастера загружать вместе со средой. То есть, перед стартом среды, появляется некое окно, в котором мы можем выбирать, какие визарды загружать, а какие нет. Это может пригодиться например при разработке подобных мастеров, вернее во время их отладки. Например если какой либо новый визард будет пестрить ошибками во время загрузки IDE, тем самым не давая ей нормально работать – мы сможем его отключить, очень удобным образом.
Расширяем возможности Delphi / Builder IDE
unit WinSwap;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms;
type
TWinSwap = class(TObject)
private
fIDE:TApplication;
procedure PressKey(Key:Word);
protected
procedure IDEMessage(var Msg: TMsg; var Handled: Boolean);
public
property IDE:TApplication read fIDE write fIDE;
end;
var
oSwaper: TWinSwap;
implementation
procedure SwapInit;
begin
{ связываем поле fIDE со средой Delphi }
oSwaper.IDE := Application;
{ устанавливаем новый обработчик OnMessage }
oSwaper.IDE.OnMessage := oSwaper.IDEMessage;
end;
{ TWinSwap }
procedure TWinSwap.IDEMessage(var Msg: TMsg; var Handled: Boolean);
begin
if IDE.Active then
begin
if Msg.Message = WM_MBUTTONUP then
PressKey(VK_F12);
end
else
Exit;
end;
procedure TWinSwap.PressKey(Key: Word);
begin
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;
initialization
oSwaper := TWinSwap.Create;
{ инициализируем расширение }
SwapInit;
finalization
{ скидываем обработчик }
oSwaper.IDE.OnMessage := nil;
oSwaper.Free;
end.Установка
Правильная версия
Если вы прочитаете комментарии ниже, поймете, что данная версия кода мягко говоря не очень правильная. Как я там написал, что:
Если написать ещё один подобный (компонент?, даже не знаю как правильно назвать) модуль. То при его инициализации, обработчик OnMessage как бы перекроет обработчики всех остальных, инсталлированых до него, что собственно одно и тоже (с небольшими поправками), о чём говорил USoft.
Я немного дополнил код, следуя совету USoft. Проверял на 10ти таких установленных в систему расширений. Теперь всё работает прекрасно. Испытания проводил в двух средах: D7, D2k6.
Хотел бы отдельно поблагодарить Алексея Тимохина за расшифровку совета USoft и USoft'a, за дельный совет. Спасибо, коллеги.Итак, правильная версия скорее всего должна быть такая:
unit WinSwap;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms;
type
TIDEHandler = procedure (var Msg:TMsg; var Handled: Boolean) of object;
TWinSwap = class(TObject)
private
fIDE:TApplication;
fIDEHandler:TIDEHandler;
procedure PressKey(Key:Word);
protected
procedure IDEMessage(var Msg: TMsg; var Handled: Boolean);
procedure BuffHandler;
public
property IDE:TApplication read fIDE write fIDE;
property Handler:TIDEHandler read fIDEHandler write fIDEHandler;
end;
var
oSwaper: TWinSwap;
implementation
procedure SwapInit;
begin
{ связываем поле fIDE со средой Delphi }
oSwaper.IDE := Application;
oSwaper.BuffHandler;
{ устанавливаем новый обработчик OnMessage }
oSwaper.IDE.OnMessage := oSwaper.IDEMessage;
end;
{ TWinSwap }
procedure TWinSwap.BuffHandler;
begin
Handler := oSwaper.IDE.OnMessage;
end;
procedure TWinSwap.IDEMessage(var Msg: TMsg; var Handled: Boolean);
begin
if IDE.Active then
begin
if Msg.Message = WM_MBUTTONUP then
PressKey(VK_F12);
Handler(Msg,Handled);
end
else
begin
Handler(Msg,Handled);
Exit;
end;
end;
procedure TWinSwap.PressKey(Key: Word);
begin
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;
initialization
oSwaper := TWinSwap.Create;
{ инициализируем расширение }
SwapInit;
finalization
{ скидываем обработчик }
oSwaper.IDE.OnMessage := nil;
oSwaper.Free;
end.
