如何编写DLL文件

如何编写DLL文件

阅读本文请首先学习C++以及C语言的使用,这是基础

什么是dll文件

DLL文件: 中文翻译为动态链接库,windows系统程序提供了很多的可以被调用的可执行文件,就像我们软件开发的时候,从来没有自己去写一个程序的图形化界面什么的,这是因为Windows系统都给我们提供了,我们只需要去调用就可以使用了。比如我们经常看到的kernel32.dll(包含管理内存,进程和线程相关的函数),User32.dll(大部分是用户接口函数)。

主要是如果步提供dll文件的话那么很多应用和开发者就得自己去编写底层的代码,这将会给软件开发者带来很大的困难。

如何创建dll文件

本人使用的VS进行构建,本人比较建议使用VS进行windows代码开发,毕竟是微软自己开发的编译器。

新建项目,选择新建dll项目

如何编写DLL文件_第1张图片

这样就算创建了一个dll文件,至于里面的是什么东西,我们也不用管,只需要知道我们的代码都是在dllmain.cpp里面编写就可以了,dll生成的方法也根普通的C++文件不一样,我们直接在DLL项目中右键,然后点击生成就可以了。

如何编写DLL文件_第2张图片

我们就可以发现生成了一个dll文件

dll文件代码简单介绍

我们VS自动帮我们生成了一些代码,简单介绍以下这些代码都是干啥用的

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

DllMain函数

静态链接或者动态链接(LoadLibrary调用等)都会调用DllMain这个函数,我们可以通过以下的四个情况来判断是何时使用这个dllmain函数

  1. DLL_PROCESS_ATTACH:这个是dllmain文件被映射到地址空间时才会被调用的,也就是只有第一次被调用时才会运行这一段
  2. DLL_PROCESS_DETACH:当DLL被从进程的地址空间解除映射时
  3. DLL_THREAD_ATTACH:这个是进程创建线程的时候
  4. DLL_THREAD_DETACH:这是线程结束时调用的

一个简单实例

我们计划用Dll文件下载一个html网页

这是我们在dllmain中的代码

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include
#include "stdio.h"


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    printf("dll load\n");
}

我们可以生成得到一个dll文件,然后我们要想办法调用这个文件

#include "windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
    HMODULE  g_hDll = LoadLibrary("D:\\Code\\source\\repos\\DLLStudy\\Debug\\DLLStudy.dll");
    return 0;
}

因为我把这个dll文件中的switch给删了,所以不管是哪种调用都会执行这个printf函数,所以我们会发现这个一共被调用了两次。

如何编写DLL文件_第3张图片

ok这就是dll调用的一个简单操作,希望可以帮到你

Hope this blog can help you!

你可能感兴趣的:(逆向,windows,microsoft,c++)