合并 DLL
2006-07-20 11:39:58 来源:WEB开发网核心提示: DWORD UnloadPbDllFromMemory(PIMAGE_DOS_HEADER dosHeader){PIMAGE_NT_HEADERS pNTHeader;pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + (DWORD)do
DWORD UnloadPbDllFromMemory(PIMAGE_DOS_HEADER dosHeader)
{
PIMAGE_NT_HEADERS pNTHeader;
pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + (DWORD)dosHeader->e_lfanew);
EntryPoint = (LPENTRYPOINT)(pNTHeader->OptionalHeader.AddressOfEntryPoint +
(DWORD)dosHeader);
EntryPoint((HINSTANCE)dosHeader, DLL_PROCESS_DETACH, 0);
return VirtualFree(dosHeader, 0, MEM_RELEASE);
}
关于示例代码的说明
在本文附带的示例代码中,合并了一个名为 hardware.dll 的动态连接库,该动态连接库是一个获取系统硬件信息的库文件,其中包括了以下函数:
getmac 取得网卡 MAC
VolumeNumber 取得硬盘卷标
changeres 改变屏幕分辩率
IsDiskInDrive 检查软驱中是否插有盘
DPGetDefaultPrinter 取得默认的打印机名
DPSetDefaultPrinter 设置默认的打印机
getserial 取得硬盘的出厂序列号
getmetric 取得显示分辩率
PrintStringDirect 直接向打印机发送一个串
vfpbeep 让 PC 喇叭发声
getcpuid 取得 CPU ID
getbios 取得主板 BIOS ID
在示例代码中,只调用了其中一个函数 getbios 来获取主板 BIOS ID, 这里说明一下,该函数实际上好象只能检测 AWARD 主板的 BIOS, 也就是说它是读取的是系统内存 0x000fex71 处的值。因为其它牌子的主板 BIOS 的位置稍有不同,但在程序中没有进行这方面的处理,所以在读其它牌子的主板 BIOS 时可能会有些问题(读出的内容可能不正确)。关于此 DLL 的内容和实现,也许我会在另一篇文章中论及。
局限
在我进行测试时,发现对于有些含有资源的 DLL,在 9x 平台下可能会有问题。
题外话
另外,其它一些本文未提及的非主要的函数,请自行参见源代码中的注释。
再,本文涉及 PE 文件格式方面的知识,它们已经超出了本文的范围,具体信息可参见 MSDM 中的:
特别感谢卢春明(Aming)在我编写本文时所作的一些技术方面的建议和指导
- ››合并重载和停止 - 节约Firefox工具栏的空间
- ››DLL(Dynamic Link Libraries)专题
- ››合并聊天窗口 阿里旺旺 2008下载
- ››合并两个带头结点的有序循环链表合并为一个带头结...
- ››DLL文件基本原理及修改方法和通过改DLL来美化系统...
- ››DLL头文件的格式和应用
- ››DLL初学者指南(非MFC)
- ››DLL(Dynamic Link Libraries)全面剖析
- ››合并 DLL
- ››DLL的远程注入技术
- ››DLL(Dynamic Link Libraries)全面剖析(2)
- ››DLL(Dynamic Link Libraries)全面剖析(3)
更多精彩
赞助商链接