谁给份C# 进程注入的代码 谢谢。 谁给份C# 进程注入的代码 谢谢。非常 感谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.codeproject.com/cs/system/CSLLKeyboard.asp键盘钩子 C#没办法实现,可以用C++/CLI实现,然后在C#中直接调用. 使用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编写:// InjectDll.h#pragma once#include <windows.h>using namespace System;namespace InjectDll { public ref class InjectDllManager { 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到分配的内存 pLibRemote = VirtualAllocEx( hProcess, NULL, iLibPathSize, MEM_COMMIT, PAGE_READWRITE ); WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath, sizeof(szLibPath), NULL ); // 加载 "szLibPath.dll" 到远程进程 // (通过 CreateRemoteThread & LoadLibrary) hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32, "LoadLibraryA" ),pLibRemote, 0, NULL ); WaitForSingleObject( hThread, INFINITE ); //取得DLL的基地址 GetExitCodeThread( hThread, &hLibModule ); //扫尾工作 CloseHandle( hThread ); VirtualFreeEx( hProcess, pLibRemote, iLibPathSize, MEM_RELEASE ); // 从目标进程卸载LibSpu.dll // (通过 CreateRemoteThread & FreeLibrary) hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,"FreeLibrary" ),(void*)hLibModule, 0, NULL ); WaitForSingleObject( hThread, INFINITE ); // 扫尾工作 CloseHandle( hThread ); } };}生成Dll,然后在C#项目中将它引用进来,最后编写:public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { InjectDll.InjectDllManager iManager = new InjectDll.InjectDllManager(); iManager.InjectLib2Process(....); // ...... } } 帮忙看下我的这个DBHelper咋样啊?应该怎么改? 请问C#中如何使用VC做的ACTIVEX控件 这行delphi的代码怎么改成c#的呢? 如何学习BizTalk? C#中同一个解决方案下不同项目窗体的调用 做一个控制器, 该用UDP协议还是TCP协议好呢? C# 打包问题 C#中如何调用SQL存储过程 带4参数的 我的调试错误(请你看看) 谁能告诉我Microsoft.Ink是做什么的? 字符串连接中@的作用 C#中的枚举
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编写:
// InjectDll.h#pragma once#include <windows.h>
using namespace System;namespace InjectDll { public ref class InjectDllManager
{
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到分配的内存
pLibRemote = VirtualAllocEx( hProcess, NULL, iLibPathSize,
MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( hProcess, pLibRemote, (void*)szLibPath,
sizeof(szLibPath), NULL );
// 加载 "szLibPath.dll" 到远程进程
// (通过 CreateRemoteThread & LoadLibrary)
hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,
"LoadLibraryA" ),pLibRemote, 0, NULL );
WaitForSingleObject( hThread, INFINITE );
//取得DLL的基地址
GetExitCodeThread( hThread, &hLibModule );
//扫尾工作
CloseHandle( hThread );
VirtualFreeEx( hProcess, pLibRemote, iLibPathSize, MEM_RELEASE );
// 从目标进程卸载LibSpu.dll
// (通过 CreateRemoteThread & FreeLibrary)
hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) GetProcAddress( hKernel32,"FreeLibrary" ),(void*)hLibModule, 0, NULL );
WaitForSingleObject( hThread, INFINITE );
// 扫尾工作
CloseHandle( hThread );
}
};
}
生成Dll,然后在C#项目中将它引用进来,最后编写:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
InjectDll.InjectDllManager iManager = new InjectDll.InjectDllManager();
iManager.InjectLib2Process(....);
// ......
}
}