• 大小: 275KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-04
  • 语言: C/C++
  • 标签:

资源简介

从网络下载了CMemLoadDll源码,整理并增加了对64位dll的加载,并增加了调用实例代码(含32位、64位dll的调用)。以上代码全部基于vs2008,当然CMemLoadDll源码在vc6下也可用。

资源截图

代码片段和文件信息

// MemLoadDll.cpp: implementation of the CMemLoadDll class.
//
//////////////////////////////////////////////////////////////////////
#include “StdAfx.h“
#include “MemLoadDll.h“

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CMemLoadDll::CMemLoadDll()
{
m_bIsLoadOk = FALSE;
m_pImagebase = NULL;
m_pDllMain = NULL;
}

CMemLoadDll::~CMemLoadDll()
{
if(m_bIsLoadOk)
{
// ASSERT(m_pImagebase != NULL);
// ASSERT(m_pDllMain   != NULL);
//脱钩,准备卸载dll
m_pDllMain((HINSTANCE)m_pImagebase DLL_PROCESS_DETACH 0);
VirtualFree(m_pImagebase 0 MEM_RELEASE);
}
}

//MemLoadLibrary函数从内存缓冲区数据中加载一个dll到当前进程的地址空间,缺省位置0x10000000
//返回值: 成功返回TRUE  失败返回FALSE
//lpFileData: 存放dll文件数据的缓冲区
//nDataLength: 缓冲区中数据的总长度
BOOL CMemLoadDll::MemLoadLibrary(void* lpFileData int nDataLength)
{
if (m_pImagebase != NULL)
{
return FALSE;  //已经加载一个dll,还没有释放,不能加载新的dll
}
//检查数据有效性,并初始化
if (!CheckDataValide(lpFileData nDataLength))
{
return FALSE;
}
//计算所需的加载空间
int nImageSize = CalcTotalImageSize();

if (nImageSize == 0)
{
return FALSE;
}
// 分配虚拟内存
void *pMemoryAddress = VirtualAlloc(NULL nImageSize MEM_COMMIT|MEM_RESERVE PAGE_EXECUTE_READWRITE);

if (pMemoryAddress == NULL)
{
return FALSE;
}
else
{
CopyDllDatas(pMemoryAddress lpFileData); //复制dll数据,并对齐每个段
//重定位信息
if (m_pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_baseRELOC].VirtualAddress > 0
&& m_pNTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_baseRELOC].Size > 0)
{
DoRelocation(pMemoryAddress);
}
//填充引入地址表
if (!FillRavAddress(pMemoryAddress)) //修正引入地址表失败
{
VirtualFree(pMemoryAddress 0 MEM_RELEASE);
return FALSE;
}
//修改页属性。应该根据每个页的属性单独设置其对应内存页的属性。这里简化一下。
//统一设置成一个属性PAGE_EXECUTE_READWRITE
unsigned long unOld;

VirtualProtect(pMemoryAddress nImageSize PAGE_EXECUTE_READWRITE &unOld);
}
//修正基地址
#ifdef WIN32
m_pNTHeader->OptionalHeader.Imagebase = (DWORD)pMemoryAddress;
#else
m_pNTHeader->OptionalHeader.Imagebase = (ULONGULONG)pMemoryAddress;
#endif
//接下来要调用一下dll的入口函数,做初始化工作。
m_pDllMain = (ProcDllMain)(m_pNTHeader->OptionalHeader.AddressOfEntryPoint + (PBYTE)pMemoryAddress);

BOOL InitResult = m_pDllMain((HINSTANCE)pMemoryAddress DLL_PROCESS_ATTACH 0);

if (!InitResult) //初始化失败
{
m_pDllMain((HINSTANCE)pMemoryAddress DLL_PROCESS_DETACH 0);
VirtualFree(pMemoryAddress 0 MEM_RELEASE);
m_pDllMain = NULL;
return FALSE;
}

m_bIsLoadOk = TRUE;
m_pImagebase = pMemoryAddress;
return TRUE;
}

BOOL CMemLoadDll::IsLoadOk()
{
return m_bIsLoadOk;
}

//MemGetProcAddress函数从dll中获取指定函数的地址
//返回值: 成功返回函数地址  失败返回NULL
//lpProcName: 要查找函数的名字或者序号
FARPROC CMemLoadDll::MemGetProcAddress(LPCSTR lp

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1230  2010-11-10 14:49  MemLoadDll.h

     文件        418  2010-11-09 14:33  CalcModule\CalcModule.cpp

     文件       4450  2010-11-09 14:31  CalcModule\CalcModule.dsp

     文件        543  2010-11-09 14:12  CalcModule\CalcModule.dsw

     文件        320  2010-11-09 14:32  CalcModule\CalcModule.h

     文件      48640  2010-11-09 19:25  CalcModule\CalcModule.opt

     文件       1727  2010-11-09 14:33  CalcModule\CalcModule.plg

     文件       1239  2010-11-10 14:15  CalcModule\CalcModule.sln

    ..A..H.      9728  2010-11-10 14:54  CalcModule\CalcModule.suo

     文件      11863  2010-11-10 14:15  CalcModule\CalcModule.vcproj

     文件       1637  2010-11-09 14:12  CalcModule\ReadMe.txt

     文件        297  2010-11-09 14:12  CalcModule\StdAfx.cpp

     文件        802  2010-11-09 14:12  CalcModule\StdAfx.h

     文件     452096  2010-11-10 14:10  Demo\CalcModule32.dll

     文件     548352  2010-11-10 14:15  Demo\CalcModule64.dll

     文件      35716  2010-11-10 14:28  Demo\memdll.aps

     文件       1047  2010-11-09 15:20  Demo\memdll.clw

     文件       1890  2010-11-09 15:25  Demo\memdll.cpp

     文件       4291  2010-11-03 16:22  Demo\memdll.dsp

     文件        535  2010-11-03 16:21  Demo\memdll.dsw

     文件       1324  2010-11-03 16:21  Demo\memdll.h

     文件      49664  2010-11-09 15:20  Demo\memdll.opt

     文件       1614  2010-11-09 15:20  Demo\memdll.plg

     文件       5204  2010-11-10 14:28  Demo\memdll.rc

     文件       1231  2010-11-09 15:27  Demo\memdll.sln

    ..A..H.     16384  2010-11-10 14:58  Demo\memdll.suo

     文件      14280  2010-11-10 14:29  Demo\memdll.vcproj

     文件       5944  2010-11-10 14:57  Demo\memdllDlg.cpp

     文件       1434  2010-11-10 14:29  Demo\memdllDlg.h

     文件      14209  2010-11-10 14:49  Demo\MemLoadDll.cpp

............此处省略14个文件信息

评论

共有 条评论

相关资源