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)修饰的函数
这里写图片描述

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

相关文章推荐

结构体的强制类型转换

结构体赋值遇到的一点问题

获取进程列表和模块信息

获取本地进程列表与进程模块信息

通过WINNT.H定义的结构体,获取进程IAT表

利用已定义的PE文件结构体获取本进程的IAT表

Inline Hook

Inline Hooking的实现

DLL的两种加载方式

DLL有两种调用方式 一,隐式加载(需要.lib和.dll) 二,显式加载(需要.dll)

IAT HOOK

IAT Hook的实现

内存注入之IAT Hook和Inline Hook综合程序

内存注入综合程序 1) 进程列表获取 2) IAT表项获取 3) IAT Hook 4) Inline Hook

使用IAT表注入模块到进程中 样例

模块注入到进程的方法有很多,想一一写例子,学习一下,也练习一下!         首先先从IAT表注入开始吧!         如果了解PE文件的格式的话,原理很简单。当一个模块被系统加载起来后,会遍...

DLL注入

DLL注入远程进程

Java调用C/C++编写的第三方dll动态链接库(非native API)--- JNI

注:2013年6月6日,我对该博文进行了修改,增加了源代码以及更直观详细的讲解。如果需要代码,可以到文章最后给出的链接进行下载。   最近在用weka做一个数据挖掘相关的项目,不得不说,w...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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