简介
我们经常看见有一些程序开始执行时会释放一些文件,以便于后续操作。例如一些病毒为了便于传播和隐藏,经常把一些需要用的动态库或是驱动文件打包进一个可执行文件中,再由需要使用的时候,再临时释放和加载。接下来笔者就将演示如何将DLL打包进文件,并实现动态释放和加载。
实现流程
开发工具:Visual Studio 2017
1.在项目工程上点击右键,选择“添加资源”;
2.选择"导入"项,选择“所有文件”,选择我们要导入的文件“test.dll”;
3.会弹出命名自定义资源类型的对话框,自定义我们的资源类型;
4.点击确定后,完成导入,"Ctrl+S"保存二进制资源文件;
5.我们可以在自动添加的“resource.h”头文件中看到我们的资源ID宏;
6.编程实现载入资源。
代码样例
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#嵌入dll到资源释放的问题
有些程序运行的时候,可能调用外部的dll,用户使用时可能会不小心丢失这些dll,导致程序无法正常运行,因此可以考虑将这些dll嵌入到资源中,启动时自动释放.对于托管的dll,我们可以用打包软件合成一个 ...
基于webrtc的资源释放问题(二)
基于webrtc的资源释放问题(二) ——建立连接的过程中意外中断 应用背景: 我们在打电话的时候会不会遇到这种情况?打电话的时候未接通之前挂掉了电话,或者在接通之后建立的连接的过程中挂掉电话? 特别 ...
基于webrtc的资源释放问题(一)
基于webrtc的资源释放问题(一) ——重复释放webrtc的相关资源 背景: 视频通讯大都只是作为一个功能存在于各种应用中,比如微信,qq .既然只是应用的一部分,这样就涉及反复的开启和关闭视频通 ...
jvm载入过程
类载入过程 类从被载入到虚拟机内存中開始,到卸载出内存为止,它的整个生命周期包含:载入.验证.准备.解析.初始化.使用和卸载七个阶段.它们開始的顺序例如以下图所看到的: 当中类载入的过程包含了载入.验 ...
C#资源释放
转自:http://www.cnblogs.com/psunny/archive/2009/07/07/1518812.html 深刻理解C#中资源释放 今天我的一个朋友看到我写的那篇
TList,TObjectList 使用——资源释放
TOjectList = Class (Tlist); TOjectList继承Tlist,从名字上看就可以知道它是专门为对象列表制作的,那么他到底丰富了那些功能呢? 首先是 TObject 作为对象 ...
Delphi中关于资源释放(Free,Relealse,FreeAndNil)
根据日常编程经验,得出一些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#中资源释放
今天我的一个朋友看到我写的那篇时,给我指出了点小毛病.就是在用户登录时,如果用户登录失败,在下面这段代码中,都会new出来一个User对象,如果连续登录失败 ...
随机推荐
Docker-2: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.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: [Usaco2007 Demo]Cow Acrobats
Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...
汉高澳大利亚sinox为什么不能下载源代码,因为sinox执行unix/linux/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 ...