winsock recv hooking 上的 C++ Detour - 自定义数据包
C++ Detour on winsock recv hooking - custom packet
我正在尝试在 MyRecv
函数中添加额外的数据包,但我不知道为什么它不起作用。我尝试解析传入的数据包并且功能正常。
所以可能我向应用程序发送自定义数据包的方式不正确。
一般来说,我只想将准备好的数据包发送到应用程序。
这个数据包是我从 WPE PRO 拿来的。
带有 MyRecv 函数的代码:
INT WINAPI MyRecv(SOCKET sock, CHAR* buf, INT len, INT flags) {
CHAR buffer[256];
char msg2[] = { 0x1B, 0, 0x04, 0x06, 0, 0x5A, 0x65, 0x6E, 0x74, 0x61,
0x78, 0x06, 0, 0x5A, 0x65, 0x6E, 0x74, 0x61, 0x78, 0x05, 0x07, 0,
0x66, 0x61, 0x6A, 0x6E, 0x69, 0x65, 0x65 };
int ret = precv(sock, buf, len, flags);
if (ret <= 0) {
return ret;
}
if (fake_recv) {
char tmp[256];
fake_recv = false;
printf("Fake1-> Lenght:%d Size:%d", len, strlen(buf));
strcat(buf, msg2);
printf("Fake2-> Lenght:%d Size:%d", len, strlen(buf));
return ret;
}
return ret;
}
msg2
不是以 null 结尾的字符串。事实上它有一个内部空值。因此,使用 strlen()
和 strcat()
永远不会奏效。
同样,您既不知道也不关心 buf,
中已经存在的内容,因此调用 strcat()
和 strlen()
既毫无意义又危险:如果它根本不包含空值,您将结束-运行它,最好的情况是多报长度,最坏的情况是崩溃。
并且您没有针对添加到缓冲区中的额外数据调整 ret
。
并且声明未使用的 tmp[]
变量没有任何用处。
试试这个:
if (fake_recv) {
fake_recv = false;
printf("Fake1-> Length:%d Received:%d", len, ret);
int len2 = min(len-ret, sizeof msg2);
memcpy(&buf[ret], msg2, len2);
ret += len2;
printf("Fake2-> Length:%d Received:%d", len, ret);
return ret;
}
我正在尝试在 MyRecv
函数中添加额外的数据包,但我不知道为什么它不起作用。我尝试解析传入的数据包并且功能正常。
所以可能我向应用程序发送自定义数据包的方式不正确。
一般来说,我只想将准备好的数据包发送到应用程序。 这个数据包是我从 WPE PRO 拿来的。
带有 MyRecv 函数的代码:
INT WINAPI MyRecv(SOCKET sock, CHAR* buf, INT len, INT flags) {
CHAR buffer[256];
char msg2[] = { 0x1B, 0, 0x04, 0x06, 0, 0x5A, 0x65, 0x6E, 0x74, 0x61,
0x78, 0x06, 0, 0x5A, 0x65, 0x6E, 0x74, 0x61, 0x78, 0x05, 0x07, 0,
0x66, 0x61, 0x6A, 0x6E, 0x69, 0x65, 0x65 };
int ret = precv(sock, buf, len, flags);
if (ret <= 0) {
return ret;
}
if (fake_recv) {
char tmp[256];
fake_recv = false;
printf("Fake1-> Lenght:%d Size:%d", len, strlen(buf));
strcat(buf, msg2);
printf("Fake2-> Lenght:%d Size:%d", len, strlen(buf));
return ret;
}
return ret;
}
msg2
不是以 null 结尾的字符串。事实上它有一个内部空值。因此,使用 strlen()
和 strcat()
永远不会奏效。
同样,您既不知道也不关心 buf,
中已经存在的内容,因此调用 strcat()
和 strlen()
既毫无意义又危险:如果它根本不包含空值,您将结束-运行它,最好的情况是多报长度,最坏的情况是崩溃。
并且您没有针对添加到缓冲区中的额外数据调整 ret
。
并且声明未使用的 tmp[]
变量没有任何用处。
试试这个:
if (fake_recv) {
fake_recv = false;
printf("Fake1-> Length:%d Received:%d", len, ret);
int len2 = min(len-ret, sizeof msg2);
memcpy(&buf[ret], msg2, len2);
ret += len2;
printf("Fake2-> Length:%d Received:%d", len, ret);
return ret;
}