可能的一个原因:命令行参数使用了常量。 例如: CreateProcess(NULL, "notepad",NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi); 解释: pszApplicationName和pszCommandLine分别表示进程使用的可执行文件名和向其传递的命令行字符串,注意pszCommandLine是PTSTR,这意味着你必须为其传递指向非常量字符串的地址。CreateProcess内部会更改向其传递的命令行字符串,但在Creat
【方法一:】 将 CreateProcess()的参数dwCreationFlags指定为CREATE_NO_WINDOW,即以不创建窗口方式创建DOS进程。 【参考代码:】 if (!CreateProcess(NULL, szCommand, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) 【方法二:】 指定STARTUPINFO结构中WORD wShowWindow为SW_HIDE(但是一定要有这一句: si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESHOWWINDOW; ),即以不显示窗口方式创建DOS进程。 【参考代码:】 STARTUPINFO si; PROCESS_INFORMATION pi; ::ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; ::ZeroMemory(&pi, sizeof(pi)); if (!CreateProcess(NULL, szCommand, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 【方法三:】 将这个DOS窗口放到另外一个桌面上,实现隐藏。 【参考代码:】 si.lpDesktop="NewDesktop"; if (!CreateProcess(NULL, szCommand, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) 方法三的详细原理: 参考http://blog.163.com/madengyao_super/blog/static/2859822020093249493150/ 。 =============================================================================== 【用虚拟桌面实现后台调用外部程序】 最近需要实现一个无线通信的功能,X他XX的,该死的硬件厂商竟然不提供接口函数,只提供一个EXE可执行文件-_-! 这样就需要我在程序里调用他的这个EXE可执行文件。 调用EXE文件,可以用WINEXEC()、SHELLEXECUTE()和CreateProcess()等函数来实现,我这里就用CreateProcess()来调用。 但是一个软件,两个EXE文件,这叫什么??实在没办法,我想在打开的时候不让用户看到这个执行文件:首先调用FINDWINDOW来查找窗口的句柄,之后再用SendMessage()来隐藏窗口,但是还是会有一瞬主窗口被显示出来的,或许你会说我BT吧,但是我实在是不忍心看到…… 那么怎么解决这个问题呢,首先我当然在CreateProcess()上面寻找方法,可惜,它只有一个参数可以设置窗口的默认显示方式,但是一旦这个窗口自己重设了显示方式,它就没有任何作用了。 继续查找文档,这时我看到CreateProcess()的一个参数TStartupInfo中有 lpDesktop这么一个属性,按照MSDN的说法,如果该指针为NULL,那么新建的Process将在当前Desktop上启动,而如果对其赋了一个Desktop的名称后,Process将在指定的Desktop上启动,恩,看来不错,就从它入手了; 首先,建立一个虚拟的Desktop。 const DesktopName: PChar = 'NewDesktop'; FDesktop:= CreateDesktop(DesktopName, nil, nil, 0, GENERIC_ALL, nil); 然后,在CreateProcess的时候,指定程序在我新生成的Desktop上运行: var SI: TStartupInfo; begin FillChar(SI, SizeOf(SI), 0); SI.cb:= SizeOf(SI); SI.lpDesktop:= DesktopName; SI.wShowWindow:= SW_HIDE; SI.dwFlags:= STARTF_USESHOWWINDOW; SI.hStdError:= 0; SI.hStdInput:= 0; SI.hStdOutput:= 0; if not CreateProcess(PChar('……'), nil, nil, nil, True, CREATE_NEW_C
在windows下一般会使用系统的cmd命令或者其他现成的一些命令行可执行程序来完成一些操作,比如:调用ping命令来测试网络是否畅通、调用ffmpeg命令进行视频转码等等。为了能在软件界面上有更好的交互输出,都需要将命令执行的过程拿到,进行处理,然后在界面上进行显示,让用户知道程序正在正常运行,下面就介绍几种输出的获取方式。
本文转载自WinExec, ShellExecute,CreateProcess 区别 其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
三个SDK函数: WinExec, ShellExecute,CreateProcess
本文记录一个 Win32 的有趣行为,调用 CreateProcess 方法传入特别的参数,可以让任务管理器里的命令行不显示应用文件路径
在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess()
在vc++ 程序中运行另一个程序的方法有三个: WinExec(),ShellExcute()和CreateProcess() 三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。 WinExec 两个参数,前一个指定路径,后一个指定显示方式。 ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直
说明: CreateProcess创建进程执行不支持简单的 > 符号重定向,system之类的函数执行外部进程可以使用 > 符号直接重定向到文件,但是system这类函数执行命令时,都会弹出控制台窗口,而CreateProcess创建执行进程可以设置属性隐藏这个控制台窗口,后台执行。
学习WindowsAPI. 之前.我们必须理解什么是进程. 在windows环境下.进程就是一个运行起来的exe程序
ShellExecute(hwnd,op,file,params,dir,bShow) - hwnd:父窗口的句柄,若没有则为0 - op:要进行的操作,为open,print or 空 - file:要运行的程序或脚本 - params: 要向程序传递的参数,如果打开的是文件则为空 - dir:程序初始化的目录 - bShow:是否显示窗口
本章内容涉及使用Socket API和CMD命令行工具实现本地CMD命令执行、无管道正向CMD和无管道反向CMD三种功能。执行本地CMD实现使用CreateProcess函数创建一个新的CMD进程,并将标准输入、输出和错误输出重定向到当前进程的标准输入、输出和错误输出。无管道正向CMD和无管道反向CMD使用WSASocket函数创建TCP套接字,并将CMD进程的标准输入、输出和错误输出重定向到套接字的句柄上,通过网络连接实现远程命令执行功能。
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为使用复杂,比较少用。
本文由Tide安全团队成员“爱上卿Ooo”首发于FreeBuf TideSec专栏:
此篇已收录至《你必须知道的.Net》读书笔记目录贴,点击访问该目录可以获取更多内容。
最近给公司的一个系统写了个启动的脚本,但是领导说批处理这样的脚本太low了,要使用EXE来启动,未来还要使用加密工具对EXE进行加密。
一个需求,需要实现拷贝一个本地文件到共享文件夹的功能,思路是先开启网络共享文件夹的访问,然后执行拷贝命令;
其中,当使用 CreateProcess 创建进程时,创建标志为 CREATE_SUSPENDED,则表示新进程的主线程被创建为挂起状态,直到使用 ResumeThread 函数恢复主线程,进程才会继续运行。
ShellExecute ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。
在 main 函数中,首先创建了三个进程,并将它们加入就绪队列。然后进行了三次进程调度,每次调度会从就绪队列中取出一个进程来执行,模拟进程的运行,然后根据剩余时间片和实际情况将进程放回就绪队列或者移到结束队列。 整体上,这段代码演示了一个简单的进程调度模拟过程,利用了就绪队列和结束队列来管理进程,以及时间片轮转调度的基本思想。
最近在研究oj系统,查过网上的解决方案,大致分为两种: 一种是基于Java虚拟机的解决方案,让编译好的程序运行在java虚拟机里面,通过对虚拟机的限制保障时空有效性和系统安全性; 第二种是基于linux系统的方案,通过内置的系统函数设置程序可用资源以及通过限制用户运行此程序以保障系统安全性. 实际情况是希望在windows下实现oj系统,而且对jvm无爱,遂研究下通过windows的一些内核机制实现此目的. 根据上面的第二种解决方案后查阅MSDN及相关资料后得知windows下没有设置程序可用资源的函数,
pcb->state = READY;这行代码的作用是设置PCB的状态为就绪(READY)状态。
配置 ANDROID_SWT 的环境变量,swt.jar 在 %ANDROID_HOME%\tools\lib\x86_64 里面(ANDROID_HOME:C:\Users\yinzh\AppData\Local\Android\Sdk)
工作中,QA同学在测试我们程序的时候,发现在XP下,我们的A进程无法启动我们的B进程。而在Win7 64bit系统下功能正常。RD同学调试后,发现我们A进程中使用ShellExcute去启动了B进程(转载请指明出于breaksoftware的csdn博客)
创建新的进程是Windows程序开发的重要部分,它可以用于实现许多功能,例如进程间通信、并行处理等。其中,常用的三种创建进程的方式分别是WinExec()、ShellExecute()和CreateProcessA(),这三种创建进程的方式各有特点。如果需要创建简单进程或从其他程序启动新进程,可以使用WinExec()或ShellExecute()函数。如果需要对新进程进行更精细的配置,例如控制进程参数、指定安全级别、传递特定的命令和参数等,可以使用CreateProcessA()函数。
WinExec是一个WIN32 API,它的第一个参数必须包含一个可执行文件名,
管 道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另 一进程就可以从管道的另一端将其读取出来。匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。
* 网站名称:obaby@mars * 网址:https://h4ck.org.cn/ * 本文标题: 《C/C++/Delphi 调用命令并且显示执行结果》 * 本文链接:https://h4ck.org.cn/2011/11/cdelphi-execute-cmd-commands-and-get-result/ * 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。
返回值 =-1:出现错误 =0:调用成功但是没有出现子进程 >0:成功退出的子进程的id
ShellExecute ShellExecute 在不使用管理员权限运行 VS2019 的情况下仍然可以正常打开任何程序,不报 740 错误。
病毒木马植入模块成功植入用户计算机之后,便会启动攻击模块来对用户计算机数据实施窃取和回传等操作。通常植入和攻击是分开在不同模块之中的,这里的模块指的是DLL、exe或其他加密的PE文件等。只有当前植入模块成功执行后,方可继续执行攻击模块,同时会删除植入模块的数据和文件。模块化开发的好处不单单是便于开发管理,同时也可以减小因某一模块的失败而导致整个程序暴露的可能性。
引入背景:假如我们每天有10000个订单生成,需要同步到仓储系统中去,以前做法是开启一个crontab去跑这些任务,但是发现总有感觉同步效率低,间隔时间都是分钟级别的。 解决方案测试:我们将同步订单的任务表添加一个hash作为key,作为分发条件,因为mysql中select如果做mod函数是用不到索引的,所以我们自己做随机hash,但是务必不需要范围太大,以免服务器资源不够,方法是根据hashkey投放到不同的进程中进行同步,测试代码如下
要求做一个图形界面的应用程序,输入命令行的命令,在后台调用CMD程序执行该命令但不显示DOS命令行窗口,而且能实时显示运行的结果。哪位知道怎么处理?谢啦
动态内存补丁可以理解为在程序运行时动态地修改程序的内存,在某些时候某些应用程序会带壳运行,而此类程序的机器码只有在内存中被展开时才可以被修改,而想要修改此类应用程序动态补丁将是一个不错的选择,动态补丁的原理是通过CreateProcess函数传递CREATE_SUSPENDED将程序运行起来并暂停,此时程序会在内存中被解码,当程序被解码后我们则可以通过内存读写实现对特定区域的动态补丁。
A pipe is a section of shared memory that processes use for communication. The process that creates a pipe is the pipe server. A process that connects to a pipe is a pipe client. One process writes information to the pipe, then the other process reads the information from the pipe. This overview describes how to create, manage, and use pipes.
在Windows编程中,并非每一个应用程序都需要一个图形用户界面(GUI),很多情况下,我们可以编写一个控制台应用程序,这样程序更小,加载更快,传输时间也短,同时也丝毫不牺牲程序应有的功能。这种程序特别适合那些在后台运行的程序,比如压缩、杀毒、上传下载等等。如果我们的确需要在GUI执行这些程序,以完成某些比如类似于磁盘格式化的功能,我们可以在GUI程序中创建一个新的进程,调用这些已有的控制台应用程序,帮助完成这些功能。然而令人失望的是,我们每次加载这些控制台应用程序时,图形程序总会在加载的过程中产生一个不受欢迎的控制台窗口,从而使我们图形用户界面显得不伦不类,当用户看到这个界面时,尤其看到我们加载的是别人编写的或者是操作系统提供的控制台应用程序,就会对我们产品的可信度表示怀疑,甚至大打折扣。因此我们必须竭力屏蔽这个窗口不让它显示出来,同时我们还需要把程序运行的结果定向到一个文本文件中,控制台程序的输入部分工作可以由交给GUI来完成。就像Visual C++编译一个程序一样,由MsDev.exe(GUI程序)负责加载编译器cl.exe(控制台程序)进行后台编译,然后把编译的结果定向到一个文件,并把编译结果输出到前台图形界面的一个窗口中,而用户在编译的过程中根本不会察觉这个过程,C++为应用程序加载提供了多个函数,比如 _spawnlp、ShellExecute、system、_exec等函数,这些函数除了system之外,都无法实现控制台程序的输出定向,而 system函数的缺点是会导致一个控制台窗口出现,如果计算机配置是一个全屏命令提示行模式,它就会把你的GUI程序直接切换到全屏控制台窗口,显然这是一个很不体面的解决方案。
A handle to the process with memory that is being read. The handle must have PROCESS_VM_READ access to the process.
通过常用的api来创建进程是常规启动进程的方式,最常用的几个api有WinExec、ShellExecute、CreateProcess,我们一个一个来看一下
一、方式1: system #include <stdlib.h> system("ping 127.0.0.1"); 阻塞等待程序执行完再退出. 二、方式2: WinExec #include<windows.h> #include<shellapi.h> #include<stdio.h> #include<string.h> WinExec("ping 127.0.0.1", SW_SHOWNOACTIVATE); 调用完立即返回。 三、方式3: CreateProcess #include<
CreateProcess在3环最终会调用ntdll!NtCreateUserProcess通过syscall进入0环,我们可以通过调用NtCreateUserProcess来规避AV/EDR对CreateProcess的监控
本文是我搜集整理的DLL注入方法,有一些自己实现了,在文末的链接里有源码,其余没有实现的也有git链接或别的源码链接。
使用QProcess运行进程时,为了方便使用运行程序,直接使用程序名字运行。但是这时候需要设置环境变量。可是使用 setProcessEnvironment怎么设置也不能设置成功。运行QProcess却是一直返回'文件找不到'的现象。下面让我们来窥探究竟吧。 不能正确使用环境变量的代码 QProcess* myProcess = new QProcess(this); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); en
文章看点:本文是看雪论坛中的一个系列文章,从用户层到内核层分析了windows的CreateProcess函数执行的详细流程。
最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包中的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。今天花点时间,将该方法整理成文。(转载请指明出于breaksoftware的csdn博客)
上面主进程读取的字节数如下:共,2834行,与理想的166帧166行相差甚远,每帧560*320*3=537600也和下面的不一样。
最近有个案例觉得挺有意思,可以分享一下。我们知道Windows里启动一个进程可以使用createprocess函数(https://docs.microsoft.com/en-us/previous-versions/aa908775(v=msdn.10)),大体上的使用可以看空白写的
本章笔者将通过Windows平台下自带的调试API接口实现对特定进程的动态转存功能,首先简单介绍一下关于调试事件的相关信息,调试事件的建立需要依赖于DEBUG_EVENT这个特有的数据结构,该结构用于向调试器报告调试事件。当一个程序发生异常事件或者被调试器附加时,就会产生对应的DEBUG_EVENT调试事件,通常DEBUG_EVENT包含了多种调试类型,包括异常事件、进程创建事件、线程创建事件、进程退出事件和线程退出事件等等,我们只需要动态捕捉这些调试事件并作相应的处理即可实现更多有用的功能。
领取专属 10元无门槛券
手把手带您无忧上云