Создание COM-сервера - Virmaking на Delphi - Каталог статей - Вирусология, исходники и статьи... взгляд из Delphi
Суббота, 24.04.2010, 08:19
| RSS
Вирусология, взгляд из Delphi
Главная
Меню сайта

Категории раздела
Вирусология [9]
Статьи о вирусах
HTML программирование [2]
Теги
Delphi программирование [32]
Тоько Delphi
Хакинг в Delphi [7]
И не только!
Virmaking на Delphi [24]
Вирусонаписание
Приколы на Delphi [4]
Пишем шуточные програмки
Bat скрипты [3]
Ваt coding
Хакинг [10]
взлом

Администрация
184023 Dolphin

Наша кнопка

Вирусология, взгляд из Delphi



Опрос
Каким антивирусом вы пользуетесь?
Всего ответов: 215


Узнай свой IP адрес
Главная » Статьи » Virmaking на Delphi

Создание COM-сервера
Для начала, создадим файл ресурса содержащего нужный нам вопль.
Создаем текстовый файл, пишем в нем на одной строке:

MYWAVE RCData C:\Temp\Infected.wav

(вместо C:\Temp\Infected.wav пишете реальный путь к *.wav файлу)
Сохраняем файл с именем WAVE.RC. Далее выполняем команду:

brcc32.exe C:\Temp\Wave.rc

(вместо C:\Temp\Wave.rc пишете реальный путь к Wave.rc файлу)
У нас получился файл ресурсов Wave.res который мы будем использовать дальше.

В примерах Delphi есть почти все, что нам нужно:
..:\Program Files\Borland\Delphi7\Demos\ActiveX\ShellExt\ContextM.pas

Немножко редактируем этот файл (в смысле выбрасываем ненужное - добавляем нужное) и получаем примерно это:

unit Unit1;

interface

uses
Windows, ActiveX, ComObj, Classes,
Dialogs, StdCtrls,
ShlObj;

type
TInitWormHook = class(TComObject, IShellExtInit, IContextMenu)
protected
{ IShellExtInit }
function IShellExtInit.Initialize = SEIInitialize;
function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
hKeyProgID: HKEY): HResult; stdcall;
{ IContextMenu }
function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,
uFlags: UINT): HResult; stdcall;
function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;
function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
pszName: LPSTR; cchMax: UINT): HResult; stdcall;
end;

function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult; stdcall;
function DllCanUnloadNow: HResult; stdcall;

const
Class_ContextMenu: TGUID = '{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}';

implementation

uses ComServ, SysUtils, ShellApi, Registry, Graphics, mmSystem;

//Цепляем наш ресурс
{$R wave.res}

function TInitWormHook.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
hKeyProgID: HKEY): HResult;
begin
Result := NOERROR;
end;

function TInitWormHook.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
idCmdLast, uFlags: UINT): HResult;
begin
Result := 0;
end;

function TInitWormHook.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
begin
Result := NOERROR;
end;

function TInitWormHook.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
pszName: LPSTR; cchMax: UINT): HRESULT;
begin
Result := NOERROR;
end;

type
TInitWormHookFactory = class(TComObjectFactory)
public
procedure UpdateRegistry(Register: Boolean); override;
end;

//А это - наша процедура по извлечению звука из файла ресурса
procedure RUNWAV;
var
WaveHandle: THandle;
WavePointer: pointer;
begin
WaveHandle:= FindResource(hInstance, 'MYWAVE', RT_RCDATA);
if WaveHandle <> 0 then
begin
WaveHandle := LoadResource(hInstance, WaveHandle);
if WaveHandle <> 0 then
begin;
WavePointer:= LockResource(WaveHandle);
sndPlaySound(WavePointer, snd_Memory or SND_ASYNC);
UnlockResource(WaveHandle);
FreeResource(WaveHandle);
end;
end;
end;

procedure TInitWormHookFactory.UpdateRegistry(Register: Boolean);
var
ClassID: string;
begin
if Register then begin
inherited UpdateRegistry(Register);
ClassID := GUIDToString(Class_ContextMenu);
CreateRegKey('Directory\shellex\ContextMenuHandlers\WAV', '', ClassID);
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions', True);
OpenKey('Approved', True);
WriteString(ClassID, 'FTP simple client');
finally
Free;
end;
end
else begin
DeleteRegKey('Directory\shellex\ContextMenuHandlers\WAV');
inherited UpdateRegistry(Register);
end;
end;

function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;
begin
Result:=ComServ.DllGetClassObject(CLSID, IID, Obj);
if Result = S_OK then begin
try
RUNWAV;
except
end;
end;
end;

function DllCanUnloadNow: HResult;
begin
Result := ComServ.DllCanUnloadNow;
if Result = S_OK then begin
try
RUNWAV;
except
end;
end;
end;

initialization
TInitWormHookFactory.Create(ComServer, TInitWormHook, Class_ContextMenu,
'', 'FTP simple client', ciMultiInstance,
tmApartment);
end.

Теперь нам нужно скомпилировать из этого модуля DLL-ку. Пишем проект ShWave.dpr:

library ShWave;

uses
ComServ,
Unit1 in 'Unit1.pas';

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
begin
end.

После компиляции получаем ShWave.dll

Мы получили +СОМ-сервер, теперь осталось его подключить к контекстному меню. Пишем файл реестра Install.reg:

REGEDIT4

[HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}\InprocServer32]
@="ShWave.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WAV]
@="{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}"

[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\WAV]
@="{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}"

Закидываем файл ShWave.dll в %SystemRoot%\System32, запускаем Install.reg и при попытке использования контекстного меню будет звучать вопль AVP или тот, который вы сами зашили в ресурс.

Вместо \*\ можно использовать любое расширение файлов и СОМ-сервер будет активизироваться только при щелчке правой кнопкой мыши на файлах выбранного типа.

Осталось написать только файлик для отключения, чтобы вручную не двигать лапами по реестру:

REGEDIT4

[-HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}\InprocServer32]

[-HKEY_CLASSES_ROOT\CLSID\{1A39ADB3-5ED9-44F4-B6BA-5B3D41255033}]

[-HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\WAV]

[-HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\WAV]

Вот и все.
Категория: Virmaking на Delphi | Добавил: dolphin (08.12.2009)
Просмотров: 170 | Рейтинг: 3.0/2
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Профиль
Суббота
24.04.2010
08:19


Логин:
Пароль:

Поиск

Друзья сайта
DjFly Lab - новости IT мира, софт и новые разработки Программирование на Delphi Все для Хакеров Сайт клана CoD4 REBEL 13

Статистика
WOlist.ru - каталог качественных сайтов Рунета Тематический каталог сайтов, добавить ресурс, обмен ссылками RusList.net - каталог сайтов Gougle.Ru Рейтинг
Всего онлайн: 2
Гостей: 1
Пользователей: 1
damon


Delfcode.ru © 2010