⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pipe.asm

📁 用汇编编的匿名管道
💻 ASM
字号:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
include \masm32\include\gdi32.inc
includelib \masm32\lib\gdi32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
IDM_EXEC    equ 1
IDM_EXIT    equ 2
F_RUNNING	equ	0001h
.data
ClassName db "SimpleWinClass",0
AppName  db "Our First Window",0
MainMenu    db  "MainMenu",0
EditClass	db "EDIT",0
cmd         db  "C:\winXP\system32\cmd.exe",0
lpCMD       db  " /c debug",0,"C:\winXP\system32\CMD.EXE",0,"c:\command.com",0,"d:\winnt\system32\cmd.exe",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndEdit        dd  ?
OldWndProc      dd  ?
dwFlag          dd  ?

hRead1		dd	?
hWrite1		dd	?
hRead2		dd	?
hWrite2		dd	?
hRead3		dd	?
hWrite3		dd	?
ThreadID         dd     ?
hwnd            dd      ?

.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
	invoke GetCommandLine
	mov    CommandLine,eax
	invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
	invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
	LOCAL wc:WNDCLASSEX
	LOCAL msg:MSG

	mov   wc.cbSize,SIZEOF WNDCLASSEX
	mov   wc.style, CS_HREDRAW or CS_VREDRAW
	mov   wc.lpfnWndProc, OFFSET WndProc
	mov   wc.cbClsExtra,NULL
	mov   wc.cbWndExtra,NULL
	push  hInstance
	pop   wc.hInstance
	mov   wc.hbrBackground,2
	mov   wc.lpszMenuName,OFFSET MainMenu
	mov   wc.lpszClassName,OFFSET ClassName
	invoke LoadIcon,NULL,IDI_APPLICATION
	mov   wc.hIcon,eax
	mov   wc.hIconSm,eax
	invoke LoadCursor,NULL,IDC_ARROW
	mov   wc.hCursor,eax
	invoke RegisterClassEx, addr wc
	INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInst,NULL
	mov   hwnd,eax
	invoke ShowWindow, hwnd,SW_SHOWNORMAL
	invoke UpdateWindow, hwnd
	.WHILE TRUE
		invoke GetMessage, ADDR msg,NULL,0,0
		.BREAK .IF (!eax)
		invoke TranslateMessage, ADDR msg
		invoke DispatchMessage, ADDR msg
	.ENDW
	mov     eax,msg.wParam
	ret
WinMain endp
RunThread	proc
		local	stSecurity:SECURITY_ATTRIBUTES
            local stStartUp:STARTUPINFO
            local stProcInfo:PROCESS_INFORMATION
		local	dwExitCode:DWORD
		local	dwBytesRead:DWORD
            local szBuffer[512]:byte
            
		or	dwFlag,F_RUNNING

		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
		mov   eax,hRead1
		mov	stStartUp.hStdInput,eax
		mov	eax,hWrite2
		mov	stStartUp.hStdOutput,eax
		mov	stStartUp.hStdError,eax
		mov	stStartUp.dwFlags,STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW
		mov	stStartUp.wShowWindow,SW_HIDE
            invoke	CreateProcess,addr cmd,NULL,NULL,NULL,TRUE,NULL,NULL,NULL,addr stStartUp,addr stProcInfo
		.if	eax !=0
			.while   TRUE
				invoke GetExitCodeProcess,stProcInfo.hProcess,addr dwExitCode
				.break .if dwExitCode != STILL_ACTIVE
				invoke PeekNamedPipe,hRead2,addr szBuffer,511,addr dwBytesRead,NULL,NULL
				.if   dwBytesRead != 0
					invoke RtlZeroMemory,addr szBuffer,512
					invoke ReadFile,hRead2,addr szBuffer,dwBytesRead,addr dwBytesRead,NULL
                			invoke SendMessage,hwndEdit,EM_SETSEL,-1,0
					invoke SendMessage,hwndEdit,EM_REPLACESEL,FALSE,addr szBuffer
                              ;invoke SetWindowText,hwnd,addr szBuffer
				.endif
			.endw
			invoke	CloseHandle,stProcInfo.hProcess
			invoke	CloseHandle,stProcInfo.hThread
		.else
			invoke	MessageBox,0,addr lpCMD,NULL,0
		.endif
		invoke CloseHandle,hRead1
		invoke CloseHandle,hWrite1
		invoke CloseHandle,hRead2
		invoke CloseHandle,hWrite2

		invoke	EnableWindow,hwndEdit,FALSE
		and	dwFlag,not F_RUNNING
		ret

RunThread	endp
InputProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
	local	szBuffer[4]:BYTE
	local	dwBytesWrite:dword
	.if uMsg==WM_CHAR
	mov	eax,wParam
	movzx	eax,al
	mov	dword ptr szBuffer,eax
	test	dwFlag,F_RUNNING
	.if	!ZERO?
            .if szBuffer[0]==13
                mov szBuffer[1],10
                invoke	WriteFile,hWrite1,addr szBuffer,2,addr dwBytesWrite,NULL
            .else
                invoke	WriteFile,hWrite1,addr szBuffer,1,addr dwBytesWrite,NULL
            .endif
	.endif
      .elseif uMsg==WM_KEYDOWN
            
	.else
		invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
		ret
	.endif

	xor eax,eax
	ret
InputProc endp
_InputProc	proc	uses ebx edi esi, \
		hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
		local	@szBuffer[4]:BYTE
		local	@dwBytesWrite

		mov	eax,uMsg
		.if	eax == WM_CHAR
			mov	eax,wParam
			movzx	eax,al
			mov	dword ptr @szBuffer,eax
			test	dwFlag,F_RUNNING

			.if	!ZERO?
                        .if   @szBuffer[0]==13
                            mov   @szBuffer[1],10
                        .endif
				invoke	WriteFile,hWrite2,addr @szBuffer,2,addr @dwBytesWrite,NULL
			.endif
			xor	eax,eax
			ret
		.endif
            invoke CallWindowProc,OldWndProc,hWnd,uMsg,wParam,lParam
		ret

_InputProc	endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

	.IF uMsg==WM_DESTROY
		invoke PostQuitMessage,NULL
      .elseif uMsg==WM_CREATE
            invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset EditClass,NULL,WS_CHILD+WS_VISIBLE+WS_VSCROLL+ES_MULTILINE,0,0,0,0,hWnd,NULL,hInstance,NULL
		mov hwndEdit,eax
		invoke SetWindowLong,hwndEdit,GWL_WNDPROC,addr InputProc
		mov OldWndProc,eax
	.elseif uMsg==WM_CTLCOLOREDIT
		invoke SetTextColor,wParam,White
		invoke SetBkColor,wParam,Black
		invoke GetStockObject,BLACK_BRUSH
		ret
	.elseif uMsg==WM_SIZE
		mov edx,lParam
		mov ecx,edx
		shr ecx,16
		and edx,0ffffh
		invoke MoveWindow,hwndEdit,0,0,edx,ecx,TRUE
	.elseif uMsg==WM_COMMAND
            mov	eax,wParam
            .if eax==IDM_EXEC
                test	dwFlag,F_RUNNING
                .if	ZERO?
                    invoke	EnableWindow,hwndEdit,TRUE
                    invoke	SetFocus,hwndEdit
                    invoke	CreateThread,NULL,NULL,offset RunThread,NULL,NULL,addr ThreadID
                    ;invoke MessageBox ,0,addr EditClass,addr EditClass,0
                .else
                    invoke	TerminateProcess,ThreadID,-1
                .endif
            .elseif eax==IDM_EXIT
                invoke ExitProcess,eax
            .endif
	.elseif uMsg==WM_LBUTTONDOWN

	.ELSE
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam		
		ret
	.ENDIF
	xor eax,eax
	ret
WndProc endp

end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -