C# 进程注入的代码

转的,还不知道能用不http://community.csdn.net/Expert/topic/5645/5645084.xml?temp=.8446161

使用CreateRemoteThread和LoadLibrary技术的步骤如下:
1.  得到远程进程的HANDLE(使用OpenProcess)。
2.  在远程进程中为DLL文件名分配内存(VirtualAllocEx)。
3.  把DLL的文件名(全路径)写到分配的内存中(WriteProcessMemory)
4.  使用CreateRemoteThread和LoadLibrary把你的DLL映射近远程进程。
5.  等待远程线程结束(WaitForSingleObject),即等待LoadLibrary返回。也就是说当我们的DllMain(是以DLL_PROCESS_ATTACH为参数调用的)返回时远程线程也就立即结束了。
6.  取回远程线程的结束码(GetExitCodeThtread),即LoadLibrary的返回值――我们DLL加载后的基地址(HMODULE)。
7.  释放第2步分配的内存(VirtualFreeEx)。
8.  用CreateRemoteThread和FreeLibrary把DLL从远程进程中卸载。调用时传递第6步取得的HMODULE给FreeLibrary(通过CreateRemoteThread的lpParameter参数)。
9.  等待线程的结束(WaitSingleObject)。

10.采用C++/CLI编写:

None.gif //  InjectDll.h
None.gif

None.gif#pragma once
None.gif
None.gif#include 
< windows.h >
None.gif
using   namespace  System;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
namespace  InjectDll  dot.gif {
InBlock.gif
InBlock.gif
public ref class InjectDllManager
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
public:
InBlock.gif
// szLibPath - 要加载的Dll,hProcess - 被加载的远程进程,iLibPathSize-要加载的Dll的名称的长度
InBlock.gif
void InjectLib2Process(char szLibPath[],HANDLE hProcess,int iLibPathSize)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifHANDLE hThread;
InBlock.gif
void*   pLibRemote;
InBlock.gifDWORD   hLibModule;
//已加载的DLL的基地址(HMODULE);
InBlock.gif
HMODULE hKernel32 = GetModuleHandle(L"Kernel32");
InBlock.gif
//初始化 szLibPath
InBlock.gif
//dot.gif
InBlock.gif
// 1. 在远程进程中为szLibPath 分配内存
InBlock.gif
// 2. 写szLibPath到分配的内存
InBlock.gif
pLibRemote = VirtualAllocEx( hProcess, NULL, iLibPathSize,
InBlock.gifMEM_COMMIT, PAGE_READWRITE );
InBlock.gifWriteProcessMemory( hProcess, pLibRemote, (
void*)szLibPath,
InBlock.gif
sizeof(szLibPath), NULL );
InBlock.gif
// 加载 "szLibPath.dll" 到远程进程
InBlock.gif
// (通过 CreateRemoteThread & LoadLibrary)
InBlock.gif
hThread = CreateRemoteThread( hProcess, NULL, 0,
InBlock.gif(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,
InBlock.gif
"LoadLibraryA" ),pLibRemote, 0, NULL );
InBlock.gifWaitForSingleObject( hThread, INFINITE );
InBlock.gif
//取得DLL的基地址
InBlock.gif
GetExitCodeThread( hThread, &hLibModule );
InBlock.gif
//扫尾工作
InBlock.gif
CloseHandle( hThread );
InBlock.gifVirtualFreeEx( hProcess, pLibRemote, iLibPathSize, MEM_RELEASE );
InBlock.gif
// 从目标进程卸载LibSpu.dll
InBlock.gif
// (通过 CreateRemoteThread & FreeLibrary)
InBlock.gif
hThread = CreateRemoteThread( hProcess, NULL, 0,
InBlock.gif(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,
"FreeLibrary" ),(void*)hLibModule, 0, NULL );
InBlock.gifWaitForSingleObject( hThread, INFINITE );
InBlock.gif
// 扫尾工作
InBlock.gif
CloseHandle( hThread );
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}
;
ExpandedBlockEnd.gif}

None.gif

 


生成Dll,然后在C#项目中将它引用进来,最后编写:

None.gif public  partial  class  Form1 : Form
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
public Form1()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            InitializeComponent();
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
private void Form1_Load(object sender, EventArgs e)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            InjectDll.InjectDllManager iManager 
= new InjectDll.InjectDllManager();
InBlock.gif            iManager.InjectLib2Process(dot.gif.);
InBlock.gif            
// dot.gifdot.gif
ExpandedSubBlockEnd.gif
        }

ExpandedBlockEnd.gif    }

None.gif
None.gif

转载于:https://www.cnblogs.com/wysky/archive/2007/07/12/815557.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值