Форум: "Основная";
Текущий архив: 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.053 c