-
大小: 225KB文件類型: .7z金幣: 1下載: 0 次發(fā)布日期: 2021-05-31
- 語言: 其他
- 標簽: 內(nèi)存dll??
資源簡介
從資源或內(nèi)存中加載dll
代碼片段和文件信息
//?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函數(shù)從內(nèi)存緩沖區(qū)數(shù)據(jù)中加載一個dll到當前進程的地址空間,缺省位置0x10000000
//返回值:?成功返回TRUE??失敗返回FALSE
//lpFileData:?存放dll文件數(shù)據(jù)的緩沖區(qū)
//nDataLength:?緩沖區(qū)中數(shù)據(jù)的總長度
BOOL?CMemLoadDll::MemLoadLibrary(void*?lpFileData?int?nDataLength)
{
if?(m_pImagebase?!=?NULL)
{
return?FALSE;??//已經(jīng)加載一個dll,還沒有釋放,不能加載新的dll
}
//檢查數(shù)據(jù)有效性,并初始化
if?(!CheckDataValide(lpFileData?nDataLength))
{
return?FALSE;
}
//計算所需的加載空間
int?nImageSize?=?CalcTotalImageSize();
if?(nImageSize?==?0)
{
return?FALSE;
}
//?分配虛擬內(nèi)存
void?*pMemoryAddress?=?VirtualAlloc(NULL?nImageSize?MEM_COMMIT|MEM_RESERVE?PAGE_EXECUTE_READWRITE);
if?(pMemoryAddress?==?NULL)
{
return?FALSE;
}
else
{
CopyDllDatas(pMemoryAddress?lpFileData);?//復制dll數(shù)據(jù),并對齊每個段
//重定位信息
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;
}
//修改頁屬性。應該根據(jù)每個頁的屬性單獨設置其對應內(nèi)存頁的屬性。這里簡化一下。
//統(tǒng)一設置成一個屬性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
//接下來要調(diào)用一下dll的入口函數(shù),做初始化工作。
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函數(shù)從dll中獲取指定函數(shù)的地址
//返回值:?成功返回函數(shù)地址??失敗返回NULL
//lpProcName:?要查找函數(shù)的名字或者序號
FARPROC?CMemLoadDll::MemGetProcAddress(LPCSTR?lp
- 上一篇:金山詞霸破解文件
- 下一篇:c的循環(huán)首次適應算法
評論
共有 條評論