谁给份C# 进程注入的代码 谢谢。非常 感谢!

解决方案 »

  1.   

    http://www.codeproject.com/cs/system/CSLLKeyboard.asp键盘钩子
      

  2.   

    C#没办法实现,可以用C++/CLI实现,然后在C#中直接调用.
      

  3.   

    使用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(....);
                // ......
            }
        }