延迟加载库的应用:Dll嵌入可执行文件中

    搜索到一篇英文文章:Packing Dlls into your exe 文章大意是把dll文件嵌入到可执行文件的资源表中,用延迟加载方式编译链接可执行文件。由于所依赖的dll在正式调用时才被加载,因此能顺利的通过链接阶段。Exe正式运行时,先搜索文件资源表,获得嵌入到资源区中dll并保存到磁盘,然后调用。调用完卸载和删除该Dll。我也顺着这个思路做了一遍,记录于此。

    要嵌入dll,首先要生成一个测试用的dll,导出接口如下:

    然后生成调用该Dll的工程,因为用到延迟加载方式,因此,工程属性要做一些设置:

编译通过了,但是运行会出错,因为工程目录下并没有resourceDll.dll这个文件,同时,代码中也并没有显示的处理加载失败时的异常。

    接下来是嵌入Dll到资源节中,其实吧,嵌入一个dll然后加载运行有点屈才了。完全可以嵌入一个sys文件然后调用LoadDriver。

    在工程文件中:添加资源-导入-所有类型文件-选择资源文件->命名资源类型

最后是搜索资源并写入到磁盘:

#include "stdafx.h"
#include "resourceDll.h"
#include "resource.h"
#include <windows.h>
#include <winuser.h>

int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hThis =  GetModuleHandle(NULL);  
    HRSRC   hRes  =  FindResource(hThis, MAKEINTRESOURCE(IDR_DLL1), _T("dll"));
    HGLOBAL hGres =  LoadResource(hThis, hRes); 
 
    // 创建一个临时的dll文件,文件路径与exe运行目录一致。
    HANDLE  hFile = CreateFile(_T("resourceDll.dll"), GENERIC_WRITE, NULL, NULL, 
                               CREATE_NEW, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_ARCHIVE, NULL); 
 
    // 将dll资源文件写入临时创建的dll文件中。
    PVOID   pRes  =  LockResource(hGres);
    DWORD  dwSize =  SizeofResource(NULL, hRes); 
    DWORD dwSizeWritten = 0;  
    WriteFile(hFile, pRes, dwSize, &dwSizeWritten, NULL);  
    CloseHandle(hFile); 
    
    resourceDll();
    return 0;
}
如此,就可以做到隐藏Dll文件的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值