c html资源到dll,C++实现第三方资源释放与载入过程(以DLL为例)

简介

我们经常看见有一些程序开始执行时会释放一些文件,以便于后续操作。例如一些病毒为了便于传播和隐藏,经常把一些需要用的动态库或是驱动文件打包进一个可执行文件中,再由需要使用的时候,再临时释放和加载。接下来笔者就将演示如何将DLL打包进文件,并实现动态释放和加载。

实现流程

开发工具:Visual Studio 2017

1.在项目工程上点击右键,选择“添加资源”;

753dd52ddbc996cdd7ad51c6d3e3c6d8.png

2.选择"导入"项,选择“所有文件”,选择我们要导入的文件“test.dll”;

f743d2c22c2f931ebf74ab4cf3e9c355.png

3.会弹出命名自定义资源类型的对话框,自定义我们的资源类型;

a09c11c76c636cc984c5de5f7d8f19a1.png

4.点击确定后,完成导入,"Ctrl+S"保存二进制资源文件;

9f0e486b431050e102d281e78a2da981.png

5.我们可以在自动添加的“resource.h”头文件中看到我们的资源ID宏;

9764cc0535aa3c293ae54b5bea01181e.png

6.编程实现载入资源。

8874ec1d33548e87ccf0cd8a49a6e426.png

代码样例

DLL样例文件代码

//

// FileName : HelloWorldDll.cpp

// Creator : PeterZheng

// Date : 2018/11/02 11:10

// Comment : HelloWorld Test DLL ^_^

//

#include

#include

using namespace std;

BOOL WINAPI DllMain(

_In_ HINSTANCE hinstDLL,

_In_ DWORD fdwReason,

_In_ LPVOID lpvReserved

)

{

switch (fdwReason)

{

case DLL_PROCESS_ATTACH:

case DLL_PROCESS_DETACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

break;

}

return TRUE;

}

extern"C" __declspec(dllexport) VOID Func()

{

MessageBox(NULL, "HelloWorld", "Tips", MB_OK);

return;

}

EXE资源载入文件代码:

//

// FileName : LoadResource.cpp

// Creator : PeterZheng

// Date : 2018/11/02 11:10

// Comment : Load Resource Demo

//

#include

#include

#include

#include

#include "resource.h"

using namespace std;

typedef VOID(*Func)(VOID);

BOOL ReleaseLibrary(UINT uResourceId, CHAR* szResourceType, CHAR* szFileName)

{

// 找到资源

HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(uResourceId), szResourceType);

if (hRsrc == NULL)

{

MessageBox(NULL, "Find Resource Error!", "Tips", MB_OK);

return FALSE;

}

// 获取资源大小

DWORD dwSize = SizeofResource(NULL, hRsrc);

if (dwSize <= 0)

{

MessageBox(NULL, "Get Resource Error!", "Tips", MB_OK);

return FALSE;

}

// 载入资源

HGLOBAL hGlobal = LoadResource(NULL, hRsrc);

if (hGlobal == NULL)

{

MessageBox(NULL, "Load Resource Error!", "Tips", MB_OK);

return FALSE;

}

// 锁定资源,并返回指向资源第一字节的指针

LPVOID lpRes = LockResource(hGlobal);

if (lpRes == NULL)

{

MessageBox(NULL, "Lock Resource Error!", "Tips", MB_OK);

return FALSE;

}

HANDLE hFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == NULL)

{

MessageBox(NULL, "Create File Error!", "Tips", MB_OK);

return FALSE;

}

DWORD dwWriten = 0;

BOOL bRes = WriteFile(hFile, lpRes, dwSize, &dwWriten, NULL);

if (bRes == FALSE || dwWriten <= 0)

{

MessageBox(NULL, "Write To File Error!", "Tips", MB_OK);

return FALSE;

}

CloseHandle(hFile);

CloseHandle(hGlobal);

CloseHandle(hRsrc);

return TRUE;

}

int APIENTRY WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)

{

BOOL bRes = ReleaseLibrary(IDR_TESTRES1, (CHAR*)"TESTRES", (CHAR*)"test.dll");

if (bRes == FALSE)

{

MessageBox(NULL, "Release DLL Error!", "Tips", MB_OK);

return 0;

}

HMODULE hModule = LoadLibrary("test.dll");

if (hModule == NULL)

{

MessageBox(NULL, "Load Library Error!", "Tips", MB_OK);

return 0;

}

Func fc = (Func)GetProcAddress(hModule, "Func");

if (fc == NULL)

{

MessageBox(NULL, "GetProcAddress Error!", "Tips", MB_OK);

return 0;

}

fc();

FreeLibrary(hModule);

return 0;

}

C&num;嵌入dll到资源释放的问题

有些程序运行的时候,可能调用外部的dll,用户使用时可能会不小心丢失这些dll,导致程序无法正常运行,因此可以考虑将这些dll嵌入到资源中,启动时自动释放.对于托管的dll,我们可以用打包软件合成一个 ...

基于webrtc的资源释放问题(二)

基于webrtc的资源释放问题(二) ——建立连接的过程中意外中断 应用背景: 我们在打电话的时候会不会遇到这种情况?打电话的时候未接通之前挂掉了电话,或者在接通之后建立的连接的过程中挂掉电话? 特别 ...

基于webrtc的资源释放问题(一)

基于webrtc的资源释放问题(一) ——重复释放webrtc的相关资源 背景: 视频通讯大都只是作为一个功能存在于各种应用中,比如微信,qq .既然只是应用的一部分,这样就涉及反复的开启和关闭视频通 ...

jvm载入过程

类载入过程 类从被载入到虚拟机内存中開始,到卸载出内存为止,它的整个生命周期包含:载入.验证.准备.解析.初始化.使用和卸载七个阶段.它们開始的顺序例如以下图所看到的: 当中类载入的过程包含了载入.验 ...

C&num;资源释放

转自:http://www.cnblogs.com/psunny/archive/2009/07/07/1518812.html 深刻理解C#中资源释放 今天我的一个朋友看到我写的那篇

TList&comma;TObjectList 使用——资源释放

TOjectList = Class (Tlist); TOjectList继承Tlist,从名字上看就可以知道它是专门为对象列表制作的,那么他到底丰富了那些功能呢? 首先是 TObject 作为对象 ...

Delphi中关于资源释放&lpar;Free&comma;Relealse&comma;FreeAndNil&rpar;

根据日常编程经验,得出一些Delphi中关于资源释放的体会. 假如有对象Obj为TObject类型: 1) Obj.Free直接释放资源后,调用OnDestroy事件,但是没有将Obj指针值置为Nil ...

发现第三方资源,chrome控制台

for(var i=0,tags=document.querySelectorAll('iframe[src],frame[src],script[src],link[rel=stylesheet], ...

深刻理解C&num;中资源释放

今天我的一个朋友看到我写的那篇时,给我指出了点小毛病.就是在用户登录时,如果用户登录失败,在下面这段代码中,都会new出来一个User对象,如果连续登录失败 ...

随机推荐

Docker-2&colon;network containers

docker run -d -P --name web training/webapp python app.py # -name means give the to-be-run container ...

php面向对象常见的专业术语

类 − 定义了一件事物的抽象特点.类的定义包含了数据的形式以及对数据的操作. 对象 − 是类的实例. 成员变量 − 定义在类内部的变量.该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化 ...

bzoj 1493 暴力

我们可以枚举每个点,然后求出这个点到其余点最小消耗的代价,求出比t小的且距离最大的更新答案. /**************************************************** ...

Arcgis9&period;3下栅格数据的坐标转换出错

Arcgis9.3下栅格数据的坐标转换出错 在win7系统下的arcgis9.3,使用toolbox里raster project工具总是出错,后来打了sp1补丁就没问题了,想不到arcgis还有这样 ...

ZOJ 3829 Known Notation 贪心

Known Notation Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showPro ...

BZOJ 1629&colon; &lbrack;Usaco2007 Demo&rsqb;Cow Acrobats

Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...

汉高澳大利亚sinox为什么不能下载源代码,因为sinox执行unix&sol;linux&sol;windows规划

中国用户下载真正的澳大利亚sinox说完后sinox没有下载源代码. 这意味着,类似linux如下载linux 开源安装. 要知道.sinox并非linux. 首先,sinox是商业操作系统,就像 w ...

python通过openpyxl操作excel

python 对Excel操作常用的主要有xlwt.xlrd.openpyxl ,前者xlwt主要适合于对后缀为xls比较进行写入,而openpyxl主要是针对于Excel 2007 以上版本进行操作 ...

玩转EhCache之最简单的缓存框架

二.主要特性 快速: 简单: 多种缓存策略: 缓存数据有两级:内存和磁盘,因此无需担心容量问题: 缓存数据会在虚拟机重启的过程中写入磁盘: 可以通过 RMI.可插入 API 等方式进行分布式缓存: 具 ...

SpringMvc配置扫包之后,访问路径404问题解决

场景: 1. 配置了Spring和SpringMvc, Spring管理非Controller类的Bean, SpringMvc管理涉及的Controller类 2. web.xml已经配置了Spri ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值