当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-14

    本文导语:  代码如下: //首先导入命名空间 using System.Runtime.InteropServices; /// /// 在指定进程的虚拟地址空间中保留或开辟一段区域..除非MEM_RESET被使用,否则将该内存区域初始化为0. /// /// 需要在其中分配空间的进程的句柄.这个句柄必须...

代码如下:

//首先导入命名空间
using System.Runtime.InteropServices;
///
/// 在指定进程的虚拟地址空间中保留或开辟一段区域..除非MEM_RESET被使用,否则将该内存区域初始化为0.
///
/// 需要在其中分配空间的进程的句柄.这个句柄必须拥有PROCESS_VM_OPERATION访问权限
/// 想要获取的地址区域.一般用NULL自动分配
/// 要分配的内存大小.字节单位.注意实际分 配的内存大小是页内存大小的整数倍
/// 内存分配的类型
/// 内存页保护
/// 执行成功就返回分配内存的首地址,失败返回0。
[DllImport("kernel32.dll")] //声明API函数
public static extern int VirtualAllocEx(IntPtr process, int pAddress, int size, int type, int protect);
///
/// 写入某一进程的内存区域。入口区必须可以访问,否则操作将失败
///
/// 进程句柄
/// 要写的内存首地址
/// 指向要写的数据的指针(数据当前存放地址)。
/// 要写入的字节数。
/// 实际数据的长度
/// 非零表示成功,零表示失败
[DllImport("kernel32.dll")]
public static extern int WriteProcessMemory(IntPtr process, int baseAddress, string buffer, int nSize, int lpNumberOfBytesWritten);
///
/// 检索指定的动态链接库(DLL)中的输出库函数地址
///
/// DLL模块句柄 包含此函数的DLL模块的句柄。LoadLibrary或者GetModuleHandle函数可以返回此句柄。
/// 函数名 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。
/// 调用成功,返回DLL中的输出函数地址,调用失败,返回0。得到进一步的错误信息,调用函数GetLastError。
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hModule, string lpProcName);
///
/// 获取一个应用程序或动态链接库的模块句柄
///
/// 指定模块名,这通常是与模块的文件名相同的一个名字
/// 如执行成功成功,则返回模块句柄。零表示失败
[DllImport("kernel32.dll")]
public static extern int GetModuleHandleA(string moduleName);
///
/// 创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).
///
/// 目标进程的句柄
/// 指向线程的安全描述结构体的指针,一般设置为0,表示使用默认的安全级别
/// 线程堆栈大小,一般设置为0,表示使用默认的大小,一般为1M
/// 线程函数的地址
/// 传给线程函数的参数
/// 线程的创建方式(0表示线程创建后立即运行 CREATE_SUSPENDED 0x00000004以挂起方式创建 创建不会运行,直到调用 ResumeThread函数)
/// 指向所创建线程句柄的指针,如果创建失败,该参数为0
/// 如果调用成功,返回新线程句柄,失败返回0
[DllImport("kernel32.dll")]
public static extern int CreateRemoteThread(IntPtr process, int threadAttributes, int stackSize, int startAddress, int parameter, int creationFlags, int threadid);

代码如下:

///
/// 根据进程名称获取进程
///
/// 进程名称
///
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!");
}
}

    
 
 

您可能感兴趣的文章:

  • c#中SAPI使用总结——SpVoice的使用方法
  • c#友好显示日期 c#日期datetime使用方法
  • 请问在工作岗位的朋友!使用java开发的公司对c#的态度如何?
  • c#自带缓存使用方法 c#移除清理缓存
  • C#中的switch case使用介绍
  • c# 空合并运算符“??”的使用详解
  • 使用C#实现在屏幕上画图效果的代码实例
  • 深入C#中使用SqlDbType.Xml类型参数的使用详解
  • c#闭包使用方法示例
  • c# split分隔字符串使用方法
  • c#的params参数使用示例
  • c#使用资源文件的示例
  • 使用C# Winform应用程序获取网页源文件的解决方法
  • C#将时间转成文件名使用方法
  • C# 使用匿名函数解决EventHandler参数传递的难题
  • 使用C#获取系统特殊文件夹路径的解决方法
  • C#使用带like的sql语句时防sql注入的方法
  • C#可选参数的相关使用
  • C# 静态构造函数使用总结
  • C# WndProc的使用方法示例
  • 在Python中使用SWIG调用C和C++程序
  • 新手:Linux下使用第三方C库(openssl),是调用.so文件还是直接调用.h文件?
  • Qt下使用Linux系统调用?
  • fork~exec不会使用,请问怎么使用,我只是想简单的用进程调用一个程序。
  • 关于使用Ptrace系统调用监控进程问题
  • 使用gdb时为什么调用list不出现代码
  • [求助]如何获取一个程序所使用的系统调用和参数?
  • linux不用命令方式读文件获取网络流量,如何使用C函数调用获取网络流量信息?
  • Unix下System函数实现中为何要使用shell去调用执行程序?
  • linux 内核编程中如何使用系统调用函数呢?
  • 请问驱动程序中系统调用使用情况
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • asp.net使用ODP即oracle连接方式的的防注入登录验证程序
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 在Python中使用SWIG调用C和C++程序 iis7站长之家
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • Jsp可否使用带有GUI的JavaBean,如何使用?
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • asp程序使用的access在Linux下如何使用!
  • c/c++预处理命令预#,##使用介绍
  • 新装的Linux使用root用户不能使用FTP?
  • 在div中使用css让文字底部对齐的方法
  • LINUX下使用Eclipse,如何使用交叉编译器?
  • Python namedtuple(命名元组)使用实例
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3