在C和C#之间发送数据

时间:2012-01-30 23:20:13

标签: c# c winsock

我一直在搞乱应用程序中的绕行功能。我为自己设置的挑战是绕道使用sendto和recvfrom函数的应用程序。计划是注入一个dll并将发送和接收的缓冲区复制到我的C#应用​​程序(通过相同的sendto和目标应用程序使用的recv)进行进一步分析。

我遇到的问题是从目标应用程序发送到我的程序的字节与ollydbg告诉我真正的缓冲区不匹配。

示例:A8 E4 F5 3A 1C是我的目标应用程序的真正缓冲区。          21-73-46-AB-21是我的应用程序在33 115 70 171 33的BitConverter之后得到的。

我怀疑这里涉及的问题是两种语言都有套接字缓冲区的方式(从char*byte[]),我不明白为什么会这样。但如果有人有想法,现在是时候分享了。

DLL:

int Transmitting(const char *data, int datalength, char *sendType)
{
    int ret = 0;
    int buffsize = datalength + strlen(sendType) + 1;
    char *buff = (char*)malloc(buffsize);

    for(int i = 0; i < strlen(sendType); i++)
        //Send type; is nothing more then a token of identification. (e.g. "!r" for receiving bytes)
    {
        buff[i] = sendType[i];
    }

    for(int i = 0, j = strlen(sendType); i < datalength; i++, j++)
    {
        buff[j] = data[i];
    }

    ret = Real_sendto(udpcon.sock, buff, buffsize, 0, 
        (const struct sockaddr *)&udpcon.server, udpcon.addrLength);

    free(buff);

    if (ret < 0)
    {
        errorMsg("Error with sending to transmitter");
        return FALSE;
    }

    return TRUE;
}

C#app:

void DecodeMsg(byte[] data, int bytesrecv)
{
    byte[] newdata = new byte[bytesrecv - 2];

    Array.Resize(ref data, bytesrecv);

    for (int i = 0, j = 2; j < bytesrecv; i++, j++)
    {
        newdata[i] = data[j];
    }

    switch (Convert.ToChar(data[1]))
    {
        case 's':
            forms.Invoke(forms.GUISendLog, new Object[] { newdata });
            break;
        case 'r':
            forms.Invoke(forms.GUIRecvLog, new Object[] { newdata });
            break;
    }
}

private void recvLogFunc(byte[] data)
{
    string msg = BitConverter.ToString(data);
    msg = msg.Replace("-", " ");

    recvlog.Items.Add(msg);

    recvlog.SelectedIndex = recvlog.Items.Count-1;
}

0 个答案:

没有答案