获取Windows Shell的简单示例程序(一)
昨天看了黑防2009年VC专辑上RITATV的一篇文章<编程实现远程shell的获取>,对Windows shell的获取总算是有了一个概念.在此作下整理,希望能给像我一样的菜鸟们提供一些参考.
知识点:
一,匿名管道.
匿名管道是一个未命名的单向管道,通常在一个父进程和一个子进程之间传输数据.匿名管道只能实现本机上的两个进程之间的通信,而不能实现跨网络的通信.为了创建匿名管道,需要调用CreatePipe函数,其声明如下:
二,进程的创建.
为了创建一个进程,可以调用CreateProcess函数,其声明如下:
lpApplicationName指定应用程序名称.可以为相对路径也可以为绝对路径,但是如果为相对路径,CreateProcess函数仅会在当前路径下进程搜索,而且,该参数必须加上扩展名,系统不会自动假设文件名有一个".exe"后缀.
lpCommandLine,用来指定传递给新进程的命令行字符串.可以在lpApplicationName中传递可执行文件的名称,在lpCommandLine中指定命令行的参数.如果lpApplication为NULL,lpCommandLine以空格分隔的第一个标记将作为可执行文件路径.与lpApplicationName不同的是,如果在lpCommandLine中指定可执行文件的路径,系统会按一定的路径搜索相对路径指定的文件,且自动假设文件名带有一个".exe"后缀.
lpProcessAttributes&lpThreadAttributes都是指向SECURITY_ATTRIBUTES结构体的指针,用来设置新进程对象和新线程对象的安全性.如果指定为NULL,则采用系统默认的安全描述符.
bInheritHandle用来指定随后创建的子进程能否继承父进程的对象句柄.如果为TRUE,则父进程的每个继承的打开句柄都能被子进程继承.继承的句柄与原始句柄拥有同样的值和访问特权.
dwCreationFlags用来指定控件优先级和进程创建的附加标记.具体取值可以参考MSDN.如果只是为了启动子进程,并不需要设置它创建的标记,则将其设为0.
lpEnviroment是一个指向环境块的指针,如果为NULL,则使用调用进程的环境.
lpCurrentDirectory指定子进程的当前路径.
lpStartInfo指向一个STARTUPINFO结构.STARTUPINFO结构的定义如下:
知识点:
一,匿名管道.
匿名管道是一个未命名的单向管道,通常在一个父进程和一个子进程之间传输数据.匿名管道只能实现本机上的两个进程之间的通信,而不能实现跨网络的通信.为了创建匿名管道,需要调用CreatePipe函数,其声明如下:
BOOL CreatePipe(
PHANDLE hReadPipe,
PHANDLE hWritePipe,
LPSECURITY_ATTRIBUTES lpPipeAttributes,
DWORD nSize
);
CreatePipe函数将创建一个匿名管道,返回该匿名管道的读写句柄.其中hReadPipe&hWritePipe都为out类型,作为返回值来使用.lpPipeAttributes是一个指向SECURITY_ATTRIBUTES结构体的指针,其成员说明如下:PHANDLE hReadPipe,
PHANDLE hWritePipe,
LPSECURITY_ATTRIBUTES lpPipeAttributes,
DWORD nSize
);
typedef struct _SECURITY_ATTRIBUTES{
DWORD nLength,
LPVOID lpSecurityDescriptor,
BOOL bInheritHandle
}SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES;
其中,nLength为该结构体的大小,第二个成员为指向安全描述符的指针,一般设为NULL,采用默认值.第三个成员是关键,它指定所返回的句柄能否被一个新的进程所继承,如能能被继承则设为TRUE.DWORD nLength,
LPVOID lpSecurityDescriptor,
BOOL bInheritHandle
}SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES;
二,进程的创建.
为了创建一个进程,可以调用CreateProcess函数,其声明如下:
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
其中,__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
lpApplicationName指定应用程序名称.可以为相对路径也可以为绝对路径,但是如果为相对路径,CreateProcess函数仅会在当前路径下进程搜索,而且,该参数必须加上扩展名,系统不会自动假设文件名有一个".exe"后缀.
lpCommandLine,用来指定传递给新进程的命令行字符串.可以在lpApplicationName中传递可执行文件的名称,在lpCommandLine中指定命令行的参数.如果lpApplication为NULL,lpCommandLine以空格分隔的第一个标记将作为可执行文件路径.与lpApplicationName不同的是,如果在lpCommandLine中指定可执行文件的路径,系统会按一定的路径搜索相对路径指定的文件,且自动假设文件名带有一个".exe"后缀.
lpProcessAttributes&lpThreadAttributes都是指向SECURITY_ATTRIBUTES结构体的指针,用来设置新进程对象和新线程对象的安全性.如果指定为NULL,则采用系统默认的安全描述符.
bInheritHandle用来指定随后创建的子进程能否继承父进程的对象句柄.如果为TRUE,则父进程的每个继承的打开句柄都能被子进程继承.继承的句柄与原始句柄拥有同样的值和访问特权.
dwCreationFlags用来指定控件优先级和进程创建的附加标记.具体取值可以参考MSDN.如果只是为了启动子进程,并不需要设置它创建的标记,则将其设为0.
lpEnviroment是一个指向环境块的指针,如果为NULL,则使用调用进程的环境.
lpCurrentDirectory指定子进程的当前路径.
lpStartInfo指向一个STARTUPINFO结构.STARTUPINFO结构的定义如下:
Code
本例中将使用到的几个成员为:cb,即为该结构体的大小.dwFlags设置结构体中哪些成员有效,本例中设为STARTF_USESTDHANDLES,表示hStdInput,hStdOutput,hStdError三个成员有效.本例中将它们分别重定向到管道读写句柄.
基本知识讲完了,现在来看相关实现.
posted on 2009-09-23 09:49 Joshua Leung 阅读(475) 评论(0) 编辑 收藏 举报