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. Почему???????????
 Зарание благодарю.


Leonid Troyanovsky   (2004-12-25 12:04:00) [1]


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

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

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


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

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


Piter   (2004-12-24 21:39:00) [2]

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


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


MacroDenS   (2004-12-24 18:37:00) [3]

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


ZenAS   (2004-12-24 18:23:00) [4]

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


GrayFace   (2004-12-23 19:05:00) [5]

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

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


GrayFace   (2004-12-23 18:56:00) [6]

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

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


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

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

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;

...


 Благодарю.


ZenAS   (2004-12-21 16:33:00) [8]

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


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

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.


Piter   (2004-12-20 23:36:00) [10]

ZenAS ©   (20.12.04 23:15) [24]

ну и где код?


ZenAS   (2004-12-20 23:15:00) [11]

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


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

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


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


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

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


Cobalt   (2004-12-20 01:03:00) [14]

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


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

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


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

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


молодец :)


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

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


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

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


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

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

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

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


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

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

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

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


Страницы:   1 2

Наверх

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