首页
学习
活动
专区
圈层
工具
发布

CreateProcess 创建带命令行参数的进程时,报错或者提示内存位置无效的可能的一个原因

和pszCommandLine分别表示进程使用的可执行文件名和向其传递的命令行字符串,注意pszCommandLine是PTSTR,这意味着你必须为其传递指向非常量字符串的地址。...这一点是非常重要的,因为如果你向CreateProcess传递的命令行字符串位于进程的只读存储区,就会发生Access Violation错误。...微软在其C++编译器选项中提供了/GF开关,/GF打开时,程序中所有用到的常量字符串将只维护单一副本,且位于只读存储部分。在调用 CreateProcess时,开发人员应该打开/GF开关并使用缓冲区。...另外,假如你使用常量ANSI字符串作为 CreateProcess参数,并不会发生Access Violation错误,我们在前面的章节已经提到过,许多WinAPI函数的ANSI版本会将ANSI参数转换为...将这些垃圾数据传递给CreateProcess可能导致无法预料的结果,为了让CreateProcess正常工作,你必须将STARTUPINFO(EX)中没有用到的域清0。

2.7K50

windows 多任务与进程

例如某个CPU有8个处理器,可以通过进程的亲缘性设置让该进程的线程只在某两个处理器上运行,这样就不会像之前那样在8个CPU中的任意几个上运行。...我们知道在C/C++语言中main程序是从main函数开始的,但是这个函数只是语法上的开始,并不是真正意义上的入口,在VC++中,系统会首先调用mainCRTStartup,在这个函数中调用main或者...如果需要自定义自己的入口,那么这些环境将得不到初始化,也就意味着我们不能使用C/C++库函数。...进程创建 在windows下进程创建采用API函数CreateProcess,该函数的原型如下: BOOL CreateProcess( LPCWSTR pszImageName, LPCWSTR...进程输入输出重定向 输入输出重定向的实现可以通过函数CreateProcess在参数psiStartInfo中的HANDLE hStdInput; HANDLE hStdOutput; HANDLE

1.3K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    1.12 进程注入ShellCode套接字

    4.使用 OpenProcess 函数打开指定 PID 的进程,并分别使用 VirtualAllocEx 函数在该进程中分配内存空间,分别保存注入代码和 Param 结构体的数据。...5.使用 WriteProcessMemory 函数将注入代码和 Param 结构体的数据写入到指定进程中的内存空间中。...并实现一种可被连接的正向ShellShell,在此案例中读者需要理解一种绑定技术,在默认情况下,Windows系统中的每一个进程都存在标准输入、输出和错误流的匿名管道,而cmd.exe进程同样存在这三种管道...当有连接请求时,使用 CreateProcess 函数创建一个进程,并将标准输入、输出和错误重定向到网络套接字,实现远程 Shell。...通过 OpenProcess 函数打开目标进程,使用 VirtualAllocEx 函数在目标进程中分配内存,并使用 WriteProcessMemory 函数将代码和参数复制到目标进程的内存中。

    33840

    CreatePipe、CreateProcess函数

    一个进程在向管道写入数据后,另 一进程就可以从管道的另一端将其读取出来。...匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。...要从管道读取,一个进程在调用ReadFile函数时使用读取句柄。当以下任一条件为真时,ReadFile返回:写操作在管道的写入端完成,请求的字节数已被读取或发生错误。...如果在写入所有字节之前管道缓冲区已满,则WriteFile不会返回,直到另一个进程或线程使用ReadFile来创建更多的缓冲区空间。 使用具有唯一名称的命名管道实现匿名管道。...当命名管道的实例的最后一个句柄关闭时,管道的实例总是被删除。 0x02、CreateProcess 创建一个新进程及其主要线程。新进程在调用进程的安全上下文中运行。

    1.5K30

    1.12 进程注入ShellCode套接字

    4.使用 OpenProcess 函数打开指定 PID 的进程,并分别使用 VirtualAllocEx 函数在该进程中分配内存空间,分别保存注入代码和 Param 结构体的数据。...5.使用 WriteProcessMemory 函数将注入代码和 Param 结构体的数据写入到指定进程中的内存空间中。...软件实现通过操作系统内核检查每个进程中的内存页面的属性,禁止在非执行属性(NX)页面上执行代码。...当有连接请求时,使用 CreateProcess 函数创建一个进程,并将标准输入、输出和错误重定向到网络套接字,实现远程 Shell。...通过 OpenProcess 函数打开目标进程,使用 VirtualAllocEx 函数在目标进程中分配内存,并使用 WriteProcessMemory 函数将代码和参数复制到目标进程的内存中。

    44740

    【虚幻引擎|UE】TArray在C++中的使用

    简介 TArray 类似于STL的vector,可以自动扩容,因为提供了相关操作函数,所以当作队列、栈、堆来使用也很方便,是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。...值 //Init(const ElementType& Element, SizeType Number) IntArray.Init(10, 5); 增删改查 注意:成员函数通常都有多个重载,代码中我仅列举部分常用的重载函数原型...Args) InitArray.Emplace(3); 两者区别 多数效果相同,细微区别: Add(或 Push)将元素类型的实例复制(或移动)到数组中。...Emplace 使用给定参数构建元素类型的新实例。 总体而言,Emplace 优于 Add,因其可避免在调用点创建无需临时变量。...在FString中,此为忽略大小写的词典编纂比较。 稳定排序。 可自定义比较器。

    1.9K30

    Pytorch的C++端(libtorch)在Windows中的使用

    前言 填一个之前的坑啊,本篇的姊妹篇——利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测 这篇文章中已经说明了如何在Ubuntu系统中使用libtorch做预测,当初也有朋友问我如何在...Windows版本的libtorch,这下就节省了我们编译Pytorch的时间,直接可以拿来使用,只要稍微配置一下就可以在Windows跑起libtorch了,没有想象中那么多的步骤,大可放心。...下图为在Visual Studio中使用libtorch和OpenCV来实现判断剪刀石头布手势,运行的平台是cpu端。当然GPU端也是可以运行的,之后也会进行详解。...,之后简称VS windows端的CMake 大概流程就是我们使用cmake构建好libtorch工程,然后使用VS打开根据cmake配置好的信息进行编译,所以在进行之后的步骤前一定要提前安装好上述的两样东西...(CPU和GPU),然后使用cmake配置后,利用VS进行编译就可以直接使用,其中遇到的问题大部分时环境的问题,我们的代码并不需要修改,是可以跨平台的,我也在VS2015和VS2017中进行了测试,都是可以的

    2.4K40

    实战 | 进程启动技术的思路和研究

    ; 这里着重说一下CreateProcess的实现过程 在Windows中,进程是不活动的,只是作为线程的容器,现代操作系统将线程作为最小调度单位,进程作为资源分配的最小单位。...至此,CreateProcess的操作已经完成,但子进程中的线程却尚未开始运行,它的运行还要经历下面的第五和第六阶段。...在不需要使用进程环境块后,可以通过调用DestroyEnvironmentBlock函数进行释放。获取环境块之后,就可以调用CreateProcessAsUser来创建用户桌面进程了。...然而,成功映射内存数据之后,在DLL程序中会存在硬编码数据,硬编码都是以默认的加载基址作为基址来计算的。由于DLL可以任意加载到其他进程空间中,所以DLL的加载基址并非固定不变。...它只有获取正确的调用函数地址后,方可正确调用函数。PE结构使用导入表来记录PE程序中所有引用的函数及其函数地址。在DLL映射到内存之后,需要根据导入表中的导入模块和函数名称来获取调用函数的地址。

    1.3K50

    Windows黑客编程技术详解 --第四章 木马启动技术(内含赠书福利)

    本章介绍了3种常用的病毒木马启动技术,它包括: q 创建进程API:介绍使用WinExec、ShellExecute以及CreateProcess创建进程。...返回值 如果函数成功,则返回大于32的值。如果该函数失败,则它将返回一个错误值,指示失败的原因。 3.CreateProcess函数 创建一个新进程及主线程。新进程在调用进程的安全的上下文中运行。...WinExec必须得到GetMessage或超时之后才返回,而ShellExecute和CreateProcess都是无需等待直接返回的。...然而,成功映射内存数据之后,在DLL程序中会存在硬编码数据,硬编码都是以默认的加载基址作为基址来计算的。由于DLL可以任意加载到其他进程空间中,所以DLL的加载基址并非固定不变。...在DLL映射到内存之后,需要根据导入表中的导入模块和函数名称来获取调用函数的地址。若想从导入模块中获取导出函数的地址,最简单的方式是通过GetProcAddress函数来获取。

    4.4K50

    自由控制程序运行方式的编程技巧

    因此,在我们的调试器显示消息的过程中,调试对象是处于暂停状态的 //调用 ContinueDebugEvent 函数可以让调试对象恢复运行,这时调试器又回到 WatiForDebugEvent...当设置这一标志时,CreateProcess 函数调用完成之后,新进程中的所有线程都会暂停 DEBUG_EVENT 结构体如下: typedef struct _DEBUG_EVENT { DWORD...Windows 中,即便我们的程序不是作为调试器挂载在目标进程上, 只要能够获取目标进程的句柄,就可以随意读写该进程的内存空间 HANDLE ph = OpenProcess( PROCESS_VM_WRITE...的路径配置在注册表的 AppInit_DLLs 项(位置见下图)中,就可以在系统启动时将任意 DLL 加载到其他进程中 writeappinit.cpp (如下)可以向注册表的 AppInit_DLLs...CreateRemoteThread 这个 API 函数可以在其他进程中创建线程,然后在新线程中运行 LoadLibrary,从而使得其他进程强制加载某个 DLL,其结构见下: HANDLE CreateRemoteThread

    76410

    实战 | 某OJ渗透测试记录

    能用的有 C/C++/G++/JAVA/C# 以及 PAS­CAL 试了一下,C/C++ 没有 win­dows.h,基本的 sys­tem 等函数就直接 re­set 了。...经过修改代码之后,提交运行。这次倒是上线了两个。 但是依旧是过了 10s,这两个程序同时掉线了。预测是被 k 了。 这就很奇怪了。 难道 TMD 学 360 还能判断进程链?还是说有什么组策略?...既然这样,我们就换个方法,既然它会 k 进程链,那么我们就注入到不是我们创建的进程不就行了嘛?...直接参考 [Windows 下 Shellcode 编写详解] 中的内联汇编代码,抄出来稍微改改就行 然后就是定义 api 然后调用 代码很长后面我就不截图了。...第二步当然是我们最爱的 ms17010 啦。 em­mmm,这管理员真的有在管学校嘛。 剩下的没意思,溜了溜了

    97210

    Windows内核之进程基本含义以及进程的创建「建议收藏」

    调用由_onexit函数的调用而注冊的不论什么函数 为全部全局的和静态的C++类对象调用析构函数 调用操作系统的ExitProcess函数,将nMainRetVal传递给它。...3.2 进程的前一个实例句柄 C++代码总是将NULL赋值给WinMain函数的第二个參数HINSTANCEhPreInstance,这种原因是在16位的程序中对这个參数有保留使用,那么保留它就方便转用...8 创建进程 BOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine...主要指定窗体的状态,外观,标准句柄。 当Wi n d o w s 创建新进程时,它将使用该结构的有关成员。大多数应用程序将要求生成的应用程序只使用默认值。至少应该将该结构中的全部成员初始化为零。...当进程内核对象创建后,系统赋予该对象一个独一无二的标识号。系统中的其它不论什么进程内核对象都不能使用这个同样的ID号。线程内核对象的情况也一样。

    81410

    VC 调用外部程序接口

    可以直接调用   返回值     =-1:出现错误     =0:调用成功但是没有出现子进程     >0:成功退出的子进程的id   样例:           system("D:\\game.exe...lpCommandLine, // 参数行            //下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性           LPSECURITY_ATTRIBUTES...          LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性           LPPROCESS_INFORMATION lpProcessInformation...//用于在进程创建后接受相关信息        ); 评论:   system(),主要用在DOS环境下.     ...CreateProcess(),目前最强劲的进程函数,通过设置StartupInfo结构体参数,来设置子进程的属性, 子进程创建后的信息也保存在ProcessInformation结构体中,便于操作,功能强大

    1.3K20

    创建线程的方式打开记事本

    如果创建线程成功,返回值为线程的句柄;否则返回值为NULL。 句柄: 有趣的是,在 Windows 里并没有进程层次的概念,所有进程的地位都是相同的。...在创建进程时,父进程会得到一个特别令牌(句柄),用于控制子进程。 该令牌是可以传递的,即父进程有权将该令牌传递给其他进程,以至于不存在了进程层次的概念。...注意: 新线程的入口点是通过 lpStartAddress 参数指定的线程函数。线程函数在新线程中执行,可以执行各种任务。 线程函数的返回值是一个 DWORD 类型的值,表示线程的退出码。...在使用CreateThread函数创建线程后,需要使用 CloseHandle 函数关闭线程句柄,以释放资源。...接下来调用 CreateProcess 函数用于创建一个新的进程,返回进程的句柄和线程的句柄。它的参数包括可执行文件名、命令行参数、进程句柄和线程句柄是否可继承等信息。

    38930

    CC++ 进程代码注入&提权&降权

    如果将shellcode注入到具有特定权限的进程中,我们就可以获得与该进程相同的权限,此方法可以用于提权与降权操作,注入有多种方式,最简单的是直接将metasploit生成的有效载荷直接注入到目标进程中...msgbox = (MESSAGEBOX)(*ptr->KernelGetProcAddress)((HINSTANCE)ptr->UserHandle, ptr->msgbox); 将代码注入到目标进程中..., LPQOS, LPQOS); typedef BOOL(WINAPI * CREATEPROCESS) (LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES...// 调用的远程Shell代码 void __stdcall MyShell(PARAMETROS *ptr) { // 通过GetProcAddress获取到ws2.dll中的所有函数地址 ptr...首先使用注入器注入一个正在运行的进程,参数为PID 使用NC直接连接进去,即可获取到,与注入进程相同的权限,端口写死了9999 如果目标进程开启了,动态地址,ASLR,等则注入会失败,程序崩溃,这里需要注意一下

    1.2K30

    ReadProcessMemoryC++的探索

    重点:当操作进入了进程不可读取的部分时会失败,大多数人犯的错误。...CreateProcess(L"....pi.hThread ); 然后查了各种博客,讲得大同小异,有的说权限不对,有的说地址不对,然后我看到可以用GetLastError(菜鸟一枚,勿喷)获取错误代码,我用了后发现代码是5,然后用IDE工具中的错误查看器查出错误是...居然支持中文版,感动,,, 用ChartEngine查看了子进程的内存,果然基址至少20000以上,还且经常会变。基址换了之后,真的读取成功了,感动得泪流满面。...后来由于基址在程序运行前会变化,所有用了while语句,直到成功时才跳出循环,苦逼,,,这么简单的东西搞了半天,主要基础没打好,,,, 下面是正确的代码: STARTUPINFO si; PROCESS_INFORMATION

    55031

    ReadProcessMemory与WriteProcessMemory用例分析

    首先介绍一个函数VirtualProtectEx,它用来改变一个进程的虚拟地址中特定页里的某一区域的保护属性,这句话有些咬嘴,直接从MSDN中翻译过来的,简单来说就是改变某一进程中虚拟地址的保护属性,如果以前是只读的...SIZE_T dwSize, __in DWORD flNewProtect, __out PDWORD lpflOldProtect ); 第一个参数是进程的句柄,这个句柄可以使用由...CreateProcess()函数得到的PROCESS_INFORMATION结构中的hProcess成员,CreateProcess()这个函数相信大家用的很多了,我就不详细介绍了。...如果想得到线程的句柄,同样可以采用这两种方式,利用结构体PROCESS_INFORMATION重的hThread成员或使用函数OpenThread()。...使用ReadProcessMemory()函数,可以获得该进程内存空间中的信息,或是用于监测进程的执行情况,或是将进程内的数据备份,然后调用writeProcessMemory()进行修改,必要时再还原该进程的数据

    82120

    第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)

    当创建子进程时,如果为CreateProcess函数的bInheritHandles参数传递TRUE,那么子进程就可以继承父进程的可继承句柄。 8.  dwCreationFlags--创建标志。...所以创建一个新的进程后,初始状态下Usage Count的值为2。之后,只要有进程打开这个内核对象,就会使得Usage Count的值加1。...线程的终止:当线程正常终止时,会发生下列事件:       1)在线程函数中创建的所有C++对象将通过它们各自的析构函数被正确地销毁。       2)该线程使用的堆栈将被释放。       ...3)使用TerminateThread函数在一个线程中强制终止另一个线程的执行。注意,这是被强烈建议避免的函数。...在实际开发中,一般不直接使用Windows系统提供的CreateThread函数创建线程,而是使用C/C++运行期函数_beginthreadex。

    11710

    WindowsAPI 之 CreatePipe、CreateProcess

    匿名管道(Anonymous Pipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。...匿名管道主要用于本地父进程和子进程之间的通信,在父进程中的话,首先是要创建一个匿名管道,在创建匿名管道成功后,可以获取到对这个匿名管道的读写句柄,然后父进程就可以向这个匿名管道中写入数据和读取数据了,但是如果要实现的是父子进程通信的话...,那么还必须在父进程中创建一个子进程,同时,这个子进程必须能够继承和使用父进程的一些公开的句柄,因为在子进程中必须要使用父进程创建的匿名管道的读写句柄,通过这个匿名管道才能实现父子进程的通信,所以必须继承父进程的公开句柄...同时在创建子进程的时候,必须将子进程的标准输入句柄设置为父进程中创建匿名管道时得到的读管道句柄,将子进程的标准输出句柄设置为父进程中创建匿名管道时得到的写管道句柄。然后在子进程就可以读写匿名管道了。...根据上边API的原型,通过hReadPipe和hWritePipe所指向的句柄可分别以只读、只写的方式去访问管道。在使用匿名管道通信时,服务器进程(父进程)必须将其中的一个句柄传送给客户机进程。

    4.5K10

    【虚幻引擎|UE4】TArray在C++中的使用

    简介TArray 类似于STL的vector,可以自动扩容,因为提供了相关操作函数,所以当作队列、栈、堆来使用也很方便,是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。...Element值//Init(const ElementType& Element, SizeType Number)IntArray.Init(10, 5);图片增删改查注意:成员函数通常都有多个重载,代码中我仅列举部分常用的重载函数原型...Args)InitArray.Emplace(3);两者区别多数效果相同,细微区别:Add(或 Push)将元素类型的实例复制(或移动)到数组中。Emplace 使用给定参数构建元素类型的新实例。...总体而言,Emplace 优于 Add,因其可避免在调用点创建无需临时变量。...在FString中,此为忽略大小写的词典编纂比较。稳定排序。可自定义比较器。

    1.5K00
    领券