IT-Блог о программировании и операционных системах

Защита Delphi-программ от взлома. Часть I – Инструментальная

Комментариев нет:

Немного истории или cracked by Bill Gilbert

Во времена титанов, древних богов, мифов и легенд... Ах, нет, простите, на самом деле это случилось гораздо позднее, годах эдак в 80х. Во времена небезызвестных Спекки существовали программы. Были они всякими, маленькими и большими, нужными и не очень, всякие, в общем, они были. Создавались и игрушки разных мастей. Ну это и естественно, куда же без них, без игр? Кто-то до сих пор не прочь запустить на эмуляторе старый добрый Саботейр и порулить крутым ниндзя, надавать врагам по голове, спасти мир и улететь на вертолёте во вторую часть игры, в которой как ни странно фигурирует уже не ниндзя, а ниндзюха (или ниндзяха?), короче ниндзя - женщина (эдакая женониндзя). На самом же деле это была сестра того ниндзя, который из первой части. Ну вот, опять отвлекаюсь на свою любимую игрушку для Speccy...

Кому-то очень захотелось чтобы и жизнь бесконечная и патроны как говорится не кончались, ну знаете, как в американском кино, где главный герой (хороший парень или попросту - "наш") выстреливает в главного злодея все 30 патронов из своей Береты 92, в которой по определению больше 15ти не помещается. Но и это не всё! У него остаётся один патрон для последнего фаталити, коим он воспользуется и застрелит таки злодея. Супер-герой чувствует себя умеренно нормально, при этом у него как минимум 3 ранения и кровь хлещет как со свиньи! Но он должен выжить, ведь он - наш, хороший парень.

Bill_Gilbert_Logo Exolon_Screen_Stawicki

Так почему бы и своим компьютерным хорошим парням не дать тот бесконечный боезапас, не подарить "немного" дополнительной жизни? Так, скорее всего думал паренёк с именем (или скорее всего ником) 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. Затем просто клеят дамп и новую таблицу, получая (если повезло) новый, уже распакованный и работоспособный исполняемый файл.

Следует сказать, что существует ещё масса полезных для взломщика инструментов. Их действительно очень много, но основные и самые нужные, я (как мне кажется) описал.

Материалы, которые ожидаются в июне месяце

3 комментария:

3dhelmet57

Здравствуйте уважаемые посетители нашего информационного Delphi-блога!

Составил для себя небольшой план, которому постараюсь придерживаться в этом месяце. По моему, это очень удобно, когда есть определённый намеченный план. Это лучше чем каждый раз думать и вспоминать, какие материалы подготовить, какие отпостить, отредактировать и т.д. По большому счёту – этот план примерный, так что не исключаются изменения (но я думаю надеюсь, это будут скорее дополнения). Как всегда, материал попытается быть для вас интересным, так что, если вы всё ещё не подписались на RSS-новости, не откладывайте это дело. Итак…

  • Защита ваших Delphi-приложений от взлома (а так же их взлом глазами реверс инженера)
  • Избитая, но всё ещё больная тема или размер Delphi-приложения
  • Тематические форумы, сообщества и группы. А были ли специалисты?
  • Работа с PE-файлами в Delphi.
  • Компонента для работы с PE-файлами.
  • Уроки по Delphi для новичков (не уверен, нужно ли… Буду думать. Комментарии?)
  • Флеш-уроки по Olly (Лень, но подумаю…)

Пожалуй хватит на июнь, хотя сомневаюсь конечно, что и это успею. Но, терпение и труд - всё перетрут. Рад буду услышать ваши комментарии. До встречи!

Чего мне не хватает в Delphi

8 комментариев:
Недавно комментировал пост Алексея Тимохина на одноимённую тему и понял, что есть определённые вещи, которые бы не помешали мне в Delphi. Итак, я начну:
  • Хотелось бы иметь возможность задавать значение выравнивания программных секций. Всё таки моя программа – хочу будет 2, а захочу 256. Да и нафиг мне куча ненужных мне нулей?
  • Хотелось бы иметь возможность замены штатного стаба в компилированных программах. Мелочь, а приятно.
  • Как я уже писал в своем комментарии на блоге Алексея, было бы очень неплохо, если бы Delphi сама могла проверять целостность себя и своих файлов. Это бы разом решило все проблемы с подобного рода вещами.
  • Хотелось бы иметь в палитре компонентов переключалку, которая бы позволяла вводить не начальное имя искомого компонента, а любые символы последовательно встречающиеся в имени. (Реализовано в 2009. Реализовано в Delphi 2010, может быть и раньше, но по 2006 включительно - нет. Спасибо Александру Алексееву за комментарий. )
  • К предыдущему неплохо бы переключалку, позволяющею вводить имя вкладки, на которой этот компонент висит. Я например, часто помню только название вкладки.
Хотелки других Delphi-разработчиков:

P.S. Хочу ещё, чтобы войны не было

О вложенных подпрограммах в Delphi

5 комментариев:

Доброго времени суток, дорогие читатели. Данная заметка может быть не очень большая, но тем не менее, довольно информативная. В ней я расскажу о такой полезной возможности языка Delphi, как вложенные процедуры и функции (далее автор подразумевает, что значения слов “процедура” и “функция” одинаковы. Для удобства и по привычке). На самом деле, многие программисты Delphi знают, что такая возможность в языке есть, но вот используют ее единицы. Скажу больше – многие так называемые NewSchool Delphi-программисты вообще не имеют представления, что существует подобный вид подпрограмм.

Внедрение своей DLL в среду Delphi

7 комментариев:

Данная заметка, является логическим продолжением предыдущего материала по расширению возможностей IDE. На этот раз мы внедрим в среду свою DLL-библиотеку. Для чего это можно применить? Хороший вопрос! Если честно – я пока и сам не знаю. Но надеюсь, что по мере написания данного материала, некая шальная мысля ударит в мою голову. А пока, давайте будем расценивать данную статью просто как очередную авторскую заметку, с его мыслями и соображениями. Итак, как всё будет происходить? Мы напишем некую DLL, которая будет выполнять некие полезные (?) действия, перед стартом среды.

Итак, первым делом нам нужно написать саму библиотеку. Я долго не мог придумать, что такого полезного она будет делать и моей фантазии хватило только на то, чтобы она позволяла нам выбирать, какие мастера загружать вместе со средой. То есть, перед стартом среды, появляется некое окно, в котором мы можем выбирать, какие визарды загружать, а какие нет. Это может пригодиться например при разработке подобных мастеров, вернее во время их отладки. Например если какой либо новый визард будет пестрить ошибками во время загрузки IDE, тем самым не давая ей нормально работать – мы сможем его отключить, очень удобным образом.

Расширяем возможности Delphi / Builder IDE

5 комментариев:
В данной заметке, хочу поделиться с вами хорошим примером написания модуля, с помощью которого можно добавить новые возможности в вашу Delphi IDE.
Пример из этой статьи довольно простой, но между тем и очень эффективный. Он позволяет очень легко добавить обработчик события (назовём его обработчиком нажатия средней кнопки мыши), в среду Delphi, путём обработки сообщений Windows.
Пусть, для примера, в обработчике будет выполняться код, отвечающий за программное нажатие клавиши F12, тем самым позволяя нам переключаться между окнами исходного кода и дизайнера форм по средней кнопке мыши. Очень удобно, правда?
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.
Как видите, код не самый сложный и разобраться в нём не составит никакого труда. Ключевые строки располагаются в процедуре SwapInit. Происходит присвоение значения объекта Application (которое рассматривается как объект самой среды) полю fIDE типа TApplication и затем устанавливаем новый обработчик OnMessage уже самой IDE.
Таким образом можно обрабатывать многие полезные сообщения, приходящие из вне. Можно работать с отдельными частями IDE как с простыми компонентами, средствами объекта Application.  Вообщем можно много всего, главное приложить немного фантазии, которой у меня к сожалению не много.

Установка

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

Правильная версия


Если вы прочитаете комментарии ниже, поймете, что данная версия кода мягко говоря не очень правильная. Как я там написал, что:


Если написать ещё один подобный (компонент?, даже не знаю как правильно назвать) модуль. То при его инициализации, обработчик 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.

Отладка Delphi-приложений в OllyDbg

14 комментариев:
Отличная всё таки вещь – привычка. Нет, я не про вредные привычки говорю, не переживайте, я имею ввиду правильные, профессиональные привычки. Пить и курить безусловно вредно, а вот использовать совместно прекрасные программные средства – нисколько, одна только польза. Почему именно в Olly, если есть прекрасный интегрированный в среду Delphi отладчик? Нет, друзья мои, я не пытаюсь сказать, что штатный отладчик плох, или не справляется со своими обязанностями, ни в коем случаи, просто, это дело привычки. И чтоб меня десять раз ударили томом Кнутта, если я такой один. И действительно, отладчик Olly приобрёл большую популярность как среди программистов, так и среди любителей покопаться в кишках некой платной утилиты. Ещё бы: куча возможностей, удобство использования, куча плагинов в конце концов, всё это делает отладчик Olly прекрасным инструментом для любого мало-мальски профессионального разработчика. Так же скажу, что данная заметка больше будет интересна тем программистам, которые не используют OllyDbg, но хотели бы познакомиться с этим инструментом поближе.
Предвкушаю шквал вопросов, летящих в мою сторону. Как нам, Delphi разработчикам отлаживать программу, если эта Olly просто пестрит ассемблерными инструкциями! Где наш нормальный паскалевский код? Секундочку! А разве в дельфовом отладчике нет окна CPU, с такими-же инструкциями? Есть. Да и окошко с нормальным исходником там тоже имеется, его просто нужно включить. Как, читаем дальше.

Пользовательские события для начинающих

2 комментария:
У новичков зачастую возникает проблема, создание собственных событий, отличных от событий Windows. Примером таких событий может быть, изменение каких-то данных, запуск какого-то метода и т.д. Delphi предлагает довольно простое и понятное решение для такого рода задач.

А теперь посмотрим как это делается. Создадим новое приложение и отдельный модуль uTest.
В этом модуле, создадим свой класс, который будет реализовывать хранение какой то текстовой информации.

TTextClass = class
  private
    FData: string
    procedure SetData(const Value: string);
  public
    property Data: string read FData write SetData;
end;

Теперь объявим класс-события:

TTextNotify = procedure(Sender: TObject; Text: string) of object;

Входные параметры определяются пользователем, по необходимости. В нашем случае мы определяем переменную типа TObject для передачи экземпляра класса и строковую переменную для передачи значения данных хранящихся в экземпляре.

Теперь объявим события, которые будут реагировать на 2 события:
- До редактирования текста
- После редактирования текст

TTextClass = class  
  private  
    FAfterSetText: TTextNotify;  
    FBeforeSetText: TTextNotify;  
    FData: string;  
    procedure SetData(const Value: string);  
  public  
    property Data: string read FData write SetData;  
    property BeforeSetText: TTextNotify read FBeforeSetText write FBeforeSetText;  
    property AfterSetText: TTextNotify read FAfterSetText write FAfterSetText;  
  end;

Ну а теперь осталось только написать вызовы данных событий

procedure TTextClass.SetData(const Value: string);  
begin  
  // Если определен метод обработки события, тогда вызываем его  
  if Assigned(FBeforeSetText) then FBeforeSetText(Self, Value);  
  FData := Value;  
  // Если определен метод обработки события, тогда вызываем его  
  if Assigned(FAfterSetText) then FAfterSetText(Self, Value);    
end;

Вот мы и создали свое пользовательское событие. А теперь пример использования. В главной форме приложения пишем следующий код:

unit Main;    
interface  
uses  
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  Dialogs, uTest;  
type  
  TfrmMain = class(TForm)  
    procedure FormCreate(Sender: TObject);  
    procedure FormDestroy(Sender: TObject);  
    procedure FormClick(Sender: TObject);  
  private  
    FText: TTextClass;  
  public  
     // Объявляем переменную созданного нами класса  
    property Text: TTextClass read FText write FText;      
    // Процедура реагирование на событие – ДоИзменение текста.   
    //Входные параметры должны соответствовать типу события(в нашем случае TTextNotify)  
    procedure DoBeforeSetText(Sender: TObject; Text: string);  
    // Процедура реагирование на событие – ПослеИзменение текста.  
    procedure DoAfterSetText(Sender: TObject; Text: string);       
  end;  
var  
  frmMain: TfrmMain;  
implementation  

{$R *.dfm}
  
procedure TfrmMain.FormCreate(Sender: TObject);  
begin  
  Text := TTextClass.Create;  
  Text.Data := 'Test1';    
  Text.BeforeSetText := DoBeforeSetText;  
  Text.AfterSetText := DoAfterSetText;  
end;

procedure TfrmMain.FormDestroy(Sender: TObject);  
begin  
  Text.Free;  
end;

procedure TfrmMain.DoAfterSetText(Sender: TObject; Text: string);  
begin  
  ShowMessage(Text);  
end;

procedure TfrmMain.DoBeforeSetText(Sender: TObject; Text: string);  
begin  
  ShowMessage(Text);  
end;

procedure TfrmMain.FormClick(Sender: TObject);  
begin  
  Text.Data := 'Test2';  
end;  
end.

Если все сделали правильно, то после клика по форме, сначала покажется сообщение с «Тест1», а потом «Тест2». Таким же образом можно объявлять собственные события, и для визуальных компонент, и прочих классов которые можно написать в Delphi.

Проверка валидности PE-файла

Комментариев нет:
Автор: Goppit / ARTeam [www.accessroot.com]
Перевод: Rob [www.delphiday.blogspot.com]

В этом туториале мы напишем простое приложение, которое использует штатное диалоговое окно выбора, для открытия файлов и выводит информацию о том, является ли выбранный файл правильным PE или нет. Код приложения основан на втором туториале от Iczelion, но я несколько изменил его, для пущей простоты и наглядности и выдрал SEH.

Обычно, для проверки того, что файл является правильным PE, нам необходимо проверить два условия. Необходимо, чтобы текст в начале DOS заголовка имел значение “MZ” и в конце самого DOS заголовка имелся указатель на заголовок PE, который в свою очередь начинается с “PE”, который завершается двумя нулевыми байтами. Эти сигнатуры объявлены в инклуднике windows.inc и имеют следующий вид:

IMAGE_DOS_SIGNATURE   equ   5A4Dh        ("MZ")
IMAGE_NT_SIGNATURE    equ   00004550h    ("PE" 00 00)

Взлом Delphi компонент на примере TAdvMemo от TMS Software

9 комментариев:
Существует огромное множество нужных и не очень компонентов. Красивых и довольно аскетичных, бесплатных и платных. Платные компоненты как правило, функциональны, востребованы в большинстве случаев, красиво выглядят, как с точки зрения кода, так и интерфейса. Оно и правильно, ведь они созданы для того, чтобы быть проданными. Одним из таких компонентов является TAdvMemo, от конторы TMS Software. Если вы не сталкивались с ним, то советую вам прочитать мой мини-обзор на эту тему. Компонент действительно заслуживает внимания.

Простой шаблон кейгена

Комментариев нет:
Автор: Goppit / ARTeam [www.accessroot.com]
Перевод: Rob [www.delphiday.blogspot.com]
Номер тьюториала: #6, Simple Keygen Template.

В этом уроке мы напишем простой кейген и добавим в него пример кода простой генерации ключа, которая в последствии может быть улучшена до настоящего алгоритма генерации выдранного из любого программного обеспечения. Так же мы добавим в кейген код который позволяет копировать наш готовый (сгенерированный ключ ) в буффер обмена windows.

Динамическая загрузка строк из STRINGTABLE

2 комментария:
Как вы знаете, таблицы строк имеют неоспоримые преимущества перед строками, которые вы вставляете в свою программу непосредственно на этапе проектирования. Таких преимуществ, по крайней мере, два:

1. Для таких строк память не будет выделяться до того момента, когда этого не потребует ваше приложение или этого не захотите вы.

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

Приведу пример программы, которая в зависимости от выбора пользователя, устанавливает тот, или иной язык интерфейса. Нарисуйте форму следующего вида:


Имена управляющих элементов дефолтные, для удобства. Определим новые методы в классе TForm1:

• Procedure SetLanguage (LangFile:String);
• Procedure SelectLanguage (Language:TLang);

Так же определим новый тип: TLang = (lgRUS,lgENG); И запрограммируем наши новые методы:

procedure TForm1.SetLanguage(LangFile: String);
const
  NULL = 0;
var
  DLLHwnd:THandle;
  chBuff:array [0..255] of Char;
  i:integer;
begin
  DLLHwnd := LoadLibrary(PChar(ExtractFilePath(Application.ExeName)+'\lang\'+LangFile));
  if DLLHwnd <= NULL then
    Application.MessageBox('Не удаётся загрузить файл языка!','Ошибка!',MB_ICONERROR)
  else
   begin
    try
      for i := 1 to 5 do
        begin
          LoadString(DLLHwnd,i,@chBuff,sizeof(chBuff));
          case i of
            1: Button1.Caption := StrPas(chBuff);
            2: Button2.Caption := StrPas(chBuff);
            3: Form1.Caption   := StrPas(chBuff);
            4: Button3.Caption := StrPas(chBuff);
            5: Button4.Caption := StrPas(chBuff);
          end;
        end;
    except
     Application.MessageBox('Вы уж простите но чёт случилось! =)','Ошибка!',MB_ICONERROR)
    end;
   end;
end;

procedure TForm1.SelectLanguage(Language: TLang);
begin
  case Language of
    lgRUS: Self.SetLanguage('Russian.dll');
    lgENG: Self.SetLanguage('English.dll');
  end;
end;
На событие OnChange управляющего элемента ComboBox1 напишите следующий код:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.Text = 'Русский' then Self.SelectLanguage(lgRUS)
    else if ComboBox1.Text = 'English' then Self.SelectLanguage(lgENG);
end;
В ComboBox1 у нас два элемента: Русский и English. При выборе одного из двух значений, происходит обращение к методу SelectLanguage с определённым параметром, который в свою очередь обращается к методу SetLanguage и передаёт в него строку. Эта строка является именем той библиотеки, которая содержит строки на выбранном языке.

В общем, метод SetLanguage и загружает строки для определённого языка, а так же устанавливает заголовки всех элементов управления. Код достаточно прост для понимания, так что комментариев приводить больше нет смысла. Единственное замечание: если вы впервые используете функцию LoadString, уточните её описание в MSDN. Скажу только, что 2,3 и 4 – это номер ресурса-строки в библиотеке, указатель на буфер, в который будет считана строка, размер буфера.

Теперь давайте посмотрим, как создать DLL со строковыми ресурсами:
Прежде всего в директории с проектом необходимо создать файл с расширением *.rc следующего содержания:
STRINGTABLE
{
1, "&Удалить"
2, "&Добавить"
3, "Простое приложение для демонстрации таблиц строк"
4, "Вы&ход"
5, "О программе..."
}
Как вы видите, это сами строки и их номера. Теперь следует откомпилировать этот файл компилятором ресурсов BRCC32.EXE который естественно входит в поставку Delphi. После компиляции, новоиспечённый файл *.res можно как обычно прилинковывать к проекту DLL. Следует сказать, что сама библиотека может и не содержать ни одной экспортируемой функции, в этом случаи DLL будет содержать только ресурсы.

Компонента TAdvMemo от компании TMS

Комментариев нет:

Вообще я не большой поклонник сторонних компонентов, а особенно платных, но, взглянув на возможности этого, я подумал, что стоит определённо его попробовать. Что же он из себя представляет? Да в нём есть всё, что может понадобиться при разработке редакторов кода, чатов, блокнотов и т.д. В общем, всего, где должна быть гибкая и красивая Memo.

Давайте я расскажу побольше о возможностях этого компонента, а вы тем временем поставьте на закачку архив компонента, который находится по этому адресу. Во первых – это полностью настраиваемая и гибкая система подсветки программного кода. Всё это дело реализовано в виде дополнительных компонент, которые и отвечают за подсветку. Так, например дополнительная компонента AdvPascalMemoStyler отвечает за распознавание и окраску паскалевского кода, а AdvPHPMemoStyler – за PHP.

Так же, очень понравилась возможность компоненты под названием AutoCorrect, которая особенно пригодится разработчикам чатов или IDE. Работает она достаточно тривиально, простой заменой одного на другое. Ну, например мы пишем prcedure а она нам заменяет его на procedure. В чатах, например таким образом можно вырезать мат и оскорбления. На самом деле можно придумать многие пути применения этой возможности. Единственное, это нельзя заменить многострочный текст на многострочный, так как строки заменяемые и заменяющие находятся в двух разных массивах TStringList, где один элемент – одна строка.

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

Описывать все возможности данной компоненты можно достаточно долго. Стоит ещё сказать, что можно присмотреться к другим вкусным вещам, например, полю UndoLimit, которое позволяет задать максимальное число отмен изменений (клавишами Ctrl+Z). Возможности AutoCompletion, гибко кстати настраиваемой. Для тех, кто не понял, AutoCompletion – это функция автозавершения строки. Например, вы пишите Show, и в окошке выводятся варианты сниппетов кода, которые начинаются с Show. Очень полезно.

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

Есть в этом чуде одна большая ложка дёгтя. Компонент платный. При бесплатном использовании (Demo режим), он работает нормально, но только пока работает в контексте IDE (как и многие другие платные компоненты). Да и копирайт в самой Memo трудно не заметить. Но нужно отдать должное, при закрытии IDE, компонента всё-таки остаётся работоспособной, в отличие от многих других платных разработок. Правда выдаёт при запуске приложения окошко, что мол триал версия наших компонентов используется в этой разработке.


Кстати, если вам будет интересно, я могу рассказать, как обходить регистрацию в подобных компонентах. Это несложно, так что думаю, в следующих постах я обязательно расскажу об этой теме. Ну а пока, спасибо как говорится за внимание. До следующих постов дорогие друзья.