实在受不了了,大家来帮帮我如何调用这个C++/CLI的DLL

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


// ......

}

}

=====
我不知道void*是什么类型 也不知道sbyte*怎么声明这种类型,弄的很累.
InjectDll.InjectDllManager iManager  =   new  InjectDll.InjectDllManager();
            
// iManager.InjectLib2Process("InjectDLL.dll",
            System.Diagnostics.Process[] tempPro  =  System.Diagnostics.Process.GetProcessesByName( " explorer " );
            
char [] dllName =   {'I','n','j','e','c','t','D','L','L'} ;
            
string  aaa = @" E:\我的文档\Visual Studio 2005\Projects\MYGameBOTS\Instore\bin\Debug\InjectDLL.dll " ;
            iManager.InjectLib2Process(dllName,tempPro[
0 ].Handle,aaa.Length);

麻烦大家帮帮我吧
如何调用那个DLL (编译好的 http://files.cnblogs.com/wysky/InjectDLL.rar)

转载于:https://www.cnblogs.com/wysky/archive/2007/09/11/889386.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值