-
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);
栏目列表
最新更新
C#基于接口设计三层架构Unity篇
C#线程 入门
C#读取静态类常量属性和值
C# 插件式编程
C# 委托与事件有啥区别?
C#队列学习笔记:队列(Queue)和堆栈(Stack
linq 多表分组左连接查询查询统计
C#队列学习笔记:MSMQ入门一
C# 基础知识系列- 1 数据类型
二、C#入门—基础语法
C# 在Word中添加Latex 数学公式和符号
inncheck命令 – 检查语法
基于UDP的服务器端和客户端
再谈UDP和TCP
在socket编程中使用域名
网络数据传输时的大小端问题
socket编程实现文件传输功能
如何优雅地断开TCP连接?
图解TCP四次握手断开连接
详细分析TCP数据的传输过程
SqlServer 利用游标批量更新数据
BOS只读状态修改
SQL Server等待事件—PAGEIOLATCH_EX
数据库多行转换为单一列
获取数据表最后最后访问,修改,更新,
计算经历的时间
SQL查询结果自定义排序
修改数据库默认位置
日期简单加或减
从日期获取年,月或日