Существует огромное множество нужных и не очень компонентов. Красивых и довольно аскетичных, бесплатных и платных. Платные компоненты как правило, функциональны, востребованы в большинстве случаев, красиво выглядят, как с точки зрения кода, так и интерфейса. Оно и правильно, ведь они созданы для того, чтобы быть проданными. Одним из таких компонентов является TAdvMemo, от конторы TMS Software. Если вы не сталкивались с ним, то советую вам прочитать мой мини-обзор на эту тему. Компонент действительно заслуживает внимания.
IT-Блог о программировании и операционных системах
Простой шаблон кейгена
Автор: Goppit / ARTeam [www.accessroot.com]
Перевод: Rob [www.delphiday.blogspot.com]
Номер тьюториала: #6, Simple Keygen Template.
В этом уроке мы напишем простой кейген и добавим в него пример кода простой генерации ключа, которая в последствии может быть улучшена до настоящего алгоритма генерации выдранного из любого программного обеспечения. Так же мы добавим в кейген код который позволяет копировать наш готовый (сгенерированный ключ ) в буффер обмена windows.
Перевод: Rob [www.delphiday.blogspot.com]
Номер тьюториала: #6, Simple Keygen Template.
В этом уроке мы напишем простой кейген и добавим в него пример кода простой генерации ключа, которая в последствии может быть улучшена до настоящего алгоритма генерации выдранного из любого программного обеспечения. Так же мы добавим в кейген код который позволяет копировать наш готовый (сгенерированный ключ ) в буффер обмена windows.
Динамическая загрузка строк из STRINGTABLE
Как вы знаете, таблицы строк имеют неоспоримые преимущества перед строками, которые вы вставляете в свою программу непосредственно на этапе проектирования. Таких преимуществ, по крайней мере, два:
1. Для таких строк память не будет выделяться до того момента, когда этого не потребует ваше приложение или этого не захотите вы.
2. При помощи библиотек (DLL) со строковыми ресурсами, вы сможете легко и непринуждённо разрабатывать локализованное программное обеспечение, не используя сторонних компонентов (я видел только один компонент по этой теме, который мне всё-таки пришёлся по душе, кажется из пакета VGLib, но точно сказать не могу).
Приведу пример программы, которая в зависимости от выбора пользователя, устанавливает тот, или иной язык интерфейса. Нарисуйте форму следующего вида:

Имена управляющих элементов дефолтные, для удобства. Определим новые методы в классе TForm1:
• Procedure SetLanguage (LangFile:String);
• Procedure SelectLanguage (Language:TLang);
Так же определим новый тип: TLang = (lgRUS,lgENG); И запрограммируем наши новые методы:
В общем, метод SetLanguage и загружает строки для определённого языка, а так же устанавливает заголовки всех элементов управления. Код достаточно прост для понимания, так что комментариев приводить больше нет смысла. Единственное замечание: если вы впервые используете функцию LoadString, уточните её описание в MSDN. Скажу только, что 2,3 и 4 – это номер ресурса-строки в библиотеке, указатель на буфер, в который будет считана строка, размер буфера.
Теперь давайте посмотрим, как создать DLL со строковыми ресурсами:
Прежде всего в директории с проектом необходимо создать файл с расширением *.rc следующего содержания:
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. Очень полезно.
Конечно, все возможности данной компоненты я описать не могу, в силу того, что пока что я их и сам не знаю. Но сказать, что эту разработку посмотреть определённо стоит, я могу, что собственно и делаю в этих строках.
Кстати, если вам будет интересно, я могу рассказать, как обходить регистрацию в подобных компонентах. Это несложно, так что думаю, в следующих постах я обязательно расскажу об этой теме. Ну а пока, спасибо как говорится за внимание. До следующих постов дорогие друзья.
Скелет программы на ассемблере
Автор: Goppit / ARTeam [www.accessroot.com]
Перевод: Rob [www.delphiday.blogspot.com]
Номер тьюториала: #1, Basic Assembly Program Skeleton.
Перевод: Rob [www.delphiday.blogspot.com]
Номер тьюториала: #1, Basic Assembly Program Skeleton.
Использование WinAsm
На следующем скриншоте запечатлёна часть интерфейса среды WinASM. Исходный код, который вы набираете, появляется в левой части среды – в панели исходного кода. Панель обзора отображает файлы, которые в свою очередь являются частью текущего проекта (файлы исходного кода - *.asm, инклудники - *.inc, файлы ресурсов, и т.д). Кнопка “Go All” (на скриншоте указана курсором мыши) соберёт, слинкует и запустит на выполнение результирующий exe файл. Комманды ассемблера и линковщика с результатами компиляции и компоновки вы можете лицезреть в нижнем окне – в панели вывода.Delphi. Как написать лоадер
Автор: Sunshine [www.sunshine2k.de]
Перевод: Rob [www.delphiday.blogspot.com]
От переводчика:
В данном тьюториале, я постараюсь объяснить, как написать лоудер для программы, если вы не хотите или не можете патчить программу стандартным способом, если например она запакована или проверяет свою контрольную сумму перед выполнением, или что либо ещё – причин для этого может быть много.
В своё время, я долго пытался найти статью, которая бы пролила свет на эту тему и тот туториал, что я нашел оказался на ассемблере, который я ещё мало понимал (пока!). Вот почему я решил написать статью, по программированию лоудера на Delphi.
Я написал простой крякми, который будет взломан с помощью нашего с вами лоудера. Но учтите, что реальную запакованную программу пропатчить будет сложнее, нежели наш крякми. Давайте начнём!
Перевод: Rob [www.delphiday.blogspot.com]
От переводчика:
Данный тьюториал покажет основы написания лоудеров. Написан начинающим немецким реверсером и программистом. Изложено доступно, приведён исходный код лоудера. Перевод в некоторых местах вольный. Автор статьи постарался доступным языком, для таких же новичков как и он, обьяснить то, чего сам не мог понять из за отсутствия материала, то есть той базы, которой некоторое время не хватало ему. Статья будет очень интересна новичкам в реверсинге и программировании.
В данном тьюториале, я постараюсь объяснить, как написать лоудер для программы, если вы не хотите или не можете патчить программу стандартным способом, если например она запакована или проверяет свою контрольную сумму перед выполнением, или что либо ещё – причин для этого может быть много.
В своё время, я долго пытался найти статью, которая бы пролила свет на эту тему и тот туториал, что я нашел оказался на ассемблере, который я ещё мало понимал (пока!). Вот почему я решил написать статью, по программированию лоудера на Delphi.
Я написал простой крякми, который будет взломан с помощью нашего с вами лоудера. Но учтите, что реальную запакованную программу пропатчить будет сложнее, нежели наш крякми. Давайте начнём!
Исключите всё элементы из Auto Create Forms, кроме главной формы
Очень часто, особенно при разработке больших приложений приходится задействовать дополнительные формы (формы настроек программы, формы прогресса операций и т.д.). По дефолту, все они создаются автоматически при запуске приложения и висят в памяти ожидая от вас методы Show или ShowModal, дабы показать свои толстые морды. Как вы понимаете, они не только увеличивают время загрузки программы, но и расходуют некоторый объём оперативной памяти машины, что приводит к тормознутости ваших разработок, особенно когда машина и так не очень мощная. Вместо того, чтобы грузить все формы сразу, следует создавать их по мере необходимости, а уже потом показывать пользователю.
В файле проекта убирайте всё, что не относится к созданию главной формы. Например, вот так:
А остальные формы создавайте только по мере необходимости. Например, так:
К тому же, редко используемые формы, такие как форма “О программе…” желательно вообще освобождать при закрытии методом Free и обнулять значением nil. Для чего – ясно. Стоит заметить, что в таких случаях, как вы наверное уже догадались, новая форма будет создаваться вновь и вновь, при каждом вызове метода ShowAboutBox. Я обычно в таких случаях просто затеняю ту кнопку или другой контрол, который вызывает метод (что конечно не совсем по правилам прилежного программирования), однако вы можете использовать примерно следующюю конструкцию:
Итак, обрисовывается полная картина использования таких форм. На примере нашей формы вывода информации о программе, привожу следующий код:
Если у вас есть достаточно большие проекты, которые используют множество форм создавая их автоматически, не ленитесь, перепишите их опираясь на данную статью. Это не займёт у вас много времени и Вы сразу заметите повышение скорости работы и уменьшение расхода оперативной памяти.
В файле проекта убирайте всё, что не относится к созданию главной формы. Например, вот так:
Application.Initialize; Application.CreateForm(TForm1, Form1); // Application.CreateForm(TForm2, Form2); // Application.CreateForm(TForm3, Form3); // Application.CreateForm(TForm4, Form4); // Application.CreateForm(TForm5, Form5); Application.Run;
А остальные формы создавайте только по мере необходимости. Например, так:
procedure TForm1.ShowAboutBox(); begin Application.CreateForm(TForm2, Form2); Form2.Show; end;
К тому же, редко используемые формы, такие как форма “О программе…” желательно вообще освобождать при закрытии методом Free и обнулять значением nil. Для чего – ясно. Стоит заметить, что в таких случаях, как вы наверное уже догадались, новая форма будет создаваться вновь и вновь, при каждом вызове метода ShowAboutBox. Я обычно в таких случаях просто затеняю ту кнопку или другой контрол, который вызывает метод (что конечно не совсем по правилам прилежного программирования), однако вы можете использовать примерно следующюю конструкцию:
if not Assigned(Form2) then Application.CreateForm(TForm2, Form2); Form2.Show;
Итак, обрисовывается полная картина использования таких форм. На примере нашей формы вывода информации о программе, привожу следующий код:
procedure TMainForm.AboutButtonClick(Sender: TObject); begin Self.ShowAboutBox; end; procedure TMainForm.ShowAboutBox; begin if not Assigned(AboutBox) then Application.CreateForm(TAboutBox, AboutBox); AboutBox.Show; end; procedure TAboutBox.FormClose(Sender: TObject; var Action: TCloseAction); begin Self.Free; AboutBox:=nil; end;
Если у вас есть достаточно большие проекты, которые используют множество форм создавая их автоматически, не ленитесь, перепишите их опираясь на данную статью. Это не займёт у вас много времени и Вы сразу заметите повышение скорости работы и уменьшение расхода оперативной памяти.
Доступ к -4 смещению дельфовой строки
Часто слышишь о том, что по смещению -4 от начала строки находится двойное слово с её длиной и количеством ссылок по смещению -8. Но обычная конструкция вида string[-4]{[-8]} компилироваться категорически отказывается, тыкая мессагой про какие то там границы диапозонов… Но как так? Если в делфи строке там лежит длина, то почему её нельзя взять или изменить? На самом деле можно, и ещё как… Хотя компилятор и отказывается нас туда пускать, мы пойдём обходным путём, прибегнув к ассемблерным вставкам:
Алгоритм предельно прост. Так как по умолчанию параметры передаются в регистрах, то указатель на нашу строку попадает в регистр EAX. И теперь мы копируем в EAX двойное слово, которое располагается по адресу EAX-4. Кстати изменить длину строки так же легко:
Всё одно и тоже, только теперь мы из регистра записываем в пямять. Такими же методами, мы можем получить или устанавливать количество ссылок на строку, используя -8 смещение. Конечно, мы можем описать вышеприведённые действия и не прибегая к ассемблеру, но конструкции вида:
Нравятся не всем.
Кстати, таким нехитрым трюком можно брать значение по -8 адресу (кол-во указателей на строку). И даже менять это значение ;)
function asm_strlen(s:string):integer; asm mov eax,dword ptr[eax-4] end;
Алгоритм предельно прост. Так как по умолчанию параметры передаются в регистрах, то указатель на нашу строку попадает в регистр EAX. И теперь мы копируем в EAX двойное слово, которое располагается по адресу EAX-4. Кстати изменить длину строки так же легко:
procedure asm_setlen(s:string;Size:Dword); asm mov dword ptr[eax-4],edx end;
Всё одно и тоже, только теперь мы из регистра записываем в пямять. Такими же методами, мы можем получить или устанавливать количество ссылок на строку, используя -8 смещение. Конечно, мы можем описать вышеприведённые действия и не прибегая к ассемблеру, но конструкции вида:
procedure(...) Dword(Pointer(Dword(Pointer(Str))-4)^) := size; end; ...
Нравятся не всем.
Кстати, таким нехитрым трюком можно брать значение по -8 адресу (кол-во указателей на строку). И даже менять это значение ;)
Подписаться на:
Сообщения (Atom)
