【问题标题】:WriteConsole and ReadConsole Example - Doesn't read and write successfullyWriteConsole 和 ReadConsole 示例 - 无法成功读写
【发布时间】:2020-11-05 21:29:27
【问题描述】:

我编写了以下程序来向用户打印一条消息并从中获取密码。然后我想用我的首选密码检查并验证输入密码。最后,我想向用户显示一条消息。但是,我的程序不起作用。它会向用户打印垃圾字符,或者当我给它输入时,它会显示错误消息。我认为我错误地定义了变量,但是,我不知道使用这些 API 的最佳方式是什么。

#include <Windows.h>
#include <stdio.h>

void PasswordCheck()
{
    char message_console[MAX_PATH];
    char key_accepted[MAX_PATH];
    char bad_key[MAX_PATH];
    char password_store[MAX_PATH];
    DWORD chars_read;

    strcpy(message_console, "Enter password for this malware: ");
    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), message_console, sizeof(message_console), NULL, NULL);
    ReadConsoleA(GetStdHandle(STD_INPUT_HANDLE), password_store, MAX_PATH, &chars_read, NULL);
    
    if (!strcmp(password_store, "password"))
    {
        strcpy(key_accepted, "Key Accepted");
        WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), key_accepted, sizeof(key_accepted), NULL, NULL);
    }
    else
    {
        strcpy(bad_key, "Bad key");
        WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), bad_key, sizeof(bad_key), NULL, NULL);
    }
}

int main(int argc, char* argv[])
{
    PasswordCheck();

    return 0;
}

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    从当前代码发送和预期的长度错误:

    • 使用strlen() 而不是sizeof() 来确定字符串长度。 sizeof() 返回数组的大小 (MAX_PATH),因此垃圾来自数组的其余部分。
    • 如果您检查 chars_read 中的值,您会看到 ReadConsole 也返回回车和换行 (\r\n)。
    • strncmp() 应该用作来自 ReadConsole 的返回不是以空值结尾的。 此代码有效:
    #include <Windows.h>
    #include <stdio.h>
    
    void PasswordCheck() {
        char message_console[MAX_PATH];
        char key_accepted[MAX_PATH];
        char bad_key[MAX_PATH];
        char password_store[MAX_PATH];
        DWORD chars_read;
    
        strcpy(message_console, "Enter password for this malware: ");
        WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), message_console, strlen(message_console), NULL, NULL);
        ReadConsoleA(GetStdHandle(STD_INPUT_HANDLE), password_store, MAX_PATH, &chars_read, NULL);
        if (!strncmp(password_store, "password\r\n",chars_read)) {
            strcpy(key_accepted, "Key Accepted");
            WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), key_accepted, strlen(key_accepted), NULL, NULL);
        } else {
            strcpy(bad_key, "Bad key");
            WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), bad_key, strlen(bad_key), NULL, NULL);
        }
    }
    
    int main(int argc, char* argv[]) {
        PasswordCheck();
        return 0;
    }
    
    C:\>test
    Enter password for this malware: password
    Key Accepted
    C:\>test
    Enter password for this malware: blah
    Bad key
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2011-02-15
      相关资源
      最近更新 更多