2014-02-22 4 views
0

키보드 이벤트를 실험하고 있습니다. 다른 이벤트에서 키보드 이벤트를 수신하기 위해 자습서 및 오픈 소스 라이브러리를 많이 보았습니다. 컴퓨터를 잠그고 키보드 이벤트를 수신하는 간단한 '해킹'을 만드는 아이디어를 생각해 냈습니다. 나는 사용자가 자신의 컴퓨터를 잠금 해제하기 위해 암호를 입력하도록 강요 할 수있는 것으로 생각하고 사용자 입력을 듣고 지정된 암호를 얻습니다. 여기에 글로벌 키보드 이벤트를 수신합니다 인터넷에있는 간단한 예제 코드입니다 : 이것은 조용한 잘 작동컴퓨터가 잠겨있는 동안 글로벌 키보드 이벤트 듣기

using System; 
using System.Diagnostics; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

class InterceptKeys 
{ 
    private const int WH_KEYBOARD_LL = 13; 
    private const int WM_KEYDOWN = 0x0100; 
    private static LowLevelKeyboardProc _proc = HookCallback; 
    private static IntPtr _hookID = IntPtr.Zero; 

    public static void Main() 
    { 
     _hookID = SetHook(_proc); 
     Application.Run(); 
     UnhookWindowsHookEx(_hookID); 
    } 

    private static IntPtr SetHook(LowLevelKeyboardProc proc) 
    { 
     using (Process curProcess = Process.GetCurrentProcess()) 
     using (ProcessModule curModule = curProcess.MainModule) 
     { 
      return SetWindowsHookEx(WH_KEYBOARD_LL, proc, 
       GetModuleHandle(curModule.ModuleName), 0); 
     } 
    } 

    private delegate IntPtr LowLevelKeyboardProc(
     int nCode, IntPtr wParam, IntPtr lParam); 

    private static IntPtr HookCallback(
     int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) 
     { 
      int vkCode = Marshal.ReadInt32(lParam); 
      Console.WriteLine((Keys)vkCode); 
     } 
     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int idHook, 
     LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
     IntPtr wParam, IntPtr lParam); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string lpModuleName); 
} 

,하지만 키보드 입력을들을 때 어떤 이유로 예외가있을 것 같습니다 때 컴퓨터 잠겨 있니? 왜 그것이 작동하지 않을지 모르겠다. 아마 보안 문제 일 것이다. 어쨌든이 일을 할 수 있다면 그것은 굉장 할 것입니다.

+0

* 보안 *입니다. 나는 OS를 해킹하지 않고 그 주위에 방법이 있을지 의심 스럽다. –

+0

@RobertHarvey _very_ 빠른 답장을 보내 주셔서 감사합니다. 그러나 다른 위조 된 동일한 응용 프로그램이나 금이 간 버전의 응용 프로그램을 실행 한 다음 사용자에게 컴퓨터가 잠겨 있다고 생각하게하는 경우 달성 할 수 있습니까? – Linus

+1

신용 카드 번호 (및 뒷면에있는 보안 코드)를 알려 주시면 답변을 알려 드리겠습니다. –

답변

3

Windows의 경우 잠긴 화면은 실제로는 Window Station과 다르며 대화 형 사용자가 소유하지 않으므로 대화 형 사용자는 보안 방법으로 대화 할 수 없습니다. 잠금 화면과 상호 작용하고 일반적으로 로그온하려면 Credential Provider