逆向基础学习 C++编写dll文件 编写导出函数
一、创建DLL文件
利用VS2017新建dll项目,得到三个cpp文件
其中dll1.cpp定义dll文件的导出函数
核心入口函数:dllmain.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
//核心入口函数 DLL文件 动态链接库入口函数
BOOL APIENTRY DllMain( HMODULE hModule,
//DLL模块的句柄
DWORD ul_reason_for_call,
//DLLMain函数被调用的原因
LPVOID lpReserved
//保留项,也就是Windows的保留参数。
//保留参数:不是不使用的参数,而是Windows不想让我们指导作用的参数
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//当DLL被进程加载时DLLMain被调用
case DLL_THREAD_ATTACH:
//有线程被创建时DLLMain被调用
case DLL_THREAD_DETACH:
//有线程结束时DLLMain被调用
case DLL_PROCESS_DETACH:
//当DLL被进程卸载时DLLMain被调用
break;
}
return TRUE;
}
因为DLLMain函数不止一次的被调用,每次调用可能执行不同的代码,比如进程加载dll时,可能在DLL中要申请一些资源,在进程卸载DLL时,DLL则要释放自己申请的资源。
例1:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
VOID aaa(){
}
VOID over(){
}
//核心入口函数 DLL文件 动态链接库入口函数
BOOL APIENTRY DllMain( HMODULE hModule,
//DLL模块的句柄
DWORD ul_reason_for_call,
//DLLMain函数被调用的原因
LPVOID lpReserved
//保留项,也就是Windows的保留参数。
//保留参数:不是不使用的参数,而是Windows不想让我们指导作用的参数
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//当DLL被进程加载时DLLMain被调用
aaa();
case DLL_THREAD_ATTACH:
//有线程被创建时DLLMain被调用
case DLL_THREAD_DETACH:
//有线程结束时DLLMain被调用
case DLL_PROCESS_DETACH:
//当DLL被进程卸载时DLLMain被调用
over();
break;
}
return TRUE;
}
二、导出函数的编写
导出:提供给外界调用
一、extern “C”
//声明导出函数->把这个ccc函数导出去
extern "C" __declspec(dllexport) void ccc();
//用作导出的函数
void ccc() {
}
在dllmain.cpp里加上以上代码,声明ccc()为导出函数
生成之后dll文件夹里会出现以下文件:
extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码,加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名,而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern “C”就是其中一个策略。就是防止编译后的函数名被编译器修改或者粉碎。
所以extern “C”主要用在以下的情况:
- C++代码调用C语言代码
- 在C++的头文件中使用
二、 __declspec(dllexport)
声明导出函数,将该函数从本DLL开放提供给其他应用程序组使用
Dllexport、Dllimport参考https://docs.microsoft.com/zh-cn/cpp/cpp/dllexport-dllimport?view=vs-2017
__declspec参考https://docs.microsoft.com/zh-cn/cpp/cpp/declspec?view=vs-2017
用于指定存储类信息使用的扩展的特性语法 __declspec关键字,这指定给定类型的实例是与下面列出特定于 Microsoft 的存储类特性一起存储。Dllexport并dllimport存储类特性是 C 和 c + + 语言的 Microsoft 专用扩展。 可以使用它们从 DLL 中导出或向其中导入函数、数据和对象。
还没有评论,来说两句吧...