Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

работа с dll   Найти похожие ветки 

 
ZenAS ©   (2004-12-18 17:26) [0]

Ну значит так, я пишу клавиатурный сниффер висящий в 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. Почему???????????
 Зарание благодарю.


 
Leonid Troyanovsky ©   (2004-12-18 17:37) [1]


>  ExitProc := @LocalExitProc;


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

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

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


 
Leonid Troyanovsky ©   (2004-12-18 17:49) [2]


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


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

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


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

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);


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


 
ZenAS ©   (2004-12-18 20:09) [4]

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


 
Leonid Troyanovsky ©   (2004-12-18 20:33) [5]


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


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

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

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


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

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

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

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

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

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

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


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

Кое-как справился с 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) все работавет.
 Чувствую винда свихнулась. Или может у меня ошибка( вроди выкинул почти все)?
 Зарание благодарю.


 
Cobalt ©   (2004-12-19 01:18) [8]

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


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

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.


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


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

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

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


 
Piter ©   (2004-12-19 19:27) [11]

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

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

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


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

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


 
Leonid Troyanovsky ©   (2004-12-19 21:26) [13]


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


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

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


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

Piter ©   (19.12.04 19:27) [11]

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

С уважением,


 
Хакер ©   (2004-12-19 23:06) [15]

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

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

спасибо за предупреждение, "в другом месте" побывать не хочу :((((


 
Хакер ©   (2004-12-19 23:08) [16]

Piter ©   (19.12.04 19:27) [11]
спасиб за поддержку ;))

Игорь Шевченко ©   (19.12.04 21:47) [14]

> Спрятать - дело нехитрое, найти спрятанное - тоже не
> очень хитрое, вечный вопрос - нафига ?
<offtopic>
- тогда главный вопрос - если и на самом то деле просто найти, почему такой жёсткий запрет на выкладывание способов ?
имхо нестыковывается !
- легко спрятать-легко найти и нет проблем ;)
//</offtopic>


 
ZenAS ©   (2004-12-19 23:11) [17]

Ладно вы тут болтайте, а я въехал в фишку с Memory Mapped Files, так что пока все(что сделано) работает. Всем Спасибо.


 
Хакер ©   (2004-12-19 23:15) [18]

ZenAS ©   (19.12.04 23:11) [17]
ок :))
а у нас тут уже оффорик пошёл ;)))
//Гы, тока прогу не скрывай :)


 
Piter ©   (2004-12-20 00:16) [19]

ZenAS ©   (19.12.04 23:11) [17]
я въехал в фишку с Memory Mapped Files


молодец :)


 
Хакер ©   (2004-12-20 00:56) [20]

Piter ©   (20.12.04 0:16) [19]
имхо в ХР и выше они не обязательны


 
Cobalt ©   (2004-12-20 01:03) [21]

Хакер ©   (20.12.04 00:56) [20]
Ты, когда шутишь, смайлик ставь, что ли, а то ей богу, так и хочется написать знаменитое Игорево Слово о полку (LMD)


 
Хакер ©   (2004-12-20 01:25) [22]

Cobalt ©   (20.12.04 1:03) [21]
я имелл ввиду
CallNextHookEx(0 {HookHandle} , nCode, wParam, lParam);


 
Piter ©   (2004-12-20 21:08) [23]

Хакер ©   (20.12.04 0:56) [20]
имхо в ХР и выше они не обязательны


в 2000 тоже. Можно в качестве параметра хука передавать 0 - тогда будет вызван следующий хук. Но 98/ME еще не умерли...


 
ZenAS ©   (2004-12-20 23:15) [24]

Снова привет всем!
 Возникла еще одна проблема с НООКами и вот ее суть:
В большенстве исходников хук ставится не при загрузке библиотеки в память, а привызове из программы экпортируемой функции. Все мои попытки установить его в DLLProc ничего не дают. А т.к. я стараюсь выкинуть ЕХЕшник, то я просто не представляю как запустить функцию установки хука. Я уже дошел до того, что в примере от статьи про хуки(есесно работоспособной) просто поставил вызовы хуковой функции в нужных местах, но и это не дало нужных результатов(не вызывалсась моя функция). Последнее практически исключает возможность ошибки с моей стороны. Может это какое-то неизвестное  мне свойство винды.
 Посоветуйте пожалуйста, что мне делать?


 
Piter ©   (2004-12-20 23:36) [25]

ZenAS ©   (20.12.04 23:15) [24]

ну и где код?


 
Хакер ©   (2004-12-21 13:46) [26]

ZenAS ©   (20.12.04 23:15) [24]
можно, пашет, пример:

(пример для Win2k винды, собран наспех, просьба "не пинать" ))))

library Project2;
Uses Windows,Messages;
Var SysHook:HHook=0;  s:string;

Function SysMsgProc(Code:Integer; WParam:LongInt; LParam:LongInt):LongInt; stdcall;
Var Msg:TMessage;
Begin
IF (Code=HC_ACTION) then
 Case TMsg(Pointer(LParam)^).Message OF
  WM_RBUTTONDOWN,WM_RBUTTONUP, WM_RBUTTONDBLCLK: TMsg(Pointer(LParam)^).Message:=WM_NULL
  else Result:=CallNextHookEx(SysHook,Code,WParam,LParam);
 End;
end;

procedure Hook(Flag:Boolean); export; stdcall;
Begin
IF Flag then SysHook:=SetWindowsHookEx(WH_GETMESSAGE,@SysMsgProc,HInstance,0) Else
 Begin
  UnhookWindowsHookEx(SysHook);
  SysHook:=0;
 End;
End;

exports Hook;

{$R *.res}

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
  DLL_PROCESS_ATTACH:

  begin

  s:=Paramstr(0);
  if pos("t1.exe",s)>0 then  Hook(true);

  MessageBox(0,Pchar(Paramstr(0)),"",0);

  end;

  DLL_PROCESS_DETACH: begin end;
end;
end;

begin

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

end.


 
ZenAS ©   (2004-12-21 16:33) [27]

Отбой. Ложная тревога. Хук не устанавливался потому, что не грузилась DLLка. Вместо старого доброго External решил воспользоваться LoadLibrary и поставил ее не там, где собирался. Только не ногами!!!! Я раскаиваюсь:).
 Всем Спасибо.


 
ZenAS ©   (2004-12-23 15:28) [28]

У меня опять вопрос. Почему в этих исходниках:

library hook_dll1;

uses
 Windows,
 Messages;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin

end;

procedure hook(switch : Boolean) export; stdcall;
begin

end;

procedure OpenGlobalData();
begin

end;

procedure CloseGlobalData();
begin
 MessageBox(0, "DLL determine", "Message from Process1", 0); // не вызывается
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin //1
 case dwReason of
   DLL_PROCESS_ATTACH: OpenGlobalData;
   DLL_PROCESS_DETACH: CloseGlobalData;  //2
 end;
end;

exports hook;

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

 Не вызывается ни(1), ни(2)???
 вот ЕХЕшник :

...
var
 Form1: TForm1;
 Hdll : HWND; { дескриптор загружаемой DLL (для динамической загрукзки)}

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
 hook: MyProcType;
begin
 @hook:= nil; // инициализируем переменную hook

{ ********* динамическая загрузка **************}

 Hdll:= LoadLibrary(PChar("hook_dll1.dll")); { загрузка DLL }
 if Hdll > HINSTANCE_ERROR then            { если всё без ошибок, то }
   begin
     @hook:=GetProcAddress(Hdll, "hook");     { получаем указатель на необходимую процедуру}
     Button2.Enabled:=True;
     Button1.Enabled:=False;
     hook(true);
   end
 else
   ShowMessage("Ошибка при загрузке DLL !");

{ **********************************************}
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 hook: MyProcType;
begin
 @hook:= nil; // инициализируем переменную hook
 if Hdll > HINSTANCE_ERROR then
   begin                                   { если всё без ошибок, то }
     @hook:=GetProcAddress(Hdll, "hook");  { получаем указатель на необходимую процедуру}
     Button1.Enabled:=True;
     Button2.Enabled:=False;
     hook(false);                           {вызываем нужную процедуру из DLL}
   end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 FreeLibrary(Hdll); { при закрытии формы - освобождаем DLL }
end;

...


 Благодарю.


 
GrayFace ©   (2004-12-23 18:56) [29]

ZenAS ©   (19.12.04 0:23) [7]
Чувствую винда свихнулась. Или может у меня ошибка( вроди выкинул почти все)?

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


 
GrayFace ©   (2004-12-23 19:05) [30]

GrayFace ©   (23.12.04 18:56) [29]
У меня даже не работал пример из статьи

Уточнение: сам-то он работал, а вот приложения потихуньку дохли с AV.


 
ZenAS ©   (2004-12-24 18:23) [31]

Я понял в чем проблема: функция выгрузки не вызывалась, т.к. библиотека не выгружалась из памяти(в большенстве случаев). Какой-то процесс держит мою DLL"ку в памяти( енто я узнал попытавшись откомпилировать ее два раза), даже после снятия НООК"а. Возникает вопрос: какой енто нахальный процесс трогает DLL"ку без моего разрешения( вот ща качну CCTask и узнаю), и как ее выгрузить в принудительной форме( какой-нибуть DisLoadLibrary)???


 
MacroDenS ©   (2004-12-24 18:37) [32]

FreeLibrary тебе в помощь (если конечно LoadLibrary юзаешь)


 
Piter ©   (2004-12-24 21:39) [33]

ZenAS ©   (24.12.04 18:23) [31]
Какой-то процесс держит мою DLL"ку в памяти


Это как? Почитай о том, что такое библиотека вообще, почему были придуманы библиотеки и как они собственно работают.


 
Leonid Troyanovsky ©   (2004-12-25 12:04) [34]


> ZenAS ©   (23.12.04 15:28) [28]
> У меня опять вопрос. Почему в этих исходниках:

> library hook_dll1;
..
> procedure DLLEntryPoint(dwReason: DWord); stdcall;

> Не вызывается ни(1), ни(2)???


Какой stdcall?
RTFM:  VCL Reference. DLLProc variable

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



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.059 c
1-1104720522
Nes
2005-01-03 05:48
2005.01.16
Как программку, которая формирует нелинейный список?


14-1104123395
Чеширский_Кот
2004-12-27 07:56
2005.01.16
Приснился странный футбольный сон...


1-1104315116
snake_r
2004-12-29 13:11
2005.01.16
CheckBox d DBGrid


4-1101573548
ychenick
2004-11-27 19:39
2005.01.16
Ограничение прав и смена пользователя.


3-1102943626
AlexRush
2004-12-13 16:13
2005.01.16
Oracle 9.2 as TDataSet