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

汇编中重定向CMD的问题

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
_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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费
支持
分享
最新回复 (3)
雪    币: 75
活跃值: (883)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册