高分请求大侠帮忙!!高手进

hcling03 2004-02-29 11:22:02
程序目的:
新开一个cmd进程,读入命令行,用管道传入新的cmd进程执行,返回执行的结果
由管道返回,在当前的控制台显示

代码:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Code for excuting console command
;By hcling97@yanghua.net 2004-2-28
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Include
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include kernel32.inc
includelib kernel32.lib
include ws2_32.inc
includelib ws2_32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
dwOption dd ?
F_ABORT equ 0001h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szCmd db 'cmd.exe',0
szExcuteOK db '命令成功执行!',0dh,0ah,0
sztest db '这个随机用来测试用的!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>
.code
include _Console.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcessCommand proc lpCommand
local @stPipeSa:SECURITY_ATTRIBUTES
local @stSI:STARTUPINFO
local @stPI:PROCESS_INFORMATION
local @PipeRead1,@PipeRead2,@PipeWrite1,@PipeWrite2
local @byteRead,@pHandle
local @buffer2[1024]:byte

pushad
mov @stPipeSa.nLength,sizeof SECURITY_ATTRIBUTES
mov @stPipeSa.lpSecurityDescriptor,0
mov @stPipeSa.bInheritHandle,TRUE

invoke CreatePipe,addr @PipeRead1,addr @PipeWrite1,addr @stPipeSa,0
invoke CreatePipe,addr @PipeRead2,addr @PipeWrite2,addr @stPipeSa,0

invoke RtlZeroMemory,addr @stSI,sizeof @stSI

mov @stSI.dwFlags,STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES

mov @stSI.wShowWindow,SW_HIDE
push @PipeRead1
pop @stSI.hStdInput
push @PipeWrite2
pop eax
mov @stSI.hStdOutput,eax
mov @stSI.hStdError,eax
invoke CreateProcess,NULL,addr szCmd,NULL,NULL,1,0,NULL,NULL,addr @stSI,addr @stPI
mov @pHandle,eax
invoke PeekNamedPipe,@PipeRead2,addr @buffer2,1024,addr @byteRead,0,0
.if @byteRead
invoke ReadFile,@PipeRead2,addr @buffer2,@byteRead,addr @byteRead,0
invoke _ConsolePrint,addr @buffer2
.else
invoke _ConsolePrint,addr szExcuteOK
.endif
invoke lstrlen,lpCommand
mov ecx,eax
invoke WriteFile,@PipeWrite1,lpCommand,ecx,addr @byteRead,0
invoke PeekNamedPipe,@PipeRead2,addr @buffer2,sizeof @buffer2,addr @byteRead,0,0
.if @byteRead
invoke ReadFile,@PipeRead2,addr @buffer2,@byteRead,addr @byteRead,0
invoke _ConsolePrint,addr @buffer2
invoke _ConsolePrint,addr sztest
.else
invoke _ConsolePrint,addr szExcuteOK
.endif
invoke CloseHandle,@PipeRead1
invoke CloseHandle,@PipeRead2
invoke CloseHandle,@PipeWrite1
invoke CloseHandle,@PipeWrite2
invoke TerminateProcess,@pHandle,NULL
invoke CloseHandle,@pHandle
popad
_ProcessCommand endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke _ConsoleInit
invoke _ConsoleRead
invoke _ProcessCommand,eax
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start







;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 控制台程序的公用子程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hStdIn dd ? ;控制台输入句柄
hStdOut dd ? ;控制台输出句柄
.data
szErr db 'Error!',0
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 控制台 Ctrl-C 捕获例程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CtrlHandler proc _dwCtrlType

pushad
mov eax,_dwCtrlType
.if eax == CTRL_C_EVENT || eax == CTRL_BREAK_EVENT
or dwOption,F_ABORT
.endif
popad
mov eax,TRUE
ret

_CtrlHandler endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 控制台初始化
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ConsoleInit proc

invoke GetStdHandle,STD_INPUT_HANDLE
mov hStdIn,eax
invoke GetStdHandle,STD_OUTPUT_HANDLE
mov hStdOut,eax
invoke SetConsoleCtrlHandler,addr _CtrlHandler,TRUE
ret

_ConsoleInit endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 控制台输出子程序
; 注意: 用 WriteConsole 输出则执行时无法用 > 重定向到文件
; 用 WriteFile 则可以
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ConsolePrint proc _lpsz
local @dwCharWritten

pushad
invoke lstrlen,_lpsz
lea ecx,@dwCharWritten
invoke WriteFile,hStdOut,_lpsz,eax,ecx,NULL
popad
ret

_ConsolePrint endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ConsoleRead proc
local @buffer1[1024]:byte
local @byteRead1
pushad
invoke RtlZeroMemory,addr @buffer1,sizeof @buffer1
invoke ReadConsole,hStdIn,addr @buffer1,sizeof @buffer1,addr @byteRead1,0
popad
lea eax,@buffer1
ret
_ConsoleRead endp

出现的问题:开始PeekNamedPipe 读不到创建进程以后系统返回的的Microsoft Windows2000 [Vertion 5.0 2195]等等的提示信息。
输入的命令行是可以执行的,但是执行结果无法返回
最后新建的cmd进程不能够删除!
大虾帮忙!!!!
...全文
22 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

21,458

社区成员

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

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