使用C#调用系统API实现内存注入的代码_C#教程

复制代码 代码如下:

//首先导入命名空间
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);

复制代码 代码如下:

/// <summary>
/// 根据进程名称获取进程
/// </summary>
/// <param name="ProcessName">进程名称</param>
/// <returns></returns>
public Process GetProcessByName(string ProcessName)
{
//取得所有进程
Process[] pname = Process.GetProcesses();
//遍历进程
foreach (Process name in pname)
{
//如果查找到进程名称 返回
if (name.ProcessName.ToLower().IndexOf(ProcessName) != -1)
return name;
}
return null;
}

复制代码 代码如下:

public void killDll()
{
string dllName = "c:\\text.dll";
int dlllength = dllName.Length + 1;
//这里以记事本为例
Process processName = GetProcessByName("notepad");
//如果查找到记事本进程,那么下面开始注入
if (processName != null)
{
//申请内存空间,执行成功就返回分配内存的首地址,不成功就是0。
int baseaddress = VirtualAllocEx(processName.Handle, 0, dlllength, 4096, 4);
if (baseaddress == 0)
{
MessageBox.Show("申请内存空间失败!");
return;
}
//写内存
int result = WriteProcessMemory(processName.Handle, baseaddress, dllName, dlllength, 0);
if (result == 0)
{
MessageBox.Show("写内存失败!");
return;
}
//取得loadlibarary在kernek32.dll地址
int procAddress = GetProcAddress(GetModuleHandleA("Kernel32"), "LoadLibraryA");
if (procAddress == 0)
{
MessageBox.Show("无法取得函数的入口点!");
return;
}
//创建远程线程。
result = CreateRemoteThread(processName.Handle, 0, 0, 0, baseaddress, 0, 0);
if (result == 0)
{
MessageBox.Show("创建远程线程失败!");
return;
}
else
MessageBox.Show("已成功注入dll!");
}
}

时间: 2024-09-20 01:02:40

使用C#调用系统API实现内存注入的代码_C#教程的相关文章

C# Winform 调用系统接口操作 INI 配置文件的代码_C#教程

包括了写入和读取功能. 写入的时候, 如果文件不存在会自动创建. 如果对应的键已经存在, 则自动覆盖它的值. 读取的时候, 如果对应的文件不存在, 或者键名不存在, 则返回一个 empty 值. 非常方便 ^_^ 复制代码 代码如下: // 系统接口类 public static class WinAPI { [DllImport("kernel32")] // 写入配置文件的接口 private static extern long WritePrivateProfileString

android 系统相册-调用系统相册后内存过大

问题描述 调用系统相册后内存过大 20C 公司一个项目,需要调用系统相册用来裁剪照片,现在出现问题,就是在小米Pad上调用之后,程序的内存会被崩掉,但是并没有抛出异常,知道裁剪完毕之后返回的时候才会崩溃.这种问题怎么回事?其他机型目前没出现过. 解决方案 调用系统相册 解决方案二: 裁剪那里需要做缩放处理,估计是读了全图裁剪导致崩溃,可以从裁剪这块的代码入手多检查检查. 解决方案三: 是不是调用系统相册的时候把系统相册的相册都调用进来了占据了大量的内存空间,个人建议,在相册中开辟一个你们自己的相

基于C#的电视台节目表接口调用代码_C#教程

接口地址:http://www.juhe.cn/docs/api/id/129 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.IO; using Xfrog.Net; using System.Diagnostics; using System.Web; //--------------------------

c# 调用.bat文件的实现代码_C#教程

c# 调用.bat文件 使用命名空间:using System.Diagnostics; System.Diagnostics.Process.Start(Server.MapPath("ah.bat")); ===================================================================== 扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件 首先,批处理文件是一个文本文件,这个文件的每一行都是

asp.net获取系统当前时间的方法详解_C#教程

本文实例讲述了asp.net获取系统当前时间的方法.分享给大家供大家参考,具体如下: 在c# / ASP.net中我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2008-09-04).时间(12:12:12).日期+时间(2008-09-04 12:11:10)等. //获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().

C#中系统时间和UNIX时间戳互相转换_C#教程

在项目开发过程中,有时会遇到不同程序之间相互调用数据,数据中不免会包含时间,比如ASP.NET调用PHP,牵扯到时间就要做一下处理,PHP程序中一般存取的都是UNIX时间,不像ASP.NET存储的是年月日时分秒,这样就需要做一下转换,代码如下: 一.将系统时间转换成UNIX时间戳 复制代码 代码如下: DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,1,1)); DateTime dtNow =

C#中调用VB中Inputbox类的实现方法_C#教程

C#自己没有Inputbox这个类,但是Inputbox也蛮好用的,所以有两种方法可以使用 一:间接调用vb中的Inputbox功能       1.在项目中添加对Microsoft.VisualBasic引用       2.在项目中添加命名空间Using Microsoft.VisualBasic;       3.以后就可以直接使用VB中的好多类库(爽啊--)        例如:textBox1.Text=Microsoft.VisualBasic.Interaction.InputBo

C# 系统热键注册实现代码_C#教程

先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置加上如下代码就OK..注意:Form1_Load和Form1_FormClosed不能直接copy哦- 复制代码 代码如下: [DllImport("user32")] public static extern bool RegisterHotKey(IntPtr hWnd,int id,uint control,Keys vk ); //注册热键的api [DllImpor

在C#中调用VBScript、javascript等脚本的实现代码_C#教程

一.使用MSScriptControl 到微软的网站上下载Windows Script Control,它是一个ActiveX(R) 控件,所以在.NET中使用我Interop了一下.下载安装完成后,新建一个C#的Windows应用程序项目,在解决方案资源管理器中选中引用节点,右键点击选择添加引用菜单,弹出添加引用对话框,单击浏览找到安装Windows Script Control的目录,选取msscript.ocx文件确定.那么在引用节点下会增加一个MSScriptControl组件,下面是他