最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包中的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。...此处要注意的就是将SECURITY_ATTRIBUTES对象的bInheritHandle设置为TRUE,这样我们获取的两个操作管道的句柄就有可继承属性。...| STARTF_USESTDHANDLES; 这两个有效属性要设置。...我们使用STARTF_USESTDHANDLES的原因是:我们使用了标准输出和标准错误输出句柄。...也就是说,我们设置的这些句柄要有可继承性。这就解释了我们之前为什么在创建管道时要将句柄可继承性设置为TRUE的原因。 一般来说,我们要代理的程序已经输入好信息了。
匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。...要从管道读取,一个进程在调用ReadFile函数时使用读取句柄。当以下任一条件为真时,ReadFile返回:写操作在管道的写入端完成,请求的字节数已被读取或发生错误。...因此,您经常可以将匿名管道的句柄传递给需要命名管道句柄的函数。 如果CreatePipe失败,输出参数的内容是不确定的。在这个事件中,不应该假设他们的内容。...要释放管道使用的资源,应用程序应该不再需要关闭句柄,这可以通过调用CloseHandle函数或与实例句柄关联的进程结束。请注意,管道的一个实例可能有多个与之关联的句柄。...当命名管道的实例的最后一个句柄关闭时,管道的实例总是被删除。 0x02、CreateProcess 创建一个新进程及其主要线程。新进程在调用进程的安全上下文中运行。
CreatePipe(&hRead,&hWrite,&sa,0)) { MessageBox(_T("Error On CreatePipe()")); return; } STARTUPINFO...TSecurityAttributes; inS: THandleStream; sRet: TStrings; begin Result := ''; FillChar(sa, sizeof(sa), 0); //设置允许继承...StartInfo, SizeOf(StartInfo), 0); StartInfo.cb := SizeOf(StartInfo); StartInfo.wShowWindow := SW_HIDE; //使用指定的句柄作为标准输入输出的文件句柄...,使用指定的显示方式 StartInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; StartInfo.hStdError :...请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。
创建管道 sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; //使用系统默认的安全描述符...sa.bInheritHandle = TRUE; //一定要为TRUE,不然句柄不能被继承。...STARTUPINFO si; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si);...创建管道 sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; //使用系统默认的安全描述符...STARTUPINFO si; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si);
GetLastError = " << GetLastError() << endl; getchar(); return 0; } ShellExecute ShellExecute 在不使用管理员权限运行...int main() { /* ShellExecute 不需要使用管理员权限打开 VS2019 也可以打开 WinExec 不能打开的程序 */ ShellExecute( NULL,...、注册表路径 HKEY hkeyClass; // 当 fMask = SEE_MASK_CLASSNAME 时使用 DWORD dwHotKey; // 与应用程序关联的键盘快捷键...union { HANDLE hIcon; // 目标文件图标句柄,fMask = SEE_MASK_ICON 时使用 HANDLE hMonitor; // 文档监视器句柄...,fMask = SEE_MASK_HMONITOR 时使用 } DUMMYUNIONNAME; HANDLE hProcess; // 新启动的应用程序的句柄 } SHELLEXECUTEINFOA
比如一个控制台程序打印一行文字: 图片 会在windows弹出的对话框中输出: 图片 为什么会输出到这里而不是别的地方呢?因为这里就是所说的StdOut(标准输出)的地方。...,那么还必须在父进程中创建一个子进程,同时,这个子进程必须能够继承和使用父进程的一些公开的句柄,因为在子进程中必须要使用父进程创建的匿名管道的读写句柄,通过这个匿名管道才能实现父子进程的通信,所以必须继承父进程的公开句柄...同时在创建子进程的时候,必须将子进程的标准输入句柄设置为父进程中创建匿名管道时得到的读管道句柄,将子进程的标准输出句柄设置为父进程中创建匿名管道时得到的写管道句柄。然后在子进程就可以读写匿名管道了。...根据上边API的原型,通过hReadPipe和hWritePipe所指向的句柄可分别以只读、只写的方式去访问管道。在使用匿名管道通信时,服务器进程(父进程)必须将其中的一个句柄传送给客户机进程。...在调用CreatePipe()函数时,如果管道服务器将lpPipeAttributes 指向的SECURITY_ATTRIBUTES数据结构的数据成员bInheritHandle设置为TRUE,那么CreatePipe
参数nSize是一个DWORD类型的值,用于指定管道的缓冲区大小,通常可以设置为0表示使用系统默认值。...创建匿名管道后,可以使用ReadFile函数从管道的读端读取数据,使用WriteFile函数将数据写入管道的写端。在使用完管道后,应使用CloseHandle函数关闭管道的句柄,以释放资源。...在创建进程时,可以通过STARTUPINFO结构体设置进程的一些属性,例如标准输入、标准输出和标准错误输出的重定向,启动窗口的显示方式等。...如下RunCommand函数所示,该函数传入一个字符串类型的命令参数,并返回一个字符串执行结果,在函数内部,使用 CreatePipe() 函数创建了一个匿名管道,并使用 CreateProcess()...接着使用 ReadFile() 函数从管道的读取端读取输出数据,并将读取到的数据存储到一个缓冲区中。最后,它将缓冲区的内容拼接成一个完整的输出结果返回给调用者。
思路 在C语言中执行DOS命令的方法很多,如:ShellExecute, WinExec, CreateProcess等,但是这些接口都是只能一次执行一条命令,在我的启动脚本里有很多命令,有一些是设置环境变量的...,这样就没法在代码中一条条执行脚本中的命令,必须要找到一个办法可以一次性执行多条命令。...// 这个结构为很多函数创建对象时提供安全性设置 SECURITY_ATTRIBUTES saAttr; BOOL fSuccess; // Set the bInheritHandle flag...so pipe handles are inherited. // 设置句柄为可继承的,使得子线程可以使用父线程 saAttr.nLength = sizeof(SECURITY_ATTRIBUTES.... // 设定DOS进程的标准输入、输出和错误信息的管道 // 使用前面创建的值,DOS窗口的输入输出都会被定向到本应用中 ZeroMemory( &siStartInfo, sizeof(STARTUPINFO
一丶匿名管道 1.1何为匿名管道 匿名管道是用来父进程跟子进程通信的.还有一种是命名管道.不需要父子进程就可以进行通信的.今天先说匿名管道的....分别是父进程读取的管道.以及 子进程读取的管道.相应的.子进程也可以对父进程读取的管道进行传输数据.父进程就可以读取了. 这段话可能难以理解.你可以这样想. 我父进程读取子进程使用第一个管道....(我猜的); 这个API很简单.就是创建管道. 两个句柄.读取句柄跟写入句柄. 我们需要创建两个管道....还需要注意的是,父进程创建子进程,必须让父进程句柄可继承.这个就是第三个属性.安全属性描述符中给即可. 那么说一下创建步骤吧. 1.创建一个安全属性描述符,设置句柄可继承 2.创建两个管道....= STARTF_USESTDHANDLES; //设置窗口隐藏启动 bRet = CreateProcess(NULL, "cmd.exe",
WSASocket无管道反向CMD,与无管道正向CMD相反,这种方式是在远程主机上创建一个TCP套接字,并绑定到一个本地地址和端口上。...然后在本地主机上,使用WSASocket函数连接到远程主机的套接字,并将标准输入、输出和错误输出重定向到套接字的句柄上。...这样,本地主机就可以通过网络连接到远程主机的套接字,发送CMD命令并获取命令输出结果。这种方式称为无管道反向CMD,因为CMD进程的输入输出是通过套接字而非管道进行的。...si.hStdInput = si.hStdOutput = si.hStdError = (HANDLE)sSock; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES...WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0)) == INVALID_SOCKET) { return 0; } // 设置端口信息等
WSASocket无管道反向CMD,与无管道正向CMD相反,这种方式是在远程主机上创建一个TCP套接字,并绑定到一个本地地址和端口上。...然后在本地主机上,使用WSASocket函数连接到远程主机的套接字,并将标准输入、输出和错误输出重定向到套接字的句柄上。...这样,本地主机就可以通过网络连接到远程主机的套接字,发送CMD命令并获取命令输出结果。这种方式称为无管道反向CMD,因为CMD进程的输入输出是通过套接字而非管道进行的。...si.hStdInput = si.hStdOutput = si.hStdError = (HANDLE)sSock; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES...AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0)) == INVALID_SOCKET) { return 0; } // 设置端口信息等
木马会想尽一切办法隐藏自己,主要途径有:在任务栏中隐藏自己,这是最基本的办法。...1.3、一般木马种类 密码发送型木马 密码发送型木马可以在受害者不知道的情况下把找到的所有隐藏密码发送到指定的信箱,从而达到获取密码的目的,这类木马大多使用25端口发送E-mail。...通过这类木马,攻击者可以在匿名情况下使用Tenlet、ICO、IRC等程序,从而在入侵的同时隐蔽自己的足迹,谨防别人发现及自己的身份。...反弹端口型木马 反弹端口型木马的服务端(被控制端)使用主动端口,客户端(控制端)使用被动端口,正好与一般木马相反,木马定时检测控制端的存在,发现控制端上线立刻弹出主动连接领控制端打开的端口。...= sizeof(STARTUPINFO); StartupInfo.wShowWindow = SW_HIDE; StartupInfo.dwFlags = STARTF_USESTDHANDLES
另外在打开目录文件夹时,ShellExecute命令非常有用。 ⑷ 程序示例 下面通过一个例子来说名WinExec和ShellExecute的使用。...在上述参数中,参数lpStartupInfo是STARTUPINFO结构。可以用来设置控台的标题,新窗口的的初始大小和位置,及重定向标准输入和输出。...可以规定该结构体中的标志,已表明要设置的数据段。有时,不想设置任何信息,也必须传递一个有效的指针给空结构(确定设置大小到cb,及设置dwFlags成员为0)。...这些句柄拥有在参数lpProcessAttributes和lpThreadAttributes中规定的访问。 ...其返回值是布尔型的,而真正感兴趣的返回值发生于作为参数传送的结构中(PROCESS_INFORMATION)。CreateProcess返回该结构中的进程ID及其句柄,以及初始线程ID及其句柄。
说明: CreateProcess创建进程执行不支持简单的 > 符号重定向,system之类的函数执行外部进程可以使用 > 符号直接重定向到文件,但是system这类函数执行命令时,都会弹出控制台窗口...,而CreateProcess创建执行进程可以设置属性隐藏这个控制台窗口,后台执行。...&sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); PROCESS_INFORMATION pi; STARTUPINFO...flags = CREATE_NO_WINDOW; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); ZeroMemory(&si, sizeof(STARTUPINFO...)); si.cb = sizeof(STARTUPINFO); si.dwFlags |= STARTF_USESTDHANDLES; si.hStdInput = NULL;
这是整个远控中比较简单的部分,我们从被控端开始看起:(源码在附件中可以下载) ---- 在MainDll工程中,打开类视图,找到CShellManager这个类,这就是我们“终端管理”功能用到的类...我们在gh0st进程中,开启一个cmd进程,并使用管道,向cmd.exe传送信息,而cmd.exe也利用管道将信息发送给gh0st的进程。管道通信又分三种,双管道、单管道与无管道。...//将进程属性设置为隐藏,否则cmd一打开管理员就看到了 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.hStdInput...创建cmd进程,使用的函数是CreateProccess,在创建进程之前,首先要设置一下该进程的属性(使用到STARTUPINFO结构,)。GetStartupInfo(&si)就是获取本进程的属性。...注释写的很详细,其实就是,当用户按下回车时,将编辑框中所有文本都保存在字符串中,并减去上一次的长度,得到用户新输入的长内容,作为命令,发送出去。
前言 在windows下一般会使用系统的cmd命令或者其他现成的一些命令行可执行程序来完成一些操作,比如:调用ping命令来测试网络是否畅通、调用ffmpeg命令进行视频转码等等。...为了能在软件界面上有更好的交互输出,都需要将命令执行的过程拿到,进行处理,然后在界面上进行显示,让用户知道程序正在正常运行,下面就介绍几种输出的获取方式。...使用_popen执行进程 通过_popen打开进程进行执行,通过fgets获取进程的输出。...CreateProcess重定向输出到文件 下面使用CreateProcess调用子进程运行,将输出保存在文件中,阻塞等待进程执行完毕。...,在父进程里再从管道的读端就能实时读取数据。
然后使用CreateProcess函数创建一个新的CMD进程,并将标准输入、输出和错误输出重定向到套接字的句柄上。这样,客户端可以通过网络连接到这个套接字,发送CMD命令并获取命令输出结果。...在传统的同步 I/O 操作中,当一个线程请求进行 I/O 操作时,必须等待操作完成后才能进行其他任务的处理。...与之相反,重叠 I/O 操作则不需要等待I/O 操作的完成,线程可以在 I/O 操作进行的同时执行其他任务,当 I/O 操作完成后,系统会通过事件通知机制通知线程进行相应的处理。...WSASocket() 函数创建 socket 套接字时,可以通过设置 dwFlags 参数的 WSA_FLAG_OVERLAPPED 标记来启用重叠 I/O 操作模式。...要使用重叠 I/O 操作机制,应用程序需要更改套接字的 I/O 模式。在传统的 I/O 操作模式中,应用程序通过同步的方式向套接字发送或接收数据,然后等待操作完成。
dwProcessAffinityMask ); 第一个参数是设置的进程的句柄,第二个参数是DWORD类型的指针,是一个32位的整数,每一位代表一个处理器的编号,当希望设置进程中的线程在此处理器上运行的话...在VS编译器上可以通过设置将Win32 控制台程序的主函数指定为WinMain,或者将窗口程序的主函数指定为main,设置方法:属性–>连接器–>系统–>子系统,将这项设置为/SUBSYSTEM:CONSOLE...hStdError中指定,但是需要注意的是,在父进程中如果采用了Create之类的函数创建了输入输出对象的句柄时一定要指定他们可以被子进程所继承。...,以便子进程可以使用这个内核对象句柄 sa.bInheritHandle = TRUE; ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory...关闭进程打开的对象句柄,但是对象本身不一定会关闭,这是因为每个对象都有一个计数器,每当有一个线程在使用这个对象时计数器会加1,而释放它的句柄时会减一,只有当计数器为0时才会销毁这个对象。
地址空间 它包含所有可执行模块或 DLL 模块的代码和数据.另外,它也包含动态 内存分配的空间,例如线程的栈和堆分配空间 进程从来不执行任何东西,它只是纯种的容器,若要使进行完成某项操作,它必 须拥有一个在它的环境中运行的纯种...如果//lpThreadAttributes为NULL,则不能继承该句柄 _In_ BOOL bInheritHandles, //如果此参数为TRUE,则新进程将继承调用进程中的每个可继承句柄。...邮槽由服务端创建, 在创建时需要指定邮 槽名, 创建后服务端得到邮槽的句柄。 在邮槽创建后, 客户端可以通过邮槽名打开邮槽, 在获得句柄后可以向邮槽写入消息。...邮槽通信是单向的, 只有服务端才能从邮槽中读取消息, 客户端只能写入消息。 消息 是先入先出的。 客户端先写入的消息在服务端先被读取。...但是在主机间进行邮槽通 信, 数据通过网络传播时使用的是数据报协议(UDP), 所以是一种不可靠的通信。 通过网 络进行邮槽通信时, 客户端必须知道服务端的主机名或域名。
在Windows编程中,并非每一个应用程序都需要一个图形用户界面(GUI),很多情况下,我们可以编写一个控制台应用程序,这样程序更小,加载更快,传输时间也短,同时也丝毫不牺牲程序应有的功能。...如果我们的确需要在GUI执行这些程序,以完成某些比如类似于磁盘格式化的功能,我们可以在GUI程序中创建一个新的进程,调用这些已有的控制台应用程序,帮助完成这些功能。...然而令人失望的是,我们每次加载这些控制台应用程序时,图形程序总会在加载的过程中产生一个不受欢迎的控制台窗口,从而使我们图形用户界面显得不伦不类,当用户看到这个界面时,尤其看到我们加载的是别人编写的或者是操作系统提供的控制台应用程序...=INVALID_HANDLE_VALUE ); STARTUPINFO s={sizeof ( s ) }; s.dwFlags =STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES...; //使用标准柄和显示窗口 s.hStdOutput =hConsoleRedirect;//将文件作为标准输出句柄 s.wShowWindow =SW_HIDE;
领取专属 10元无门槛券
手把手带您无忧上云