![]() |
| ||
|
|
Новости |
Поиск |
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. Почему???????????
Зарание благодарю.
Игорь Шевченко (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.