实在受不了了,大家来帮帮我如何调用这个C++/CLI的DLL
2007-09-11 10:19
507 查看
使用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");
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)
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");
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)
相关文章推荐
- 如何使用VS2013将C++派生类封装成DLL并动态调用
- 如何实现C++调用C#的dll方法教程
- Delphi如何调用C++写的DLL
- C#/C++/CLI运行效率测试之二: Native C++调用Native C++ DLL
- 如何在C++中调用DLL
- 在C++ 中 如何调用 C# 写的DLL
- C++如何调用DLL呢,有两种,一种是静态,另外一种是动态,即通过调用windowsAPI 来加载和卸载DLL,具体思路:
- C# 如何调用 C++ DLL中的函数接口和回调函数
- 如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数
- C#如何调用C++编写的dll中的导出类
- C++ Builder 2010 如何调用Vs2008创建出的C++的DLL
- 如何用C#调用C++开发的DLL呢?
- C++如何调用C#的DLL方法
- Delphi如何调用C++写的DLL(转)
- C#调用使用C++\CLI封装的标准C++ DLL问题:无法访问受保护的内存,这通常指示其他内存已损坏
- asp.net 调用(引用 Native dll 的)C++/CLI dll 的问题及解决
- C#如何静态调用C++中的方法(静态调用dll)
- C sharp中如何调用C++编写的DLL
- 综合项目之闪讯破解(四)之 如何用C++编写可被C#调用的Dll
- InstallShield如何调用c++的dll