ý Ű ä Ű ŷ ΰ ִ. ٸ ̷ Ư Ȱó ٸ.
- ν ȣǴ ݸ ν Ű ť ȣȴ.
- Ÿ 鿩 ϹǷ Ÿ μ ּ ؾ ý ť Ƿ ʿ䰡 . DLL Ÿ μ Ե ؽƮ Ī Ѵ.
- Ģ Ÿ ϴ. DLL и ʴ ŷ ִ.
- keybd_event Ų ̺Ʈ Űκ ̺Ʈ ÷ LLKHF_INJECTED Ʈ Ͽ ִ.
-wParam, lParam Ǵ ٸ. wParam lParam Ű, ĵ ڵ, ÷, ð, ü ´.
ϸ ü ϴ ȵȴ. ƿ Ծ ο о ִ ִ.
ŷ ڷᰡ Ƿ ⼭ ŷ ˾ . 鿩 ״ ִٴ ưų ʴ. ŷ Ʈ ̴.
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass = TEXT("KeyHookLL");
int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance
, _In_ LPSTR lpszCmdParam, _In_ int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
hWndMain = hWnd;
while (GetMessage(&Message, NULL, 0, 0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
HHOOK hKeyHookLL = NULL;
TCHAR MesName[111];
TCHAR log[256];
TCHAR output[65000];
LRESULT CALLBACK KeyHookProcLL(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0) {
KBDLLHOOKSTRUCT* kb = (KBDLLHOOKSTRUCT*)lParam;
if (wParam == WM_KEYDOWN) lstrcpy(MesName, "Down");
if (wParam == WM_KEYUP) lstrcpy(MesName, "Up");
if (wParam == WM_SYSKEYDOWN) lstrcpy(MesName, "SysDown");
if (wParam == WM_SYSKEYUP) lstrcpy(MesName, "SysUp");
if ((kb->flags & LLKHF_INJECTED) != 0) lstrcat(MesName, "(Injected)");
wsprintf(log, "%s - vk = %x(%c), scan = %x, flag=%x, time = %d\r\n",
MesName, kb->vkCode, kb->vkCode, kb->scanCode, kb->flags, kb->time);
lstrcat(output, log);
// ESC Ѵ.
if (wParam == WM_KEYDOWN && kb->vkCode == VK_ESCAPE) {
lstrcpy(output, "");
}
InvalidateRect(hWndMain, NULL, TRUE);
// 0 ƴ Ͽ Ư Ű Է Ѵ.
if (kb->vkCode == '1') {
return 1;
}
// ٸ Ű ٲٴ ȵȴ.
if (kb->vkCode == '2') {
kb->vkCode = '3';
}
// Ű Է ϰ ο Ű Է ִ.
if (kb->vkCode == '4') {
keybd_event('5', 0, wParam == WM_KEYDOWN ? 0: KEYEVENTF_KEYUP, 0);
return 1;
}
}
return CallNextHookEx(hKeyHookLL, nCode, wParam, lParam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT crt;
switch (iMessage) {
case WM_CREATE:
hKeyHookLL = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookProcLL, g_hInst, NULL);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &crt);
DrawText(hdc, output, -1, &crt, 0);
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
if (hKeyHookLL != NULL) UnhookWindowsHookEx(hKeyHookLL);
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
ġ ٸ Ű Ÿ WH_KEYBOARD_LL Ѵ. DLL ġ ʿ Ƿ ü νϽ̸ ϹǷ NULL̴. ν ȣǹǷ ü ݵ ־ Ѵ. WM_CREATE ġϰ WM_DESTROY ϸ ε Ű ν ´.
ν Ű ¸ ϱ ȣǹǷ ̶ GetAsyncKeyState Լ Ű ¸ Ȯ . Ű ° ʿϸ Ű ¸ ü ؾ Ѵ. wParam Ǹ lParamδ ü Ѵ.
typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
о Ű ô ľѴ. 0 ϸ ü Ÿ Ͽ ƹ óȴ. 0 ƴ , 1 Ͽ ü ʵ Ѵ.
ν ѽð ų óؾ ϸ ð ʰϸ ü ȴ. ѽð Ʈ Ǿ ִµ Ʈ 1̴.
ڵ α Ͽ Ű ش. ٸ α Ű Է 鿩 ִ. 밳 ü ׳ ʿϴٸ ų ٲ ִ. esc α ϴµ Ŀ ʾƵ ϴ.
1Ű ؼ 1 Ͽ Ծ . ü Ű . 쵵 1Ű . ߿ winŰ ϸ ȴ.
2Ű 3Ű Է ٲٴ ȵȴ. vkCode Ű ̸ ٲ۴ٰ ؼ Ÿ ʴ´. ν Ǵ Ķʹ б ̴.
ٲٰ ϴ Ծ keybd_eventԼ ο ŰԷ Ѵ. 4 5 ٲ . 5 Էµ ν Է ü Ÿ ȴ. Ű Է flag LLKHF_INJECTED ÷ Ѵ.
ٸ 쿡 1, 2, 4 ν ϴ ִ. ٸ 쿡 ԷµǴ Ű Ư ϰ κ ϴ.
출장마사지 | 구로출장안마 | 광주출장샵
서패동소개팅
명석면소개팅
구황동타이마사지
출장샵 | 삼척출장안마 | 수원출장마사지
중랑출장샵✓옥천출장업소✓굿월헌팅
챗천사
오남동콜걸
치한19만화
약수역소개팅
파일디스크
봉고렌트
귀여운여친 유포
카게히나타피어나다
인천콜걸 군산출장샵
달서구맛집
와디즈펀딩✓재택근무 번역✓카카오 대출 연장
신도림맛집
이너뷰티
육아소통
꽃배달
스타벅스커피✓신한은행 대출 전화번호✓nh 새내기 공무원 대출
사랑중대출승인재테크 의 뜻
홈쇼핑재택근무
반영구
소년 강간 동인지
상주출장마사지
후장 처음
다음 클라우드
화성출장샵
|
|