实例介绍
【实例截图】
【源码目录】
MemLoadDll
├── CalcModule
│ ├── CalcModule.cpp
│ ├── CalcModule.dsp
│ ├── CalcModule.dsw
│ ├── CalcModule.h
│ ├── CalcModule.opt
│ ├── CalcModule.plg
│ ├── CalcModule.sln
│ ├── CalcModule.suo
│ ├── CalcModule.vcproj
│ ├── ReadMe.txt
│ ├── StdAfx.cpp
│ └── StdAfx.h
├── Demo
│ ├── Backup
│ │ ├── memdll.sln
│ │ └── memdll.v12.suo
│ ├── CalcModule32.dll
│ ├── CalcModule64.dll
│ ├── MemLoadDll.cpp
│ ├── MemLoadDll.h
│ ├── ReadMe.txt
│ ├── StdAfx.cpp
│ ├── StdAfx.h
│ ├── UpgradeLog.htm
│ ├── ipch
│ │ └── memdll-34b9df56
│ │ └── debug
│ │ ├── memdll-3c3810e4.ipch
│ │ └── memdll-8ccb9c22.ipch
│ ├── memdll.aps
│ ├── memdll.clw
│ ├── memdll.cpp
│ ├── memdll.dsp
│ ├── memdll.dsw
│ ├── memdll.h
│ ├── memdll.opt
│ ├── memdll.plg
│ ├── memdll.rc
│ ├── memdll.sln
│ ├── memdll.suo
│ ├── memdll.v12.suo
│ ├── memdll.vcproj
│ ├── memdll.vcxproj
│ ├── memdll.vcxproj.filters
│ ├── memdllDlg.cpp
│ ├── memdllDlg.h
│ ├── res
│ │ ├── memdll.ico
│ │ └── memdll.rc2
│ └── resource.h
├── MemLoadDll.cpp
└── MemLoadDll.h
7 directories, 46 files
【核心代码】
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;
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论