微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与Windows套接字的WriteFile返回无效的参数错误

我一直在努力与Windows套接字两天,不能像在Linux中一样使用写入套接字。 我想写我自己的shellcode,我正在玩如何redirect标准输出,标准input到套接字句柄(这是我的播放来自何处)。 如果有必要,我使用Windows 7 x64,build立7601。 这是我的代码

#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int main (int argc,char ** argv) { // boring code starts if (argc < 2) { printf("Usage getstdhandle <ip> <port> "); } WSADATA wsadata; int result = WSAStartup (MAKEWORD(2,2),&wsadata); if (result != NO_ERROR) { printf("error with wsastartup"); } struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons (atoi(argv[2])); server.sin_addr.s_addr = inet_addr (argv[1]); SOCKET soc = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (soc == INVALID_SOCKET) { printf("Error with creating socket"); } if (connect(soc,(struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR) { printf("Problem with connecting"); } // boring code ends const char * buf = "Tekscik n"; // kNow it's not really good in new C standards const char buf[] = "Testn"; // not working also,shouldn't have any influence bool isSent = WriteFile((HANDLE)soc,(LPCVOID)buf,(DWORD)10,NULL,NULL); DWORD ret = GetLastError(); printf("%.08x",ret); closesocket(soc); WSACleanup(); return 0; }

这是我如何运行我的程序

C:UsersDomin568Desktop>getstdhandle 192.168.56.1 5555 Tekscik 00000057 <---- Error code in hex

在我的第二台机器上,我只是运行nc来听这样的数据:

15:14|domin568[21] ~ $ nc -l -v -p 5555 Connection from 192.168.56.101:50328 15:15|domin568[22] ~ $

我得到错误代码0x57这是:

函数上进行互斥

为什么errno可以通过scanf设置为零(当input“ctrl + D”时)

抢先,pthread_spin_lock和atomic内置

C ++ boost日志logging编译错误(linux)

“命名pipe道”通常如何实施“握手”?

ERROR_INVALID_ParaMETER 87(0x57)该参数不正确。

本地networkingstream量 (任何数据发送,纯连接握手和FIN)

这可能是什么原因? 我知道这不是发送数据的好方法,但MSDN表示应该可以。

使用Blink作为前端布局引擎 – 从哪里开始?

WinZip是否有环境variables或等价物?

通过system()调用 n r t

在Linux内核编译中将.o文件放在单独的文件夹中

如何在Windows上获取ISO 8601格式的date时间?

来自WriteFile文档

lpOverlapped [输入,输出,可选]

如果使用FILE_FLAG_OVERLAPPED打开hFile参数,则需要指向OVERLAPPED结构的指针,否则此参数可以为NULL。

但是socket函数创建文件套接字这是文件句柄,它指向FILE_OBJECT结构 )与FILE_FLAG_OVERLAPPED ? 这是无证的,你不能控制这个。 所以你需要使用OVERLAPPED作为WriteFile参数。

如果使用WSASocket我们这里已经有了dwFlags选项,可以设置或者不设置WSA_FLAG_OVERLAPPED (相当于CreateFile的FILE_FLAG_OVERLAPPED )

为什么 OVERLAPPED结构在我们使用FILE_FLAG_OVERLAPPED标志打开的hFile时是必需的 ( FILE_OBJECT没有FO_SYNCHRONOUS_IO标志 )

WriteFile调用ZwWriteFile

寻找

PLARGE_INTEGER ByteOffset [in,optional]参数 – 但是只有当我们打开文件为同步时,它才是可选的。 如果文件以异步I / O模式打开 – 此参数是强制性的

源自wrk源代码

if (fileObject->Flags & FO_SYNCHRONOUS_IO) { } else if (!ARGUMENT_PRESENT( ByteOffset ) && !(fileObject->Flags & (FO_NAMED_PIPE | FO_mailslot))) { // // The file is not open for synchronous I/O operations,but the // caller did not specify a ByteOffset parameter. This is an error // situation,so cleanup and return with the appropriate status. // if (eventObject) { ObDereferenceObject( eventObject ); } ObDereferenceObject( fileObject ); return STATUS_INVALID_ParaMETER; }

当你打电话时,这正是你的情况

WriteFile((HANDLE)soc,NULL);

NtWriteFile返回给你STATUS_INVALID_ParaMETER转换成win32错误ERROR_INVALID_ParaMETER

但下一个代码将工作正常。

OVERLAPPED ov = {}; BOOL isSent = WriteFile((HANDLE)soc,&ov);

因为在这种情况下, ByteOffset将指向&ov.Offset

然而对于发送数据到套接字更好的使用WSASend

MSDN说这应该是可能的。

它真的吗? 套接字处理文档状态 :

套接字句柄可以选择性地作为Windows套接字2中的文件句柄。来自Winsock提供程序的套接字句柄可以与其他非Winsock函数(如ReadFile,WriteFile,ReadFileEx和WriteFileEx)一起使用。

请注意“可选”一词。

根据这个讨论 :

使用SocketHandle的WriteFile失败

不知道如何阅读该页面,并认为与ReadFile等使用套接字句柄是一个好主意。

让我们从这句话开始:“套接字句柄可以选择性地作为Windows套接字2中的文件句柄”。 这可以读取两种不同的方式:

您可以选择使用任何套接字句柄作为ReadFile和朋友的文件句柄

套接字提供程序可以选择性地提供与ReadFile一起使用的双用套接字以及套接函数

不幸的是,这篇文章中没有足够的信息来决定是否确定#1或#2是否正确。 但是,ReadFile返回ERROR_INVALID_ParaMETER(根据Mike Danes评论)的事实,我将假定#2是正确的解释,您的网络套接字也不是一个文件句柄。 (请注意,从实现API的团队的角度来看,MSDN文档通常比从API的使用者更多的角度来编写,如果从这个角度来看,那么#2更有可能的解释 – 我会同意它是烦人的,因为API的消费者更可能将该句子理解为#1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐