VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4024|回复: 11

[讨论]win32汇编如何实现cmd的输出转向

[复制链接]

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-12-17 13:00:01 | 显示全部楼层 |阅读模式
VC++是这样来着:

ret=bind(listenFD,(sockaddr *)&server,sizeof(server));
   ret=listen(listenFD,2);
   //如果客户请求830端口,接受连接
   int iAddrSize = sizeof(server);
   SOCKET clientFD=accept(listenFD,(sockaddr *)&server,&iAddrSize);

   STARTUPINFO si;
   ZeroMemory(&si,sizeof(si));
   si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
   si.wShowWindow = SW_HIDE;
   si.wShowWindow = SW_SHOWNORMAL;
   
   si.hStdInput = si.hStdOutput = si.hStdError = (void *)clientFD;
   char cmdLine[] = "cmd.exe";
   PROCESS_INFORMATION ProcessInformation;
   //建立进程   
   ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&ProcessInformation);
   
   return 0;
}

这个代码实现了cmd的输出转向,但是用汇编我不知道怎么搞,一般我是用CreateProcess直接执行命令行了.....
.
.
.
.

    invoke    WSAStartup,0202H,addr @wsaData ;初始化WSAStartup库
       invoke    RtlZeroMemory,addr @stAddr,sizeof sockaddr_in ;清空内存
       mov    @stAddr.sin_family,AF_INET ;设置IP格式
       invoke    htons,TCP_PORT ;设置端口
       mov    @stAddr.sin_port,ax ;保存
       mov    @stAddr.sin_addr,INADDR_ANY ;设置IP地址
       invoke    socket,AF_INET,SOCK_STREAM,0 ;加载套接字
       .if    eax != INVALID_SOCKET
       mov    hScoket,eax ;保存句柄
       .endif
       invoke    bind,hScoket,addr @stAddr,sizeof sockaddr_in ;绑定
       .if    eax != SOCKET_ERROR
       invoke    listen,hScoket,5 ;开始监听,默认连接5个
       .endif
       invoke    accept,hScoket,NULL,NULL ;如果有客户端连接,马上确定
.
.
invoke    recv,hScoket1,addr szBuffer,1024,0 ;开始接收命令
.
.
invoke    GetStartupInfo,addr stStartUp
       invoke    CreateProcess,NULL,addr szBuffer,NULL,NULL,NULL,\ ;是的话就处理
           CREATE_NO_WINDOW,NULL,NULL,addr stStartUp,addr stProcInfo

这样挺麻烦的,如果能直接实现cmd输出转向,那就非常的好了
回复

使用道具 举报

0

主题

15

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-12-17 20:15:01 | 显示全部楼层
如果vc中可以,win32asm同样可以,使用 /subsystem:console 连接,然后使用
控制台api即可。
回复

使用道具 举报

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-12-18 11:00:01 | 显示全部楼层
是在link VC代码还是asm的时候用/subsystem:console ?
回复

使用道具 举报

0

主题

15

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-12-18 12:15:01 | 显示全部楼层
在 masm32 link时用。
回复

使用道具 举报

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-12-18 14:30:01 | 显示全部楼层
:(

我加了 貌似不行耶
回复

使用道具 举报

0

主题

23

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
发表于 2020-12-18 16:00:01 | 显示全部楼层
楼主没有将创建 cmd.exe 进程时的 StartupInfo 结构中的 hStdInput, hStdOutput 以及 hStdError 等成员指向前面 accept() 函数返回的句柄. 上面的 c 里面是这么做的
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-12-19 14:30:01 | 显示全部楼层
nod 一楼xsteel 你使用了控制台,又没有使用控制台API,照样没有结果啊。
invoke stdout,addr szBuffer
invoke stdin,addr szBuffer
使用标准控制台API输入输出语句
回复

使用道具 举报

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-12-19 17:30:01 | 显示全部楼层
好象都不需要用到控制台API吧?

输入只是在客户端,如果是telnet登陆的话,已经有了.而服务端是不用到stdout的,最多用个send发送到客户端上

回复

使用道具 举报

1

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-12-20 16:00:01 | 显示全部楼层
szCommand db 'cmd.exe',0
.
.
      invoke    accept,hScoket,NULL,NULL ;如果有客户端连接,马上确定
       .if    eax != INVALID_SOCKET
       mov hScoketOther,eax
      invoke        GetStartupInfo,addr stStartUp
      mov   ebx,hScoketOther
                mov        stStartUp.hStdInput,ebx
                mov        stStartUp.hStdOutput,ebx
                mov        stStartUp.hStdError,ebx
                mov        stStartUp.dwFlags,STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES
                mov        stStartUp.wShowWindow,SW_HIDE
                mov   stStartUp.wShowWindow,SW_SHOWNORMAL
                invoke        CreateProcess,NULL,addr szCommand,NULL,NULL,\
                        NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,offset stStartUp,offset stProcInfo
           .endif
       汗死,一连接,马上就断开了....
回复

使用道具 举报

0

主题

17

帖子

16.00

积分

新手上路

Rank: 1

积分
16.00
发表于 2020-12-20 20:30:01 | 显示全部楼层
用pipe就可以了。msdn有完整的源代码。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表