Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

работа с dll


Страницы:   1 2

ZenAS ©   (2004-12-18 17:26:00) 

Ну значит так, я пишу клавиатурный сниффер висящий в DLL'ке и в процессе созидания у меня возникло несколько вопросов:
 1 Можно ли использовать функции Writeln, readln, короче работать с файлами без VCL, в DLL( в пятой Дельфе у меня возникала ошибка i/o)?
 2 Для уменьшения размера файла я выкинул формы из EXE'шника, который нужен только для того, чтобы DLL'ка висела в памяти. Есть ли способ заставить ее чем-нибудь заниматься, менее заметный чем Sleep?
 3 Мне нужно поймать момент, когда DLL'ка выгружается из памяти. Я сделал так:
...
var
 SExitProc : Pointer;
...
...
procedure LocalExitProc; far;
begin
  ...
  ExitProc := SExitProc;      //1
end;
...
...
begin
   SExitProc := ExitProc;      //2
   ExitProc := @LocalExitProc;
end.

 Но LocalExitProc не выполняется, а в 2 ExitProc равна nil. Почему???????????
 Зарание благодарю.


Игорь Шевченко   (2004-12-19 21:47:00) [21]

Piter ©   (19.12.04 19:27) [11]

<offtopic>
Спрятать - дело нехитрое, найти спрятанное - тоже не очень хитрое, вечный вопрос - нафига ?
</offtopic>

С уважением,


Leonid Troyanovsky   (2004-12-19 21:26:00) [22]


> ZenAS ©   (19.12.04 21:20) [12]
> Енто конечно круто, но чем тот мой код неугодил винде? Да


Найди 10 отличий.

--
С уважением, LVT.


ZenAS   (2004-12-19 21:20:00) [23]

Енто конечно круто, но чем тот мой код неугодил винде? Да и код Piter'а отличается от моего только тем, что общается с окном, да пишет в файло.


Piter   (2004-12-19 19:27:00) [24]

Игорь Шевченко ©   (19.12.04 18:25) [10]

ну зачем так грубо :)

Между прочим, про то как спрятать свою программу в свое время спрашивали сами создатели сайта :)


Игорь Шевченко   (2004-12-19 18:25:00) [25]

Хакер ©   (18.12.04 21:49) [6]

Ты эта...советы в другом месте не хочешь давать ? Могу устроить по блату...


Piter   (2004-12-19 01:26:00) [26]

ZenAS ©   (19.12.04 0:23) [7]

у тебя точно ошибка. Вот пример моей библиотеки:

library piter_hook;

uses
 Windows;

const
 cMMFileName = 'piter-hook_{E891D15B-DD53-4BC8-81F4-E0BF8A5573B6}';

type
 PGlobalData = ^TGlobalData;
 TGlobalData = packed record
   HookProcessId: DWORD;
   HookHandle: HHOOK;
   WindowHandle: THandle;
   idMsg: LongWord;
 end;

var
 GlobalData: PGlobalData ;
 MapHandle: THandle;

function DeleteHook(CheckProcess: boolean): boolean;
begin
 Result := false;
 if GlobalData <> nil then
   with GlobalData^ do
     if HookHandle<>0 then
       if (not CheckProcess) or (GetCurrentProcessId = HookProcessId) then
         begin
           Result := UnHookWindowsHookEx(HookHandle) ;
           if Result then
             HookHandle := 0;
         end;
end;

function RemoveShellHook: boolean; stdcall;
begin
 Result := DeleteHook(True);
end;

function ShellProc(nCode: integer; wParam: LongWord;
   lParam: LongWord): integer; stdcall;
begin
 Result := 0;
 if GlobalData <> nil then
   with GlobalData^ do
   begin
     if IsWindow(WindowHandle) then
       SendMessage(WindowHandle, idMsg, wParam, nCode)
     else
       DeleteHook(False);
     CallNextHookEx(HookHandle, nCode, wParam, lParam);
   end;
end;

function SetShellHook(CallbackWindow: THandle;
   idCallBackMessage: LongWord): boolean; stdcall;
begin
 Result := false;
 if GlobalData <> nil then
   with GlobalData^ do
     if ( HookHandle = 0 ) and ( IsWindow(CallbackWindow) ) then
       begin
         HookHandle := SetWindowsHookEx(WH_SHELL, @ShellProc, HInstance, 0);
         Result := HookHandle <> 0;
         if Result then
           begin
             HookProcessId := GetCurrentProcessId ;
             WindowHandle := CallbackWindow ;
             idMsg :=  idCallBackMessage ;
           end;
       end;
end;

procedure OpenSharedData;
var
 Size: integer;
begin
 Size := SizeOf(TGlobalData);
 MapHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE,
     0, Size, cMMFileName);
 if MapHandle = 0 then exit;
 GlobalData := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size);
end;

procedure CloseSharedData;
begin
 UnmapViewOfFile(GlobalData);
 CloseHandle(MapHandle);
end;

procedure DLLEntryProc(dwReason: DWord);
begin
 case dwReason of
   DLL_PROCESS_ATTACH: OpenSharedData;
   DLL_PROCESS_DETACH:
     begin
       RemoveShellHook ;
       CloseSharedData;
     end;
 end;
end;

exports
 SetShellHook, RemoveShellHook;

begin
 DLLProc := @DLLEntryProc;
 DLLEntryProc(DLL_PROCESS_ATTACH);
end.


у меня другой тип хука, но переделать ничего не стоит...


Cobalt   (2004-12-19 01:18:00) [27]

Читай статью на здесь на сайте о хуках.
http://www.delphimaster.ru/articles.html


ZenAS   (2004-12-19 00:23:00) [28]

Кое-как справился с DLLProc, а тут ситуация еще ужаснее. Вот сокращенный исходник:
library ss;

uses
 SysUtils,
 windows,
 Messages,
 Classes;

{$R *.res}

var
 HandleHook : HHook = 0;

procedure exp; export;    //так для экспорта
begin
Sleep(100);
end;

function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint; stdcall;
begin
     Result := CallNextHookEx(HandleHook, Code,
                      wParam, lParam);
end;

procedure LocalExitProc(dwReason: DWord);
begin
case dwReason of
  DLL_PROCESS_ATTACH:
     begin
       HandleHook := SetWindowsHookEx(WH_Keyboard, @Key_Hook,
             hInstance, 0);//1
     end;
  DLL_PROCESS_DETACH:
     begin
       if HandleHook <> 0 then
       begin
         UnhookWindowsHookEx(HandleHook);
       end;
     end;
end;
end;

exports exp;

begin
 DLLProc := @LocalExitProc;
 DLLProc(DLL_PROCESS_ATTACH);
end.

 Короче, когда клавиши нажимаются в окне ЕХЕшника-хозяина DLLки все круто, но не дай бог нажать что-нибудь в другом приложении( в том числе и Дельфe;(), тутже выскакивают 3 сообщения, мол ета прога вызвала ошибку Кернела и все такое, а без (1) все работавет.
 Чувствую винда свихнулась. Или может у меня ошибка( вроди выкинул почти все)?
 Зарание благодарю.


Хакер   (2004-12-18 21:49:00) [29]

Leonid Troyanovsky ©   (18.12.04 20:33) [5]

>Грузите библиотеку секциями тчк
> Братья Кличко тчк

классная шутка !!!
- не сразу просёк :))

ну, зачем же так сразу круто ))

пускай сперва CreateRemoteThreadпоюзает :)

или не крайняк ShellServiceObjectDelayLoad


Leonid Troyanovsky   (2004-12-18 20:33:00) [30]


> ZenAS ©   (18.12.04 20:09) [4]
> А как без EXE? Как ее грузитть в память????????


Грузите библиотеку секциями тчк
Братья Кличко тчк

--
С уважением, LVT.

ЗЫ Возьми rundll32 и грузи.


ZenAS   (2004-12-18 20:09:00) [31]

А как без EXE? Как ее грузитть в память????????


Хакер   (2004-12-18 17:55:00) [32]

ZenAS ©   (18.12.04 17:26)
0// кейлоггеры нехорошо писать :)))))

1//можно :))

2//сделай: While true do Sleep(5);

3// можно:

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
 case dwReason of
   DLL_PROCESS_ATTACH: старт
   DLL_PROCESS_DETACH: выгрузка;
 end;
end;

........

begin
 {назначим поцедуру переменной DLLProc}
 DLLProc:= @DLLEntryPoint;
 {вызываем назначенную процедуру для отражения факта присоединения данной
  библиотеки к процессу}
 DLLEntryPoint(DLL_PROCESS_ATTACH);


совет, делай БЕЗ ЕХЕ.
- одной длл достаточно


Leonid Troyanovsky   (2004-12-18 17:49:00) [33]


>  1 Можно ли использовать функции Writeln, readln, короче
> работать с файлами без VCL, в DLL( в пятой Дельфе у меня
> возникала ошибка i/o)?
>  2 Для уменьшения размера файла я выкинул формы из EXE'шника,
> который нужен только для того, чтобы DLL'ка висела в памяти.
> Есть ли способ заставить ее чем-нибудь заниматься, менее
> заметный чем Sleep?


1. VCL здесь никаким боком, можно и в dll, ошибка у тебя.
2. И в чем замечен Sleep? Может устроит SleepEx.

--
С уважением, LVT.


Leonid Troyanovsky   (2004-12-18 17:37:00) [34]


>  ExitProc := @LocalExitProc;


ExitProc is only used when generating .EXE files.
Do not use ExitProc within a dynamically loaded package.

Можешь пользовать, например finalization.

--
С уважением, LVT.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо