C++实现第三方资源释放与载入过程(以DLL为例)
简介
我们经常看见有一些程序开始执行时会释放一些文件,以便于后续操作。例如一些病毒为了便于传播和隐藏,经常把一些需要用的动态库或是驱动文件打包进一个可执行文件中,再由需要使用的时候,再临时释放和加载。接下来笔者就将演示如何将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 <iostream>
#include <Windows.h>
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 <iostream>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
#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为例)的更多相关文章
- C#嵌入dll到资源释放的问题
有些程序运行的时候,可能调用外部的dll,用户使用时可能会不小心丢失这些dll,导致程序无法正常运行,因此可以考虑将这些dll嵌入到资源中,启动时自动释放.对于托管的dll,我们可以用打包软件合成一个 ...
- 基于webrtc的资源释放问题(二)
基于webrtc的资源释放问题(二) ——建立连接的过程中意外中断 应用背景: 我们在打电话的时候会不会遇到这种情况?打电话的时候未接通之前挂掉了电话,或者在接通之后建立的连接的过程中挂掉电话? 特别 ...
- 基于webrtc的资源释放问题(一)
基于webrtc的资源释放问题(一) ——重复释放webrtc的相关资源 背景: 视频通讯大都只是作为一个功能存在于各种应用中,比如微信,qq .既然只是应用的一部分,这样就涉及反复的开启和关闭视频通 ...
- jvm载入过程
类载入过程 类从被载入到虚拟机内存中開始,到卸载出内存为止,它的整个生命周期包含:载入.验证.准备.解析.初始化.使用和卸载七个阶段.它们開始的顺序例如以下图所看到的: 当中类载入的过程包含了载入.验 ...
- DLL延时加载技术与资源释放
DLL延时加载技术与资源释放 0x00 前言 诸如调用非Windows的第三方库,我们或许会使用到dll文件,而这个时候原本程序运行需要相应的dll文件才能加载启动.通过DLL延时加载技术,使用延时加 ...
- Window黑客编程之资源释放技术
前言 今天说一下写病毒木马会广泛使用的一种技术--资源释放技术.为什么我们在写木马时会使用到资源释放技术呢?这是因为它可以使我们写的程序变得简洁.如果程序需要额外加载一些DLL文件或者文本文件,我们可 ...
- C#资源释放
转自:http://www.cnblogs.com/psunny/archive/2009/07/07/1518812.html 深刻理解C#中资源释放 今天我的一个朋友看到我写的那篇<C#中用 ...
- TList,TObjectList 使用——资源释放
TOjectList = Class (Tlist); TOjectList继承Tlist,从名字上看就可以知道它是专门为对象列表制作的,那么他到底丰富了那些功能呢? 首先是 TObject 作为对象 ...
- Delphi中关于资源释放(Free,Relealse,FreeAndNil)
根据日常编程经验,得出一些Delphi中关于资源释放的体会. 假如有对象Obj为TObject类型: 1) Obj.Free直接释放资源后,调用OnDestroy事件,但是没有将Obj指针值置为Nil ...
随机推荐
- zookeeper实现动态感知服务器上下线
在实际的生产环境中我们一般都是集群环境部署的,同一个程序我们会部署在相同的几台服务器中,这时我们可以通过负载均衡服务器去调度,但是我们并不能很快速的获知哪台服务器挂掉了,这时我们就可以使用zook ...
- Spring Boot 设置静态资源访问
问题描述 当使用spring Boot来架设服务系统时,有时候也需要用到前端页面,当然就不可或缺地需要访问其他一些静态资源,比如图片.css.js等文件.那么如何设置Spring Boot网站可以访问 ...
- SVN 安装后右键出现点击鼠标右键弹出错误提示:CrashHandler initialization error
SVN 安装后右键出现点击鼠标右键弹出错误提示:CrashHandler initialization error 原因是目标文件夹中缺少SendRpt.exe文件 解决方案:找svn是好的的同事将b ...
- mybatis_08 mybatis与hibernate的区别
这个问题常常被面试官当做面试题 mybatis与hibernate喜忧参半,各有特点 Mybatis技术特点: 好处: 1. 通过直接编写SQL语句,可以直接对SQL进行性能的优化: 2. 学习门 ...
- SpringBoot登录登出切面开发
阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本. 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验, ...
- 输出映射resultMap
①:编写接口方法 /** * 根据id查询用户 * @param id * @return */ public User queryUserById3(Integer id); ②:编写映射文件 1: ...
- date('Y-m-d H:i:s',time()) 与 date('Y-m-d h:i:s',time())区别是什么
date('Y-m-d H:i:s',time()) 按24小时制 date('Y-m-d h:i:s',time()) 按12小时制
- 【代码笔记】Web-JavaScript-javascript while循环
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- -moz、-ms、-webkit浏览器前缀解释(PS:后续在详细解释)
-moz-是Firefox Gecko内核,moz代表的是Firefox的开发商Mozill -ms代表ie浏览器私有属性 -webkit代表safari.chrome私有属性
- vue-cil和webpack中本地静态图片的路径问题解决方案
1 本地图片动态绑定img的src属性 一般我们在html中或者vue组件文件中引用图片是这样,这是不需要做特别处理的 我们将图片放入assets中或者重新建立个文件夹img什么的都可以,随意- 但是 ...