首页 > 编程语言 >Win32编程之远程注入(十七)

Win32编程之远程注入(十七)

时间:2023-09-26 18:14:36浏览次数:39  
标签:十七 函数 编程 Win32 用于 内存 进程 SIZE hProcess

一、VirtualAllocEx函数

VirtualAllocEx 用于在另一个进程的虚拟地址空间中分配内存。这个函数通常与其他进程间内存操作函数一起使用,允许一个进程分配内存并将其映射到另一个进程的地址空间中。

函数原型:

LPVOID VirtualAllocEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,
  DWORD  flProtect
);

参数:

  • hProcess(HANDLE):

    描述:目标进程的句柄,用于指定在哪个进程中分配内存。
    注意事项:你需要有足够的权限来打开目标进程。

  • lpAddress(LPVOID,可选):

    描述:可选参数,用于指定分配内存的首选地址。如果为 NULL,则系统会选择一个合适的地址。

  • dwSize(SIZE_T):

    描述:要分配的内存大小,以字节为单位。

  • flAllocationType(DWORD):

    描述:内存分配类型,可以是以下值之一:
    MEM_COMMIT:分配内存并提交它,使其可用。
    MEM_RESERVE:仅保留内存地址空间,但不分配物理内存。
    MEM_RESET:重置已经提交的内存区域。

  • flProtect(DWORD):

    描述:内存保护标志,用于指定内存的访问权限,可以是以下值之一:
    PAGE_EXECUTE_READ:可执行代码。
    PAGE_EXECUTE_READWRITE:可读写的可执行代码。
    PAGE_READWRITE:可读写。
    等等,还有其他选项,用于控制内存的保护级别。
返回值:

  • 如果函数成功分配内存,它将返回一个指向分配内存区域的指针(LPVOID),通常是分配内存的起始地址。
  • 如果函数失败,它将返回 NULL。你可以使用 GetLastError 函数来获取详细的错误信息。

二、VirtualFreeEx函数

VirtualFreeEx用于释放在另一个进程的虚拟地址空间中分配的内存。这个函数通常与 VirtualAllocEx 函数一起使用,用于在另一个进程中分配内存并在不再需要时释放它。 

函数原型:

BOOL VirtualFreeEx(
  HANDLE hProcess,
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  dwFreeType
);

 参数介绍:

  • hProcess:目标进程的句柄,用于指定在哪个进程中释放内存。
  • lpAddress:要释放的内存区域的起始地址。
  • dwSize:要释放的内存大小,以字节为单位。通常,这应该与之前使用 VirtualAllocEx 分配的内存大小相匹配。
  • dwFreeType:内存释放类型,可以是以下值之一:
    • MEM_DECOMMIT:释放内存并标记为未提交。这个选项允许稍后重新提交。
    • MEM_RELEASE:释放内存,并从进程的地址空间中删除。这个选项将释放内存并返回系统。

三、WriteProcessMemory函数

WriteProcessMemory用于在另一个进程的虚拟地址空间中写入数据。这个函数通常与 VirtualAllocExReadProcessMemoryCreateRemoteThread 等函数一起使用,允许一个进程向另一个进程写入数据,这在一些应用程序和系统工具中非常有用。 

函数原型:

BOOL WriteProcessMemory(
  HANDLE  hProcess,
  LPVOID  lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesWritten
);

参数介绍:

  • hProcess:目标进程的句柄,用于指定在哪个进程中写入数据。
  • lpBaseAddress:目标进程中的起始地址,指定要写入数据的位置。
  • lpBuffer:包含要写入目标进程的数据的缓冲区。
  • nSize:要写入的数据大小,以字节为单位。
  • lpNumberOfBytesWritten:一个指向 SIZE_T 类型的变量指针,用于接收成功写入的字节数。这是一个可选参数,可以为 NULL。

四、ReadProcessMemory函数

ReadProcessMemory 是 Windows 操作系统提供的函数,用于从另一个进程的虚拟地址空间中读取数据。这个函数通常与 WriteProcessMemoryVirtualAllocExCreateRemoteThread 等函数一起使用,允许一个进程从另一个进程读取数据。

函数原型:

BOOL ReadProcessMemory(
  HANDLE  hProcess,
  LPCVOID lpBaseAddress,
  LPVOID  lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesRead
);

参数介绍:

  • hProcess:目标进程的句柄,用于指定从哪个进程中读取数据。
  • lpBaseAddress:目标进程中的起始地址,指定要读取数据的位置。
  • lpBuffer:用于接收从目标进程读取的数据的缓冲区。
  • nSize:要读取的数据大小,以字节为单位。
  • lpNumberOfBytesRead:一个指向 SIZE_T 类型的变量指针,用于接收成功读取的字节数。这是一个可选参数,可以为 NULL。

五、CreateRemoteThread函数

CreateRemoteThread用于在另一个进程的上下文中创建一个新的线程。这个函数通常与其他进程间通信函数如 VirtualAllocExWriteProcessMemoryReadProcessMemory 一起使用,允许一个进程在另一个进程中执行代码。

函数原型:

HANDLE CreateRemoteThread(
  HANDLE                 hProcess,
  LPSECURITY_ATTRIBUTES  lpThreadAttributes,
  SIZE_T                 dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID                 lpParameter,
  DWORD                  dwCreationFlags,
  LPDWORD                lpThreadId
);

参数介绍:

  • hProcess:目标进程的句柄,用于指定在哪个进程中创建线程。
  • lpThreadAttributes:一个指向 SECURITY_ATTRIBUTES 结构的指针,用于指定新线程的安全属性,通常可以设置为 NULL。
  • dwStackSize:新线程的堆栈大小,通常可以设置为 0。
  • lpStartAddress:新线程的起始地址,即要在目标进程中执行的函数指针。
  • lpParameter:传递给新线程的参数,通常可以设置为 NULL。
  • dwCreationFlags:线程创建标志,通常可以设置为 0。
  • lpThreadId:一个指向 DWORD 类型的变量指针,用于接收新线程的标识。这是一个可选参数,可以为 NULL。

六、OpenProcess函数  

OpenProcess用于打开一个已存在进程的句柄,以便后续进行与该进程相关的操作,如读取或写入其内存、查看其线程、以及执行其他与进程有关的任务。

函数原型:

HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);

参数介绍:

  • dwDesiredAccess:指定要打开的进程的访问权限。这是一个标志位,可以指定多个权限选项,如下所示的一些常见选项:

    • PROCESS_ALL_ACCESS:具有对进程的完全访问权限,包括读取、写入、执行、终止等。
    • PROCESS_VM_READ:允许读取进程的虚拟内存。
    • PROCESS_VM_WRITE:允许写入进程的虚拟内存。
    • PROCESS_QUERY_INFORMATION:允许获取进程信息。
  • bInheritHandle:一个布尔值,指定句柄是否可以被子进程继承。通常可以设置为 FALSE。

  • dwProcessId:目标进程的进程标识符(PID),用于指定要打开的进程。

 

标签:十七,函数,编程,Win32,用于,内存,进程,SIZE,hProcess
From: https://www.cnblogs.com/TechNomad/p/17730852.html

相关文章

  • 多阅读编程语言语言的官方文档及一些源码
    1官方文档回顾了下自己这几年的学习历程,关于编程语言官方文档的学习很少很少,平时喜欢去看各种公众号文章和网站教程,自己的python基础以及一些框架基础就是就是在公众号、网站教程、博客和书上学来的。现在看看官方文档的那些海量的内容,自己都觉得很惊奇,很少看过不说,有些地方自己......
  • Win32编程之全局钩子(十七)
    一、动态链接库库头文件:#pragmaonce#include<Windows.h>extern"C"{ __declspec(dllexport)void__stdcallSetHookVal(HHOOKhookVal); __declspec(dllexport)LRESULTCALLBACKMouseProc(intcode,WPARAMwParam,LPARAMlParam);}库源文件:#includ......
  • Linux shell编程学习笔记1:关于shell的前世今生
    一、什么是Shell?Shell英文单词的原意是“外壳”,在计算机领域专指在操作系统(OperatingSystem)外层,提供用户界面(UserInterface)的程序,主要负责将用户的命令(Command)转化为操作系统可识别的指令(Instruction)。二、UnixshellUnix诞生于1969年,是最早提供shell,从而将操作系统和用户界面......
  • 在小公司编程是一种什么样的体验?
    前言知乎上有一个提问:在小公司编程是一种什么样的体验?↓↓↓今天,我们就这个话题,一起来做个讨论。这里有没有曾经待过小公司或者现在正窝在小公司的程序员?如果有,这个问题相信你是最有发言权的。一个软件产品从前期的调研到中途的开发直至最后的发布环节,不知道整个链......
  • 软件工程(结对编程项目)
    Github作业链接成员:刘鸿杰林程星软件工程计科21级4班作业要求作业3要求连接作业目标实现四则运算题目的命令行程序PSP表格PSP2.1ersonalSoftwareProcessStages预估耗时(分钟)实际耗时(分钟)Planning计划1010·Estimate·估计这个任务需......
  • 如何在低代码平台中应用可视化编程
    可视化编程,亦即可视化程序设计:以“所见即所得”的编程思想为原则,力图实现编程工作的可视化,即随时可以看到结果,程序与结果的调整同步。可视化编程的理念来源于可视化技术,它指的是一种把计算机程序中的文本指令转换为用户可以完全理解和操作的图形化界面。传统上,用户通过文本编程来......
  • Spring 04 SpringAOP 切面编程
    Aop:面向切面,在不修改代码的前提下对方法进行增强 pom.xml<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version>......
  • Windows网络编程(一)
    一、WSAStartup函数WSAStartup是Windows套接字API中的一个函数,它用于初始化Winsock库,这是Windows中用于网络编程的库。使用Winsock,您可以创建客户端和服务器应用程序,以便它们能够通过网络进行通信。函数的原型如下:intWSAStartup(WORDwVersionRequested,......
  • win32汇编-80386的内存分页机制
     读者可以注意到,在实模式下寻址的时候,“段寄存器+偏移地址”经过转换计算以后得到的地址是“物理地址”,也就是在物理内存中的实际地址。而保护模式下,“段选择器+偏移地址”转换后的地址被称为“线性地址”而不是“物理地址”。那么,线性地址就是物理地址吗?答案可能是“是”,也可......
  • 编程笔记·开篇
    2023年9月,经过一夜的辗转难眠,最后在一个清晨,我坐上了久违的地铁......