我一直在努力与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] ~ $
在函数上进行互斥
为什么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或等价物?
如何在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] 举报,一经查实,本站将立刻删除。