我一直在搞乱应用程序中的绕行功能。我为自己设置的挑战是绕道使用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;
}