老男人百科 > 百科 > 正文

dll文件解密(dll文件修复工具win10破解版)

2023-05-21 23:50:16 阅读( 7292)

比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。

较大的应用程序由许多模块组成,这些模块分别执行相对独立的功能,它们相互配合完成整个软件系统的工作。可能会有一些具有通用功能的模块,在构建其他软件系统时仍然会用到。当构建软件系统时,

如果把所有模块的源代码都静态编译成整个应用程序EXE文件,会有一些问题:一个缺点是会增加应用程序的大小,程序运行时会占用更多的磁盘空间,消耗更多的内存空间。

导致系统资源的浪费;另一个缺点是,在编写大型EXE程序时,每次修改和重建都必须对所有源代码进行调整和编译,增加了编译过程的复杂性,也不利于周期性的单元测试。

Windows系统平台提供了一个完全不同的有效的编程和运行环境。您可以将独立的程序模块创建为较小的DLL(动态链接库)文件,并单独编译和测试它们。

在运行时,只有当EXE程序真正想要调用它们时,系统才会将这些DLL模块加载到内存空间中。这种方法不仅减少了EXE文件的大小和对内存空间的需求,

而且使这些DLL模块能够被多个应用程序同时使用。Windows本身以DLL模块的形式实现了一些主要的系统功能。

一般来说,DLL是一种磁盘文件,可以。dll,DRV。丰,SYS和许多带有。EXE作为扩展名。它由全局数据、服务功能和资源组成。

在运行时,它被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果与其他dll没有冲突,文件通常被映射到进程的虚拟空间中的同一个地址。DLL模块包含各种导出函数,向外界提供服务。

DLL可以有自己的数据段,但不能有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现代码封装;DLL的编译与具体的编程语言和编译器无关。

在Win32环境中,每个进程都复制自己的读/写全局变量。如果要与其他进程共享内存,必须使用内存映射文件或声明一个共享数据段。DLL模块所需的堆栈内存是从运行进程的堆栈中分配的。

Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。Windows操作系统对DLL的操作只是将DLL映射到需要它的进程的虚拟地址空间。

DLL函数中的代码创建的任何对象(包括变量)都属于调用它的线程或进程。

呼叫模式

1.静态调用方式:编译器系统在应用程序结束时完成加载DLL和卸载DLL的编码(如果有其他程序使用该DLL,则Windows对该DLL的应用记录减1,

直到所有相关程序都使用完该DLL,它才被发布,该DLL简单实用,但不够灵活,无法满足一般要求。

隐式调用:您需要添加。生成应用程序项目的动态链接库时生成的LIB文件。当你想使用DLL中的函数时,你只需要解释它。

隐式调用不需要调用LoadLibrary()和FreeLibrary()。当程序员创建一个DLL文件时,链接器会自动生成一个对应的LIB导入文件。

该文件包含每个DLL导出函数的符号名和可选标识号,但不包含实际代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。

程序员通过静态链接编译生成应用程序时,应用程序中的调用函数与LIB文件中导出的符号相匹配,这些符号或标识号进入生成的EXE文件。

LIB文件还包含相应的DL L文件名(但不是完整的路径名),该文件名由链接器存储在EXE文件中。

当应用程序需要加载DLL文件时,Windows根据这些信息找到并加载DLL,然后通过符号名或标识号动态链接DLL函数。

加载应用程序EXE文件时,应用程序调用的所有DLL文件都将被加载到内存中。可执行程序链接到输入库文件(。lib文件),包含有关DLL输出函数的信息。

操作系统在加载使用可执行程序时加载DLL。可执行程序直接通过函数名调用DLL 的输出函数,调用方法和程序内部其它的函数是一样的。

2、动态调用方式:是由编程者用API 函数加载和卸载DLL 来达到调用DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。

显式的调用:是指在应用程序中用LoadLibrary 或MFC 提供的AfxLoadLibrary 显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,

再用GetProcAddress() 获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,

应该用FreeLibrary 或MFC 提供的AfxFreeLibrary 释放动态连接库。直接调用Win32 的LoadLibary 函数,并指定DLL 的路径作为参数。

LoadLibary 返回HINSTANCE 参数,应用程序在调用GetProcAddress 函数时使用这一参数。GetProcAddress 函数将符号名或标识号转换为DLL 内部的地址。

程序员可以决定DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个DLL 文件。使用DLL 的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,

然后调用GetProcAddress 函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary)。

Windows将遵循下面的搜索顺序来定位DLL:

包含EXE文件的目录

进程的当前工作目录

Windows系统目录

Windows目录

列在Path 环境变量中的一系列目录

MFC中的DLL

Non-MFC DLL:指的是不用MFC 的类库结构,直接用C 语言写的DLL,其输出的函数一般用的是标准C 接口,并能被非MFC 或MFC 编写的应用程序所调用。

Regular DLL:和下述的Extension DLLs 一样,是用MFC 类库编写的。明显的特点是在源文件里有一个继承CWinApp 的类。

其又可细分成静态连接到MFC 和动态连接到MFC 上的。

静态连接到MFC 的动态连接库只被VC 的专业版和企业版所支持。该类DLL 应用程序里头的输出函数可以被任意Win32 程序使用,包括使用MFC 的应用程序。输入函数有如下形式:

extern 'C' EXPORT YourExportedFunction();

如果没有extern 'C' 修饰,输出函数仅仅能从C++ 代码中调用。

DLL 应用程序从CWinApp 派生,但没有消息循环。

动态链接到MFC 的规则DLL 应用程序里头的输出函数可以被任意Win32 程序使用,包括使用MFC 的应用程序。但是,所有从DLL 输出的函数应该以如下语句开始:

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

此语句用来正确地切换MFC 模块状态。

Regular DLL能够被所有支持DLL 技术的语言所编写的应用程序所调用。在这种动态连接库中,它必须有一个从CWinApp 继承下来的类,DLLMain 函数被MFC 所提供,

不用自己显式的写出来。

Extension DLL:用来实现从MFC 所继承下来的类的重新利用,也就是说,用这种类型的动态连接库,可以用来输出一个从MFC 所继承下来的类。

它输出的函数仅可以被使用MFC 且动态链接到MFC 的应用程序使用。可以从MFC 继承你所想要的、更适于你自己用的类,并把它提供给你的应用程序。

你也可随意的给你的应用程序提供MFC 或MFC 继承类的对象指针。Extension DLL使用MFC 的动态连接版本所创建的,并且它只被用MFC 类库所编写的应用程序所调用。

Extension DLLs 和Regular DLLs 不一样,它没有从CWinApp 继承而来的类的对象,所以,你必须为自己DLLMain 函数添加初始化代码和结束代码。

和规则DLL 相比,有以下不同:

1、它没有从CWinApp 派生的对象;

2、它必须有一个DLLMain 函数;

3、DLLMain 调用AfxInitExtensionModule 函数,必须检查该函数的返回值,如果返回0,DLLMmain 也返回0;

4、如果它希望输出CRuntimeClass 类型的对象或者资源,则需要提供一个初始化函数来创建一个CDynLinkLibrary 对象。并且,有必要把初始化函数输出;

5、使用扩展DLL 的MFC 应用程序必须有一个从CWinApp 派生的类,而且,一般在InitInstance 里调用扩展DLL 的初始化函数。

DLL入口函数

1、每一个DLL 必须有一个入口点,DLLMain 是一个缺省的入口函数。DLLMain 负责初始化和结束工作,每当一个新的进程或者该进程的新的线程访问DLL 时,

或者访问DLL 的每一个进程或者线程不再使用DLL或者结束时,都会调用DLLMain。但是,使用TerminateProcess 或TerminateThread 结束进程或者线程,

不会调用DLLMain。

DLLMain的函数原型:

BOOL APIENTRY DLLMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID

lpReserved)

{

switch(ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

.

case DLL_THREAD_ATTACH:

.

case DLL_THREAD_DETACH:

.

case DLL_PROCESS_DETACH:

.

return TRUE;

}

}

参数:

hMoudle:是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);

ul_reason_for_call:是一个说明动态库被调原因的标志。当进程或线程装入或卸载动态连接库的时

专题页