首页
社区
课程
招聘
汇编中重定向CMD的问题
发表于: 2010-2-8 21:45 3739

汇编中重定向CMD的问题

2010-2-8 21:45
3739
我做了一个汇编重定向CMD例子程序,用了管道来实现,但是遇到问题了,请看下面的源程序

_CMDSHELL	proc	_szCmd
	
		LOCAL	@stSecurity:SECURITY_ATTRIBUTES
		LOCAL	@stStartUp:STARTUPINFO
		LOCAL	@stProcInfo:PROCESS_INFORMATION
		LOCAL	@hRead1,@hRead2,@hWrite1,@hWrite2
		local	@dwExitCode
		local	@dwBytesRead,@dwBytesWrite
		local	@stRange:CHARRANGE
		
		invoke	lstrcpy,addr szLBuf,_szCmd
		invoke	RtlZeroMemory,addr @stSecurity,sizeof @stSecurity
		invoke	RtlZeroMemory,addr @stStartUp,sizeof @stStartUp
		mov	@stSecurity.nLength,sizeof SECURITY_ATTRIBUTES
		mov	@stSecurity.lpSecurityDescriptor,NULL
		mov	@stSecurity.bInheritHandle,TRUE
		invoke	CreatePipe,addr @hRead1,addr @hWrite1,addr @stSecurity,NULL
		invoke	CreatePipe,addr @hRead2,addr @hWrite2,addr @stSecurity,NULL
		invoke	GetStartupInfo,addr @stStartUp
		push	@hRead1
		pop	@stStartUp.hStdInput
		push	@hWrite2
		pop	@stStartUp.hStdOutput
		push	@hWrite2
		pop	@stStartUp.hStdError
		mov	@stStartUp.dwFlags,STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW
		mov	@stStartUp.wShowWindow,SW_HIDE
		invoke	CreateProcess,NULL,addr szCmd,NULL,NULL,\
			NULL,NORMAL_PRIORITY_CLASS,NULL,NULL,addr @stStartUp,addr @stProcInfo
		.if	eax !=	0
			invoke	WriteFile,@hWrite1,addr szLBuf,511,addr @dwBytesWrite,NULL
			.while	TRUE
				;invoke	GetExitCodeProcess,@stProcInfo.hProcess,addr @dwExitCode
				;.break	.if @dwExitCode != STILL_ACTIVE
[COLOR="Red"]				;问题在下面这一句,@dwBytesRead返回的一直是0值
				invoke	PeekNamedPipe,@hRead2,addr szBuffer,511,addr @dwBytesRead,NULL,NULL[/COLOR]
				.if	@dwBytesRead !=	0
					invoke RtlZeroMemory,addr szBuffer,sizeof szBuffer
					invoke	ReadFile,@hRead2,addr szBuffer,511,addr @dwBytesRead,NULL
					.break	.if	eax == NULL
					mov	@stRange.cpMin,-1
					mov	@stRange.cpMax,-1
					invoke	SendMessage,hWinText,EM_EXSETSEL,0,addr	@stRange
					invoke	SendMessage,hWinText,EM_REPLACESEL,FALSE,addr szLBuf
					invoke	SendMessage,hWinText,EM_SCROLLCARET,NULL,NULL
					;invoke	SendMessage,hWinText,WM_SETFONqT,hFont,0
				.endif
			.endw
			invoke	CloseHandle,@stProcInfo.hProcess
			invoke	CloseHandle,@stProcInfo.hThread
		.else
			invoke	MessageBox,hWinMain,addr szExcuteError,NULL,MB_OK or MB_ICONERROR
		.endif
		invoke CloseHandle,@hRead1
		invoke CloseHandle,@hWrite1
		invoke CloseHandle,@hRead2
		invoke CloseHandle,@hWrite2
		ret

_CMDSHELL 	endp

_ProcDlgMain  	proc  uses ebx edi esi hWnd,wMsg,wParam,lParam

		LOCAL	@szBuffer[512]:byte
		LOCAL	@stPos:POINT
		
   		mov  eax,wMsg
    		.if  eax == WM_CLOSE
      			invoke  EndDialog,hWnd,NULL
    		.elseif  eax == WM_INITDIALOG
			push	hWnd
			pop	hWinMain
			invoke	GetDlgItem,hWnd,IDC_EDT2
			mov	hWinText,eax
		.elseif  eax == WM_COMMAND
			mov	eax,wParam
			.if	ax == IDOK
				invoke	GetDlgItemText,hWinMain,IDC_EDT1,addr szText,sizeof szText
				push	ecx
				invoke	CreateThread,NULL,0,offset _CMDSHELL,addr szText,NULL,esp
				pop	ecx
				invoke	CloseHandle,eax
			.endif
    		.else 
      			mov  eax,FALSE
      			ret
    		.endif 
    		mov  eax,TRUE 
   	ret

_ProcDlgMain  endp

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 75
活跃值: (688)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
楼主,你的程序中间有两个没有考虑到的地方
1)BOOL CreateProcess(

    LPCTSTR lpApplicationName,        // pointer to name of executable module
    LPTSTR lpCommandLine,        // pointer to command line string
    LPSECURITY_ATTRIBUTES lpProcessAttributes,        // pointer to process security attributes
    LPSECURITY_ATTRIBUTES lpThreadAttributes,        // pointer to thread security attributes

    BOOL bInheritHandles,        // handle inheritance flag
    DWORD dwCreationFlags,        // creation flags
    LPVOID lpEnvironment,        // pointer to new environment block
    LPCTSTR lpCurrentDirectory,        // pointer to current directory name
    LPSTARTUPINFO lpStartupInfo,        // pointer to STARTUPINFO
    LPPROCESS_INFORMATION lpProcessInformation         // pointer to PROCESS_INFORMATION  
   );
这三个参数是需要设置的
2)invoke        GetDlgItemText,hWinMain,IDC_EDT1,addr szText,sizeof szText
直接把这个函数获得的输入输入进管道是不行的,不符合cmd命令语法,这个曾经折磨我了一阵子

修改过后,我这边peeknamepipe是可以获得当前实际的cmd输出字符数的
具体怎么弄.见附件.
上传的附件:
2010-2-9 00:27
0
雪    币: 145
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢你的解答,你太强大了。
dwCreationFlags这个参数我直接填NULL后就可以了,还有你的附件没有上传成功哦

invoke         CreateProcess,NULL,addr szCmd,NULL,NULL,TRUE,NULL,NULL,NULL,addr @stStartUp,addr @stProcInfo
2010-2-9 01:38
0
雪    币: 145
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
解决了,先处理一下字符串再传递字符串就可以了

_CmdString         proc uses edi esi, _String

                    mov esi,_String
                    @@:
                    lodsb
                   test al,al
                    jnz @B
                    dec esi
                    mov ax,0a0dh
                    mov edi,esi
                    stosw
                    mov al,0
                    inc edi
                    stosb
   
                   Ret
   
_CmdString        EndP
2010-2-9 02:10
0
游客
登录 | 注册 方可回帖
返回
//