WEB开发网
开发学院软件开发VC 用自删除dll实现应用程序的安装/卸载代码 阅读

用自删除dll实现应用程序的安装/卸载代码

 2006-07-20 11:38:22 来源:WEB开发网   
核心提示: 实用程序 rundll32.exe 介绍从所周知,DLL的代码通常需要先加载到内存之后才能执行,用自删除dll实现应用程序的安装/卸载代码(2),那么如何执行某个DLL导出的代码而不用创建加载和调用该 DLL 的 EXE 文件呢?方法如下:从 Windows 95 开始的每个 Window

实用程序 rundll32.exe 介绍

从所周知,DLL的代码通常需要先加载到内存之后才能执行,那么如何执行某个DLL导出的代码而不用创建加载和调用该 DLL 的 EXE 文件呢?方法如下:从 Windows 95 开始的每个 Windows 操作系统版本都附带一个系统实用程序:rundll32.exe。利用它可以象下面这样执行某些 DLL(但不是所有)输出的任何函数:

rundll32.exe DllName,ExportedfnName args   

ExportedfnName 是DLL输出的函数名。在编写供 rundll32 使用的 DLL时,可以象下面这样来声明输出函数:

extern "C" __declspec(dllexport) void CALLBACK FunctionName (
  HWND hwnd,
  HINSTANCE hInstance,
  LPTSTR lpCmdLine,
  int nCmdShow
  )
{ ... }  

rundll32.exe 根据函数参数列表对函数进行调用,但根据经验,实际上用得上的参数值只有一个,那就是 lpCmdLine,该参数接收运行 rundll32.exe 时传入的参数值;__declspec(dllexport)的目的是输出函数;extern "C" 使输出的函数名有修饰符,如:_FunctionName@16 (函数名中被强制包含函数参数的大小,详细信息请参见 MSDN 中有关DLL输出函数调用规范说明)。rundll32.exe 加载指定的 DLL 并调用通过 args 参数传入的 lpCmdLine 的值指定的输出函数。有关 rundll32.exe 的正式文档参见 MSDN 库相关资料(Q164787):

http://support.microsoft.com/default.aspx?scid=kb;en-us;164787

实现能自删除的 DLL

下面是实现自删除DLL的示范代码:

#include <windows.h>
HMODULE g_hmodDLL;
extern "C" BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID)
{
  if (reason == DLL_PROCESS_ATTACH)
  g_hmodDLL = hinstDLL;
  return TRUE;
}
extern "C" __declspec(dllexport) void CALLBACK MagicDel(HWND,
            HINSTANCE,
            LPTSTR lpCmdLine,
            int)
{
  // 延时2秒
  Sleep(2000);
  // 删除创建该进程的可执行文件
  DeleteFile(lpCmdLine);
  // 删除DLL自己
  char filenameDLL[MAX_PATH];
  GetModuleFileName(g_hmodDLL, filenameDLL, sizeof(filenameDLL));
  __asm
  {
    lea eax, filenameDLL
    push 0
    push 0
    push eax
    push ExitProcess
    push g_hmodDLL
    push DeleteFile
    push FreeLibrary
    ret
  }
}   

上面这段代码首先删除某个文件,然后自删除。DllMain 是DLL的入口函数,当首次加载动态链接库时该函数被调用,此时将模块句柄赋值给全局变量 g_hmodDLL,以便梢后使用它来获取 DLL 本身的文件名。在 MagicDel 函数中,lpCmdLine 是DLL要删除的可执行文件的名称(如:卸载程序的文件名)。要删除它很容易——用 Sleep 做一个延时,以便可执行程序的进程有时间退出并调用 DeleteFile。为了掌握 MagicDel 的实现细节,你可以将可执行程序的进程句柄传给MagicDel并在调用 DeleteFile 之前做一个等待,看看会发生什么?

上一页  1 2 3 4 5 6 7  下一页

Tags:删除 dll 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接