-
C#教程之使用C#调用系统API实现内存注入的代码
//首先导入命名空间
using System.Runtime.InteropServices;
/// <summary>
/// 在指定进程的虚拟地址空间中保留或开辟一段区域..除非MEM_RESET被使用,否则将该内存区域初始化为0.
/// </summary>
/// <param name="process">需要在其中分配空间的进程的句柄.这个句柄必须拥有PROCESS_VM_OPERATION访问权限</param>
/// <param name="pAddress">想要获取的地址区域.一般用NULL自动分配</param>
/// <param name="size">要分配的内存大小.字节单位.注意实际分 配的内存大小是页内存大小的整数倍</param>
/// <param name="type">内存分配的类型</param>
/// <param name="protect">内存页保护</param>
/// <returns>执行成功就返回分配内存的首地址,失败返回0。</returns>
[DllImport("kernel32.dll")] //声明API函数
public static extern int VirtualAllocEx(IntPtr process, int pAddress, int size, int type, int protect);
/// <summary>
/// 写入某一进程的内存区域。入口区必须可以访问,否则操作将失败
/// </summary>
/// <param name="process">进程句柄</param>
/// <param name="baseAddress">要写的内存首地址</param>
/// <param name="buffer">指向要写的数据的指针(数据当前存放地址)。</param>
/// <param name="nSize">要写入的字节数。</param>
/// <param name="lpNumberOfBytesWritten">实际数据的长度</param>
/// <returns>非零表示成功,零表示失败</returns>
[DllImport("kernel32.dll")]
public static extern int WriteProcessMemory(IntPtr process, int baseAddress, string buffer, int nSize, int lpNumberOfBytesWritten);
/// <summary>
/// 检索指定的动态链接库(DLL)中的输出库函数地址
/// </summary>
/// <param name="hModule"> DLL模块句柄 包含此函数的DLL模块的句柄。LoadLibrary或者GetModuleHandle函数可以返回此句柄。</param>
/// <param name="lpProcName">函数名 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。</param>
/// <returns>调用成功,返回DLL中的输出函数地址,调用失败,返回0。得到进一步的错误信息,调用函数GetLastError。</returns>
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hModule, string lpProcName);
/// <summary>
/// 获取一个应用程序或动态链接库的模块句柄
/// </summary>
/// <param name="moduleName">指定模块名,这通常是与模块的文件名相同的一个名字</param>
/// <returns>如执行成功成功,则返回模块句柄。零表示失败</returns>
[DllImport("kernel32.dll")]
public static extern int GetModuleHandleA(string moduleName);
/// <summary>
/// 创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).
/// </summary>
/// <param name="process">目标进程的句柄</param>
/// <param name="threadAttributes">指向线程的安全描述结构体的指针,一般设置为0,表示使用默认的安全级别</param>
/// <param name="stackSize">线程堆栈大小,一般设置为0,表示使用默认的大小,一般为1M</param>
/// <param name="startAddress">线程函数的地址</param>
/// <param name="parameter">传给线程函数的参数</param>
/// <param name="creationFlags">线程的创建方式(0表示线程创建后立即运行 CREATE_SUSPENDED 0x00000004以挂起方式创建 创建不会运行,直到调用 ResumeThread函数)</param>
/// <param name="threadid">指向所创建线程句柄的指针,如果创建失败,该参数为0</param>
/// <returns>如果调用成功,返回新线程句柄,失败返回0</returns>
[DllImport("kernel32.dll")]
public static extern int CreateRemoteThread(IntPtr process, int threadAttributes, int stackSize, int startAddress, int parameter, int creationFlags, int threadid);
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式