91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 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

評論

共有 條評論