Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

работа с 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.033 c
9-1096925934
Jack
2004-10-05 01:38
2005.01.16
опять по GLScene ?


1-1104137406
swinole
2004-12-27 11:50
2005.01.16
StringGrid и рисунки


1-1103755615
Project1
2004-12-23 01:46
2005.01.16
Задачка. Какой код правильнее и почему ?


14-1103985059
lak
2004-12-25 17:30
2005.01.16
TV в инете


6-1098889352
Vyacheslav
2004-10-27 19:02
2005.01.16
Как проверить прочитано ли письмо





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский