DLL的编写

原创 2016年05月31日 19:35:54

前段时间做了个内存注入程序,刚开始用的是dll注入,后面改成了直接注入代码..东西做好了,一直没更新博客.现在补上
注 : 转载请注明来源 enjoy5512的博客 http://blog.csdn.net/enjoy5512

DLL简介

  DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
  通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个记账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
  此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。

一个最简单的DLL实现

编译环境 : window xp sp3 + VC6.0


先建立一个空的动态链接库工程
这里写图片描述


然后新建一个头文件dllDemo.h,文件内容如下

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

#define DLLEXPORT __declspec(dllexport)
#define DLLIMPORT __declspec(dllimport)

DLLEXPORT void exportSwap(int *piA, int *piB);

然后新建一个c语言文件dllDemo.c


#include "dllDemo.h"

//函数说明开始
    //==================================================================================
    //  功能 : DLL文件的入口函数
    //  参数 : HANDLE hMoudle, DWORD dwReason, void *lpReserved
    //  hMoudle     : 这个参数是该DLL实例的句柄,也就是此DLL映射到进程地址空间后,在该进程地址空间中的位置
    //  dwReason    : 此参数标示了调用DllMain函数的原因。有四种值,就是函数中case后的取值。
    //  lpReaserved : 保留。
    //  返回 : 无
    //  日期 : 2016年5月31日 19:15:16(注释日期)
    //==================================================================================
    //函数说明结束
BOOL APIENTRY DllMain(HANDLE hMoudle, DWORD dwReason, void *lpReserved)
{
    //DLL入口函数

    //DLL消息处理
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH :  //DLL第一次加载到进程空间
        MessageBox(NULL,"进程中加载DLL","提示",0);
    case DLL_PROCESS_DETACH :  //DLL从进程空间卸载
        MessageBox(NULL,"进程中卸载DLL","提示",0);
    case DLL_THREAD_ATTACH :   //线程创建时,调用DLL
        MessageBox(NULL,"线程中加载DLL","提示",0);
    case DLL_THREAD_DETACH :   //线程退出时卸载DLL
        MessageBox(NULL,"线程中卸载DLL","提示",0);
    }

    return TRUE;
}

    //函数说明开始
    //==================================================================================
    //  功能 : 替换输入的两个变量的值
    //  参数 : int *piA, int *piB
    //  (入口)  无
    //  (出口)  piA : 输入的第一个变量
    //          piB : 输入的第二个变量
    //  返回 : 无
    //  主要思路 : 先保存第一个变量的值,然后将第二个变量的值赋值给第一个变量,再将保持的
    //             第一个变量的值赋值给第二个变量,采用址传参
    //  调用举例 : int a = 1;
    //             int b = 2;
    //              exportSwap(&a, &b);
    //  日期 : 2016年5月31日 19:19:12(注释日期)
    //==================================================================================
    //函数说明结束
DLLEXPORT void exportSwap(int *piA, int *piB)
{
    int temp = *piA;

    *piA = *piB;
    *piB = temp;
}

    //函数说明开始
    //==================================================================================
    //  功能 : 替换输入的两个变量的值,因为没有 __declspec(dllexport)修饰,所以这个函数
    //         只能用作dll内部使用,不产生导出符号
    //  参数 : int *piA, int *piB
    //  (入口)  无
    //  (出口)  piA : 输入的第一个变量
    //          piB : 输入的第二个变量
    //  返回 : 无
    //  主要思路 : 先保存第一个变量的值,然后将第二个变量的值赋值给第一个变量,再将保持的
    //             第一个变量的值赋值给第二个变量,采用址传参
    //  调用举例 : int a = 1;
    //             int b = 2;
    //              exportSwap(&a, &b);
    //  日期 : 2016年5月31日 19:21:20(注释日期)
    //==================================================================================
    //函数说明结束
void Swap(int *piA, int *piB)
{
    int temp = *piA;

    *piA = *piB;
    *piB = temp;
}

然后再编译. 可以看到生成了dllDemo.dll 和 dllDemo.lib两个文件(dll具体用法请看下一篇文章<< dll的两种调用方式 >>).到此,一个最简单的dll文件就编写好了.使用vc自带的dumpbin可以查看dll的导出函数

从命令行到dll所在目录,使用dumpbin -exports dllDemo.dll查看dll导出函数. 可以看到dll的导出表里有__declspec(dllexport)修饰的函数
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

DLL编写及注意点

本文
  • u013506600
  • u013506600
  • 2014年02月01日 22:39
  • 826

dll教程1:如何编写dll,一步一步,全部可行

在大学大一的时候学的是C,然后后来大二的时候专业又开了C++这个课程,然后再后来自己又自学了一点VC++,大三的时候也试着编写过一个MFC的最简单的窗口程序。到大四的时候,自己又做了一个GIS的项目,...
  • qq_23100787
  • qq_23100787
  • 2016年04月25日 11:40
  • 6382

如何用VS2013编写DLL

本人也是一个菜鸟一个,最近学习APi也是磕磕绊绊,这是一篇针对新手的入门教程。下面我用的例子来自于冀云所著的《c++黑客编程揭秘与防范》....
  • dnirubevieru
  • dnirubevieru
  • 2016年03月28日 19:35
  • 2384

VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

本文将创建一个简单的动态链接库,并编写一个应用台控制程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,只是项目及文件名称不同。创建动态链接库项目:...
  • testcs_dn
  • testcs_dn
  • 2014年05月27日 22:46
  • 24774

VS 编写c++dll库文件

什么是DLL(动态链接库)? DLL是一个包含可由多个程序同时使用的代码和数据的库。例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数。因此,每个程序都可以使用...
  • u013435183
  • u013435183
  • 2015年08月03日 08:45
  • 3597

Dll制作与使用教程一

被dll折腾了很长一段时间,现在终于清楚了,现把dll的编写和使用方法进行梳理一下,分享给大家,也方便自己以后随时查询。 一. dll为什么会出现 我们在编写好一个系统软件后,有时需要更新该软件的某一...
  • EnglishGe
  • EnglishGe
  • 2015年11月12日 10:01
  • 3917

C++编程笔记:dll的生成与使用

1.动态链接库(dll)概述没接触dll之前觉得它很神秘,就像是一个黑盒子,既不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其他dll调用来完成某项工作的函数,只有在其他...
  • elaine_bao
  • elaine_bao
  • 2016年06月29日 19:24
  • 5426

VC++ MFC DLL动态链接库编写详解

虽然能用DLL实现的功能都可以用COM来替代,但DLL的优点确实不少,它更容易创建。本文将讨论如何利用VC MFC来创建不同类型的DLL,以及如何使用他们。 一、DLL的不同类型     使用...
  • thanklife
  • thanklife
  • 2016年09月02日 16:01
  • 2661

DLL接口的实现(COM结构思想)一

DLL接口的实现(COM结构思想)一 说到COM,我们先来看下大神对 OpenGL vs D3D 的看法: 早期的OpenGL 1.0的接口定义是C-Style的,这种API定义风格比较僵化,在扩展时...
  • u011599942
  • u011599942
  • 2013年09月06日 14:54
  • 1630

第一个DLL程序:动态链接库DLL教程,30分钟快速上手

DLL 程序的入口函数是 DllMain(),就像 DOS 程序的入口函数是 main()、Win32 程序的入口函数是 WinMain() 一样。前面我们一直在讲的就是DOS程序。 DllMa...
  • shuimanting520
  • shuimanting520
  • 2016年05月07日 07:44
  • 1455
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DLL的编写
举报原因:
原因补充:

(最多只允许输入30个字)