DLL的编写
2016-05-31 19:35
155 查看
前段时间做了个内存注入程序,刚开始用的是dll注入,后面改成了直接注入代码..东西做好了,一直没更新博客.现在补上
注 : 转载请注明来源 enjoy5512的博客 http://blog.csdn.net/enjoy5512
通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个记账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,您可能具有一个工资计算程序,而税率每年都会更改。当这些更改被隔离到 DLL 中以后,您无需重新生成或安装整个程序就可以应用更新。
先建立一个空的动态链接库工程
![](http://img.blog.csdn.net/20160531183105898)
然后新建一个头文件dllDemo.h,文件内容如下
然后新建一个c语言文件dllDemo.c
然后再编译. 可以看到生成了dllDemo.dll 和 dllDemo.lib两个文件(dll具体用法请看下一篇文章<< dll的两种调用方式 >>).到此,一个最简单的dll文件就编写好了.使用vc自带的dumpbin可以查看dll的导出函数
从命令行到dll所在目录,使用dumpbin -exports dllDemo.dll查看dll导出函数. 可以看到dll的导出表里有__declspec(dllexport)修饰的函数
注 : 转载请注明来源 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)修饰的函数
相关文章推荐
- FREEBASIC 编译可被python调用的dll函数示例
- DLL(Dynamic Linkable Library) 详解说明
- delphi中一个值得大家来考虑的DLL问题
- 将ocx文件转换成C#程序引用的DLL文件的办法
- C++与C#互调dll的实现步骤
- C++调用C#的DLL实现方法
- 自己写的文件操作的function和Sub vb.net dll
- C# 调用C++写的dll的实现方法
- 使用 JScript 创建 .exe 或 .dll 文件的方法
- 深入解析JVM对dll文件和对类的装载过程
- c#中xml文档注释编译dll引用到其它项目示例
- .dll 文件反编译的工具软件集合
- C#调用C++版本dll时的类型转换需要注意的问题小结
- java使用JNA(Java Native Access)调用dll的方法
- Python 调用DLL操作抄表机
- ASP.NET/C#中如何调用动态链接库DLL
- C#调用Matlab生成的dll方法的详细说明
- C#将dll打包到程序中的具体实现
- VC程序在Win32环境下动态链接库(DLL)编程原理