2011-09-23 3 views
0

Итак, я решил, что сегодня хочу написать маленький кейлоггер, просто чтобы узнать о getAsyncKeyState. Я пытаюсь получить свой журнал для записи в файл, но содержимое файла либо отображается пустым, либо бросает на него произвольный адрес памяти (0x28fef0 раньше). Я слышал, что getAsyncKeyState не работает хорошо с Windows 7 x64, правда?getAsyncKeyState не распознает ввод ключа

Это довольно усугубляет, я надеялся, что на самом деле смогу это сделать сегодня вечером.

while(1) 
    { 
     Sleep(20); 
     for(DWORD_PTR key = 8; key <= 190; key++) 
     { 
      if (GetAsyncKeyState(key) == HC_ACTION) 
       checkKey(key); 
     } 
    } 

Функция определения

void checkKey(DWORD_PTR key) 
{ 
    ofstream out; 
    out.open("log.txt"); 

     if (key==8) 
      out << "[del]"; 
     if (key==13) 
      out << "n"; 
     if (key==32) 
      out << " "; 
     if (key==VK_CAPITAL) 
      out << "[CAPS]"; 
     if (key==VK_TAB) 
      out << "[TAB]"; 
     if (key==VK_SHIFT) 
      out << "[SHIFT]"; 
     if (key==VK_CONTROL) 
      out << "[CTRL]"; 
     if (key==VK_PAUSE) 
      out << "[PAUSE]"; 
     if (key==VK_ESCAPE) 
      out << "[ESC]"; 
     if (key==VK_END) 
      out << "[END]"; 
     if (key==VK_HOME) 
      out << "[HOME]"; 
     if (key==VK_LEFT) 
      out << "[LEFT]"; 
     if (key==VK_UP) 
      out << "[UP]"; 
     if (key==VK_RIGHT) 
      out << "[RIGHT]"; 
     if (key==VK_DOWN) 
      out << "[DOWN]"; 
     if (key==VK_SNAPSHOT) 
      out << "[PRINT]"; 
     if (key==VK_NUMLOCK) 
      out << "[NUM LOCK]"; 
     if (key==190 || key==110) 
      out << "."; 
     if (key >=96 && key <= 105) 
     { 
      key -= 48; 
      out << &key; // had ampersand 
     } 
     if (key >=48 && key <= 59) 
      out << &key; // amp'd 
     if (key !=VK_LBUTTON || key !=VK_RBUTTON) 
     { 
      if (key >=65 && key <=90) 
      { 
       if (GetKeyState(VK_CAPITAL)) 
       out << &key; // amp;d 
      else 
      { 
       key = key +32; 
       out << &key; // amp'd 
      } 
     } 
     } 
} 

Я серьезно озадачен этим вопросом, и любая помощь будет принята с благодарностью. Почему функция, подобная этой, работает по-разному на 64-битной системе? Учитывая, что это единственный ящик, который у меня есть, я не могу запустить его на 32-разрядной версии, чтобы проверить, является ли это изолированной проблемой. Поскольку я предполагаю, что это связано с getAsyncKeyState, а не с моим кодом (который компилирует и создает пустой файл журнала), я включал только эти два фрагмента кода.

+0

Если вы хотите получить состояние всей клавиатуры (т. Е. Все ключи), не делайте несколько вызовов в 'GetAsyncKeyState'. Вместо этого вызовите 'GetKeyboardState'. Это будет намного лучше.Но для ключевого регистратора вы хотите использовать клавиатурный крючок или слушать 'WM_KEYUP',' WM_KEYDOWN' и т. Д. –

ответ

1

Вы используете эту функцию неправильно. Чтение документации, прежде чем обратиться за помощью, как правило, хорошая идея ...

Я просто процитировать MSDN здесь:

Если функция завершается успешно, возвращаемое значение определяет, будет ли клавиша была нажата после последнего звоните в GetAsyncKeyState, и находится ли в данный момент ключ вверх или вниз. Если задан самый старший бит, клавиша не работает, и если установлен младший значащий бит, клавиша была нажата после предыдущего вызова GetAsyncKeyState. Однако вы не должны полагаться на это последнее поведение; для получения дополнительной информации см. примечания .

Эта последняя часть также означает, что она абсолютно бесполезна для ключевого регистратора.

PS: Рассмотрите возможность использования GetKeyNameText для перевода кодов виртуальных ключей в значащие имена.

+0

Спасибо. Я обязательно буду проверять MSDN с этого момента, я, должно быть, не обратил на это внимания. –

1

Ну, во-первых, вы не хотите использовать GetAsyncKeyState, если вы пишете регистратор ключей; GetAsyncKeyState получает состояние ключа в тот момент, когда вы вызываете функцию. Вам необходимо прослушивать сообщения Windows, например, WM_KEYDOWN, WM_KEYUP или в зависимости от цели регистратора WM_CHAR, WM_UNICHAR и т. Д.

+0

Благодарим вас за отзыв. –

1

Для контроля ввода, что-то вроде крючка с клавиатурой, вероятно, это путь (найдите SetWindowsHookEx с WH_KEYBOARD_LL на MSDN).

Как уже упоминалось в другом месте, вы не используете GetAsyncKeyState правильно здесь.

А почему вы видите адрес появится:

out << &key; // amp'd 

Это несколько мест в коде: ключ является DWORD_PTR, так & ключа является указателем - это, вероятно, где адреса приходят из.

Смежные вопросы