VC++环境下动态链接库的开发及应用
for(k = 0; k < r; k++) {
for(j = 0; j < 1 << k; j++) {
bfsize = 1 << (r-k); for(i = 0; i < bfsize / 2; i++) {
p = j * bfsize;
X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1< // 重新排序 for(j = 0; j < count; j++) { p = 0; for(i = 0; i < r; i++) { if (j&(1< p+=1<<(r-i-1); } } FD[j]=X1[p]; } // 释放内存 delete W; delete X1; delete X2; } 33 VC++环境下动态链接库的开发及应用 既然有了FFT这个函数,我们要把它做在DLL中,作为DLL的一个接口将是十分简单的,其步骤如下: (1)利用MFC向导建立一个非MFC DLL; (2)在工程中添加fft.h和fft.cpp两个文件; fft.h的源代码为: #ifndef FFT_H #define FFT_H #include fft.cpp的源代码为: /* 文件名:fft.cpp */ #include \void __stdcall FFT(complex 在任何编程语言中使用Win32 API LoadLibrary都可以加载这个DLL,而使用GetProcAddress(hDll, \则可以获得函数FFT的地址。 这个DLL中有两点需要注意: (1)使用extern \修饰函数声明,否则,生成的DLL只能供C++调用; (2)使用__stdcall修饰函数声明及定义,__stdcall是Windows API的函数调用方式。 5.2. 纯资源DLL 我们可以从DLL中获取资源,对于一个支持多种语言的应用程序而言,我们可以判断操作系统的语言,并自动为应用程序加载与操作系统对应的语言。这是多语言支持应用程序的一般做法。 5.3. 通信控制DLL 串口、网口的通信控制函数如果由DLL提供则可以使应用程序轻松不少。在工业控制、modem程序甚至socket通信中,经常使用通信控制DLL。 34 VC++环境下动态链接库的开发及应用 在Windows系统,需通过DCB(Device Control Block)对串口进行配置。利用Windows API GetCommState函数可以获取串口当前配置;利用SetCommState函数则可以设置串口通讯的参数。 串行通信通常按以下四步进行: (1) 打开串口; (2) 配置串口; (3) 数据传送; (4) 关闭串口。 由此可见,我们需要给串口控制DLL提供如下四个接口函数: //打开指定的串口,其参数port为端口号 BOOL ComOpen(int port); //在这个函数里使用默认的参数设置串口 //将打开的串口关闭 void ComClose(int port); //将串口接收缓冲区中的数据放到buffer中 int GetComData(char *buf, int buf_len); //将指定长度的数据发送到串口 int SendDataToCom(LPBYTE buf,int buf_Len); 下面是DLL接口的主要源代码框架: //com.h:com类通信接口 class AFX_EXT_CLASS com { public: ComOpen(int port) { ? } int SendDataToCom(LPBYTE buf,int buf_Len) { ? } int GetComData(char *buf, int buf_len) { ? } void ComClose() { ?}} 35 VC++环境下动态链接库的开发及应用 上述为DLL在软件开发领域的三个典型的应用。DLL给软件开发和编程着带来了许多方便和好处,但同时也存在着一些漏洞,最显著的就是DLL木马,严重影响了计算机的安全性。 5.4. DLL木马 目前,DLL木马成为了病毒的一种十分重要的形式,DLL在程序编制中可作出巨大贡献,它提供了具共性代码的复用能力。但是,正如一门高深的武学,若被掌握在正义之侠的手上,便可助其仗义江湖;但若被掌握在邪恶之徒的手上,则必然在江湖上掀起腥风血雨。DLL正是一种这样的武学。DLL一旦染上了魔性,就不再是正常的DLL程序,而是DLL木马,一种恶贯满盈的病毒,令特洛伊一夜之间国破家亡。 5.4.1. DLL木马的原理 DLL木马的实现原理是编程者在DLL中包含木马程序代码,随后在目标主机中选择特定目标进程,以某种方式强行指定该进程调用包含木马程序的DLL,最终达到侵袭目标系统的目的。 正是DLL程序自身的特点决定了以这种形式加载木马不仅可行,而且具有良好的隐藏性: (1)DLL程序被映射到宿主进程的地址空间中,它能够共享宿主进程的资源,并根据宿主进程在目标主机的级别非法访问相应的系统资源; (2)DLL程序没有独立的进程地址空间,从而可以避免在目标主机中留下“蛛丝马迹”,达到隐蔽自身的目的。 DLL木马实现了\真隐藏\,我们在任务管理器中看不到木马\进程\,它完全溶进了系统的内核。与\真隐藏\对应的是\假隐藏\,\假隐藏\木马把自己注册成为一个服务。虽然在任务管理器中也看不到这个进程,但是\假隐藏\木马本质上还具备独立的进程空间。\假隐藏\只适用于Windows9x的系统,对于基于WINNT的操作系统,通过服务管理器,我们可以发现系统中注册过的服务。 5.4.2. DLL木马注入程序 DLL木马注入其它进程的方法为远程线程插入。 远程线程插入技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。将木马程序以DLL的形式实现后,需要使用插入到目标进程中的远程线程将该木马DLL插入到目标进程的地址空间,即利用该线程通过调用Windows API 36