![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с dll
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]
> Ты эта...советы в другом месте не хочешь давать ? Могу
> устроить по блату...
спасибо за предупреждение, "в другом месте" побывать не хочу :((((