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

代码如下:

//首先导入命名空间

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!");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值