获取Windows Shell的简单示例程序(一)

      昨天看了黑防2009年VC专辑上RITATV的一篇文章<编程实现远程shell的获取>,对Windows shell的获取总算是有了一个概念.在此作下整理,希望能给像我一样的菜鸟们提供一些参考.
      知识点:
      一,匿名管道.
      匿名管道是一个未命名的单向管道,通常在一个父进程和一个子进程之间传输数据.匿名管道只能实现本机上的两个进程之间的通信,而不能实现跨网络的通信.为了创建匿名管道,需要调用CreatePipe函数,其声明如下:
BOOL CreatePipe(
   PHANDLE hReadPipe,
   PHANDLE hWritePipe,
   LPSECURITY_ATTRIBUTES lpPipeAttributes,
   DWORD nSize
);
      CreatePipe函数将创建一个匿名管道,返回该匿名管道的读写句柄.其中hReadPipe&hWritePipe都为out类型,作为返回值来使用.lpPipeAttributes是一个指向SECURITY_ATTRIBUTES结构体的指针,其成员说明如下:
typedef struct _SECURITY_ATTRIBUTES{
    DWORD nLength,
    LPVOID lpSecurityDescriptor,
    BOOL bInheritHandle
}SECURITY_ATTRIBUTES,
*PSECURITY_ATTRIBUTES;
      其中,nLength为该结构体的大小,第二个成员为指向安全描述符的指针,一般设为NULL,采用默认值.第三个成员是关键,它指定所返回的句柄能否被一个新的进程所继承,如能能被继承则设为TRUE.
      二,进程的创建.
      为了创建一个进程,可以调用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
);
      其中,
      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编辑  收藏  举报

导航