C#进程注入

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.使用CreateRemoteThread和LoadLibrary把你的DLL映射近远程进程。
5.等待远程线程结束(WaitForSingleObject),即等待LoadLibrary返回。也就是说当我们的DllMain(是以DLL_PROCESS_ATTACH为参数调用的)返回时远程线程也就立即结束了。
[DllImport("kernel32.dll")]
public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);
}
};
}
生成Dll,然后在C#项目中将它引用进来,最后编写:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
VirtualFreeEx( hProcess, pLibRemote, iLibPathSize, MEM_RELEASE );
//从目标进程卸载LibSpu.dll
// (通过CreateRemoteThread & FreeLibrary)
hThread = CreateRemoteThread( hProcess, NULL, 0,
if (ok1 == 0)
{
MessageBox.Show("写内存失败!!");
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
[DllImport("kernel32.dll")]
public static extern int GetModuleHandleA(string name);
[DllImport("kernel32.dll")]
public static extern int CreateRemoteThread(IntPtr hwnd, int attrib, int size, int address, int par, int flags, int threadid);
(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,"FreeLibrary" ),(void*)hLibModule, 0, NULL );
WaitForSingleObject( hThread, INFINITE );
//扫尾工作
CloseHandle( hThread );
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int ok1;
//int ok2;
//int hwnd;
int baseaddress;
int temp=0;
int hack;
首先需要加入以下API函数:
[DllImport("kernel32.dll")]
public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);
[DllImport("kernel32.dll")]
if (baseaddress == 0) //返回0则操作失败,下面都是
{
MessageBox.Show("申请内存空间失败!!");
Application.Exit();
}
ok1 = WriteProcessMemory(name.Handle, baseaddress, dllname, dlllength, temp); //写内存
C#进程注入
使用CreateRemoteThread和LoadLibrary技术的步骤如下:
1.得到远程进程的HANDLE(使用OpenProcess)。
2.在远程进程中为DLL文件名分配内存(VirtualAllocEx)。
3.把DLL的文件名(全路径)写到分配的内存中(WriteProcessMemory)
{
InjectDll.InjectDllManager iManager = new InjectDll.InjectDllManager();
iManager.InjectLib2Process(.);
//
}
}
C#进程注入,模拟注入一个记事本
C#中的DLL注入
事实上dll注入很简单,无非就是调用virtualAllocEx,WriteProcessMemory,OpenProcess,CreateRemoteThread等API函数,因为我是学c#的,所以也想看一下c#这方面的文章,但在网上找了半天,没有找到一篇,也许是c#刚兴起的缘故,学c#的并不多,没办法,只好自己移植一下,因为凡是用到API函数,所有的编程的语言都是相同的,这就为我们的移植带来了方便,学c#的一般应该对API的调用概念很淡,因为c#通常不会去调用API函数,因为这些已经被封装了,在vb,vc++等语言中要结束一个进程,首先就必须要得到这个进程的句柄,然后才能进行相应的关闭进程等操作,得到句柄要用到OpenProcess API函数,结束进程要用到TerminateProcess API函数,但是在c#中你根本不需要知道这些API函数就能完成同样的功能,所以你要是想了解一下API的相关知识,学一点vb是一个很好的选择。好了!下面就开始我们的c# dll注入之旅吧!
"LoadLibraryA" ),pLibRemote, 0, NULL );
WaitForSingleObject( hThread, INFINITE );
//取得DLL的基地址
GetExitCodeThread( hThread, &hLibModule );
//扫尾工作
CloseHandle( hThread );
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace dllinject
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll")] //声明API函数
{
public:
// szLibPath -要加载的Dll,hProcess -被加载的远程进程,iLibPathSize-要加载的Dll的名称的长度
void InjectLib2Process(char szLibPath[],HANDLE hProcess,int iLibPathSize)
{
HANDLE hThread;
void* pLibRemote;
DWORD hLibModule;//已加载的DLL的基地址(HMODULE);
HMODULE hKernel32 = GetModuleHandle(L"Kernel32");
//初始化szLibPath
//
// 1.在远程进程中为szLibPath分配内存
// 2.写szLibPath到分配的内存
int yan;
string dllname;
dllname = "c:\\dll.dll";
int dlllength;
dlllength = dllname.Length + 1;
Process[] pname = Process.GetProcesses(); //取得所有进程
foreach (Process name in pname) //遍历进程
{
//MessageBox.Show(name.ProcessName.ToLower());
if (name.ProcessName.ToLower().IndexOf("notepad") != -1) //所示记事本,那么下面开始注入
{
baseaddress = VirtualAllocEx(name.Handle, 0, dlllength , 4096, 4); //申请内存空间
9.等待线程的结束(WaitSingleObject)。
10.采用C++/CLI编写:
// InjectDll.h
#pragma once
#include <windows.h>
using namespace System;
namespace InjectDll {
public ref class InjectDllManager
public static extern int VirtualAllocEx(IntPtr hwnd, int lpaddress, int size, int type, int tect);
[DllImport("kernel32.dll")]
public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );
6.取回远程线程的结束码(GetExitCodeThtread),即LoadLibrary的返回值――我们DLL加载后的基地址(HMODULE)。
7.释放第2步分配的内存(VirtualFreeEx)。
8.用CreateRemoteThread和FreeLibrary把DLL从远程进程中卸载。调用时传递第6步取得的HMODULE给FreeLibrary(通过CreateRemoteThread的lpParameter参数)。
C#声明API比较复杂,因为是调用非托管的dll,所以要用到DllImport来调用非托管的dll,他还有很多属性在这就不多说了,网上有很介绍,可以去查一下,不过c#调用自身的变得动态链接库是倒是很方便,直接加个引用就ok了,调用dll要用的一个引用:using System.Runtime.InteropServices;这个不要忘了加上,下面是编好的所有代码:
pLibRemote = VirtualAllocEx( hProcess, NULL, iLibPathSize,
MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath,
sizeof(szLibPath), NULL );
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hwnd, string lpname);
[DllImport("kernel32.Βιβλιοθήκη Baidull")]
public static extern int GetModuleHandleA(string name);
public static extern int WriteProcessMemory(IntPtr hwnd, int baseaddress, string buffer, int nsize, int filewriten );
[DllImport("kernel32.dll")]
public static extern int GetProcAddress(int hwnd, string lpname);
//加载"szLibPath.dll"到远程进程
// (通过CreateRemoteThread & LoadLibrary)
hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,
相关文档
最新文档