精华内容
下载资源
问答
  • 2019-10-09 20:19:17

    背景:  

     

         今天编译程序的时候发现,dll在系统中显示无法加载,因为是二次开发,如果dll没有加载的话,相对应的功能就无法使用。

         之前也通过反编译看对应的dll里面的方法,然后找到对应功能的API,但是对于系统加载dll的原理还是不是很清楚。

     

    基本概念:

        >>动态链接库(DLL,即 “Dynamic-Link Library”)是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共     代码或资源。DLL是Windows的基石,所有的Win32 API函数都包含在DLL中。

        动态链接库一般不能直接执行,而且它们一般也不接收消息。

        它们是包含许多函数的独立文件,这些函数可以被应用程序和其他 DLL 调用以完成某些特定的工作。

         一个动态链接库只有在另外一个模块调用其所包含的函数时才被启动

     

        采用dll的好处: 

                   1    可以采用多语言看来编写

                   2    增强产品的功能

                   3    提供二次开发的平台

                   4    简化项目管理 

                   5    节省磁盘空间和内存,只需要一份的内存空间,多个进程和同时引用同一个dll文件,有利于资源共享,有利于实现应用程序的本地化。

     

       DLL的调用方式:
      静态调用中,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
      动态调用中,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。

       

       Dll与exe的差别:

               

                  a.Exe有自己的进程空间,dll没有,dll只能被引用后,和exe共享进程空间才能被调用和运行(其实还有rundll32命令可以启动dll,该系统命令本质上就是为其提供进程空间)。
    b.dll也叫动态链接库,可以将反复使用的共有代码和资源放在动态链接库中,这样在内存中只会有一个副本,节约内存空间(不同的进程根据不同的重定位信息可以定位到制定的dll中)

    测试过程中应该注意:

    1.DLL是和由调起他的EXE共享进程空间的,所以在测试过程中,需考虑两者之间的兼容,比如初始化时是否重复初始化导致崩溃。

    2.完全调用某DLL的EXE程序测试通过,并不代表该DLL测试通过

    3.不要轻易相信研发说的:就是一样,没关系的,类似这样的话。   

     

     

          

     


     

     

                   

          

     

     

          

    更多相关内容
  • 使用C#动态加载DLL文件

    千次阅读 2019-01-14 13:09:03
    使用C#动态加载DLL文件 ** 1.首先用到kernel32.dll API函数,对于C#来说调用windows API 还是蛮简单的事件。只需要声明一下就可以了。 //加载DLL [DllImport("kernel32.dll", ...

    **

    使用C#动态加载DLL文件

    **

    1.首先用到kernel32.dll API函数,对于C#来说调用windows API 还是蛮简单的事件。只需要声明一下就可以了。

        //加载DLL
        [DllImport("kernel32.dll", SetLastError = true ,CharSet = CharSet.Auto)]
        private extern static IntPtr LoadLibrary(string path);
       
        //获取函数地址
        [DllImport("kernel32.dll",SetLastError =true)]
        private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
    
       //释放相应的库
        [DllImport("kernel32.dll")]
        private extern static bool FreeLibrary(IntPtr lib);
    
        //获取错误信息
        [DllImport("Kernel32.dll")]
        public extern static int FormatMessage(int flag, ref IntPtr source, int msgid, int langid, ref string buf, int size, ref IntPtr args);
    
    

    2.需要知道你调用DLL里面的函数名称,以下是主要的三个函数。

            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="dll_path">DLL路径</param>
            public DllInvoke(string dll_path)
            {
                if (File.Exists(dll_path))
                {
                    hLib = LoadLibrary(dll_path);
                }
            }
    
            /// <summary>
            /// 析构函数
            /// </summary>
            ~DllInvoke()
            {
                FreeLibrary(hLib);
            }
    
            /// <summary>
            /// 将要执行的函数转换为委托
            /// </summary>
            /// <param name="APIName">函数名称</param>
            /// <param name="t">类型</param>
            /// <returns></returns>
            public Delegate Invoke(string APIName, Type t)
            {
                IntPtr api = GetProcAddress(hLib, APIName);
                return Marshal.GetDelegateForFunctionPointer(api, t);
            }
    

    我将调用API的函数封装成类。
    在调试的过程遇到加载不成功的情况,然后想到获取错误代码,然后从错误代码里面查找到原因。函数如下:

            /// <summary>
            /// 获取系统错误信息描述
            /// </summary>
            /// <param name="errCode">系统错误码</param>
            /// <returns></returns>
            public string GetSysErrMsg(int errCode)
            {
                IntPtr tempptr = IntPtr.Zero;
                string msg = null;
                FormatMessage(0x1300, ref tempptr, errCode, 0, ref msg, 255, ref tempptr);
                return msg;
            }
    
            /// <summary>
            /// 获取最近一个win32Error
            /// </summary>
            /// <returns></returns>
            public int GetWin32ErrorCode()
            {
                return Marshal.GetLastWin32Error();
            }
    

    3.在程序中调用DLL的例子
    定义委托:

    [UnmanagedFunctionPointerAttribute(CallingConvention.StdCall)]
     private delegate int GETMD5(string str, byte[] pData);
    

    实例化对象:

                    DllInvoke dll = new DllInvoke(System.AppDomain.CurrentDomain.BaseDirectory + "\\md5.dll");
                    //根据函数名获取函数委托对象 _fnMD5@8函数的别名
                    GETMD5 get_md5 = (GETMD5)dll.Invoke("_fnMD5@8", typeof(GETMD5));
                    //temp输出对象
                    get_md5(“123456789”, temp);
    
    展开全文
  • 从前面的《Windows内存体系》系列文章中我们可以知道,在Windows系统中,每个进程都有自己私有的地址空间。当我们用指针来引用内存的时候,指针的值表示的是进程自己的地址空间的一个虚拟的内存地址。进程不能通过...

    一. DLL注入技术的用途

    从前面的《Windows内存体系》系列文章中我们可以知道,在Windows系统中,每个进程都有自己私有的地址空间。当我们用指针来引用内存的时候,指针的值表示的是进程自己的地址空间的一个虚拟的内存地址。进程不能通过指针来引用其他进程地址空间的内存。因此,如果一个进程有缺陷会导致其引用和覆盖随机地址处的内存,那么这个缺陷的影响就会不会扩散到其他的进程。

    独立的地址空间有利于系统的稳定性。但很多时候我们还是需要跨越进程的边界来访问另一个进程地址空间,比如:

    • 我们要从另一个进程创建的窗口来派生子类窗口。比如附着在windows资源管理器上的一些小插件等。
    • 我们需要假借其他进程之名做某些事情。
    • 我们需要获取其他进程的更多详细信息,如加载了哪些dll等。
    • 我们需要对其他进程的某些操作进程拦截。
    • 干一些羞羞的事情…

    为了满足上面的这些需求,我们可以使用DLL注入的技术,将我们自己开发的dll注入到另一个进程的地址空间中,让dll中的代码在该进程的地址空间中执行,那么我们就可以在那个中进程为所欲为了。

    二. 什么样的DLL可以被注入?

    理论上任何DLL都可以被注入到其他进程之中,但是大多数情况下,我们注入到其他进程之中是为了实现某些功能、做某些事情的,所以我们需要在我们的DLL被注入之后,DLL中的功能代码能够被调用执行。

    我们知道DLL被首次载入到进程中时,会收到DLL_PROCESS_ATTACH的通知,即调用DllMain函数,并且参数fdwReason的值被设为DLL_PROCESS_ATTACH。我们可以在收到DLL_PROCESS_ATTACH通知时开始我们的业务逻辑。

    下面是一个最简单的dll的源码,在被注入成功后(即收到DLL_PROCESS_ATTACH通知时)弹出消息提示框:

    BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved ) {
        switch(fdwReason) {
            case DLL_PROCESS_ATTACH:
            {
                MessageBox(NULL, TEXT("我已经被注入啦"), TEXT("信息"), MB_ICONINFORMATION);
                break;
            }
            case DLL_THREAD_ATTACH:
            {
                break;
            }
            case DLL_THREAD_DETACH:
            {
                break;
            }
            case DLL_PROCESS_DETACH:
            {
                break;
            }
        }
        return TRUE;
    }

    但是,如果DLL_PROCESS_ATTACH通知处理过程中的操作被挂起(如消息提示框)或者被阻塞(如用户创建了一个消息循环),这样就会导致目标进程中的LoadLibrary(Ex)函数一直无法返回(dll都是通过LoadLibrary(Ex)函数来加载的),所以我们一般会在DLL_PROCESS_ATTACH通知处理过程中创建一个子线程,将业务逻辑放置到该子线程中执行,代码如下:

    #include <windows.h>
    #include <tchar.h>
    #include <process.h>
    
    unsigned int __stdcall PluginProc(LPVOID pArg) {
        MessageBox(NULL, TEXT("我已经被注入啦"), TEXT("信息"), MB_OK | MB_ICONASTERISK);
        return 0;
    }
    
    BOOL APIENTRY DllMain(HMODULE hModule, DWORD  fdwReason, LPVOID lpReserved) {
        HANDLE hThread = NULL;
    
        switch(fdwReason) {
            case DLL_PROCESS_ATTACH:
            {
                hThread = (HANDLE)_beginthreadex(NULL, 0, PluginProc, NULL, 0, NULL);
    
                if (hThread) {
                    CloseHandle(hThread); // 关闭句柄,防止句柄泄漏
                }
                break;
            }
            case DLL_THREAD_ATTACH:
            {
                break;
            }
            case DLL_THREAD_DETACH:
            {
                break;
            }
            case DLL_PROCESS_DETACH:
            {
                break;
            }
        }
        return TRUE;
    }

    另外,当DLL被从目标进程卸载时,DLL会收到DLL_PROCESS_DETACH通知,我们需要在该通知的处理过程中做好最后的善后工作,防止资源泄漏、程序崩溃等问题出现。

    本文介绍了“什么样的DLL可以被用来注入”,后面的文章会着重介绍如何通过不同的方式将DLL注入到目标进程。

    展开全文
  • 也就是说,通常库是程序的有机部分,可以静态链接(.lib,在使用.lib之前,要在程序源代码中引用lib对应的头文件.h并在编译时直接加到源文件中)或动态链接(DLL,Dynamic Linked Library,程序运行时加载)成为程序...

    1 程序的模块化
    如果你是一个程序员就会知道,编程都是需要使用函数库(library)或类库的,也就是说,通常库是程序的有机部分,可以静态链接(.lib,在使用.lib之前,要在程序源代码中引用lib对应的头文件.h并在编译时直接加到源文件中)或动态链接(DLL,Dynamic Linked Library,程序运行时加载)成为程序的一部分。

    在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。如在 Windows操作系统中,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。
    通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。
    MS把所有的 API函数是放在几个大的 *.LIB中,另外还提供一对应的几个 *.inc,实际上它如同 *.h头文件,起到声明 API函数的目的。
    DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:\Windows\System目录下。

    DLL文件中存放的是各类程序的函数(子过程)实现过程,当程序需要调用函数时需要先载入DLL,然后取得函数的地址,最后进行调用。使用DLL文件的好处是程序不需要在运行之初加载所有代码,只有在程序需要某个函数的时候才从DLL中取出。另外,使用DLL文件还可以减小程序的体积。

    Windows系统平台上,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Microsoft Windows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。一般来说,DLL是一种磁盘文件(通常带有DLL扩展名,是标准win32可执行文件-“PE”格式),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分,进程中所有线程都可以调用其中的函数。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。
    系统的组策略和注册表中,我们可以修改一些键值来优化我们的系统,并加强操作系统的安全性。可是,对于限制下载、禁止删除文件等功能,我们无法通过上述的操作来完成,这只有通过修改系统DLL文件来实现。目前,我们通过修改系统的DLL文件,可以实现禁止删除文件、禁止IE下载、禁止IE另存为、禁止文件打开方式等功能。

    2 为什么要用DLL
    DLL为什么封装成函数,就能成为系统中大量使用DLL的理由呢?

    ① 扩展应用程序

    由于DLL能被应用程序动态载入内存。所以,应用程序可以在需要时才将DLL载入到内存中,这让程序的可维护性变得很高。比如QQ的视频功能需要升级,那么负责编写QQ的程序员不必将QQ所有代码都重写,只需将视频功能相关的DLL文件重写即可。

    ② 便于程序员合作

    这个和最终用户关系不大,仅供了解。大家都知道编程工具有很多,比如VB、VC、Delphi等,如果好几个人合作来编写一个大的程序,那么可能有的人用VB,有的人用VC,每人负责的部分所使用的编程语言都不同,究竟放在哪个编译器中进行编译呢?这就好比一群来自各个国家的人在共同编写一篇文章,如果他们所使用的语言都不同,写出来的文章怎么可能凑到一起呢?而有了DLL后,可以让VC程序员写一个DLL,然后VB程序员在程序中调用,无需为怎么将它们都编译为一个单独的EXE而发愁了。

    ③ 节省内存

    如果多个应用程序调用的是同一个动态链接库,那么这个DLL文件不会被重复多次装入内存中,而是由这些应用程序共享同一个已载入内存的DLL。就好比一个办公室中,很少会为每一个员工配置一台饮水机的,而是在一个公共位置放上一个饮水机,所有需要喝水的职员都可以共用这台饮水机,降低了成本又节约了空间。

    ④ 共享程序资源

    包括刚才提到过的通用文件对话框在内,DLL文件提供了应用程序间共享资源的可能。资源可以是程序对话框、字符串、图标,或者声音文件等。

    ⑤ 解决应用程序本地化问题

    在下载了某个程序的汉化包后,打开汉化说明,经常可以看到用下载包中的DLL文件覆盖掉程序原来的DLL,汉化就完成了。这些程序都是将执行代码和应用程序界面分开编写了,所以汉化者只需简单地将其中和程序界面相关的DLL汉化并发布即可。

    3 隐式链接和显式链接
    应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。

    隐式链接(load-time dynamic linking)是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载(由编译器自动完成地址分配)。采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。我们使用的大部分系统Dll就是通过这样的方式链接的。若找不到需要的Dll则会给出一个Dll缺少的错误消息。

    显式链接(run-time dynamic linking)与此相反。用户程序在编译的时候并没有指明需要哪些Dll,而是在运行起来之后调用Win32 的LoadLibary()函数,去装载Dll。若没有找到Dll则这个函数就会返回一个错误。在用LoadLibary()函数装载Dll之后,应用程序还需要用GetProcAdress()函数去获得Dll输出函数的地址。显式链接方式对于集成化的开发语言比较适合。有了显式链接,程序员就不必再使用导入文件,而是直接调用Win32 的LoadLibary()函数,并指定DLL的路径作为参数。还要说明一点的就是Known Dlls就是保证在通过LoadLibary()去装载系统Dll的时候,只从特定的系统目录去装载,防止装载错。装载的时候会去看注册表下是否有一样的注册表键名。

    应用程序怎样找到DLL文件

    如果应用程序使用LoadLibrary显式链接,那么在这个函数的参数中可以指定DLL文件的完整路径。如果不指定路径,或是进行隐式链接,Windows将遵循下面的搜索顺序来定位DLL:

    I 包含EXE文件的目录,
    II 进程的当前工作目录,
    III Windows系统目录,
    IV Windows目录,
    V 列在Path环境变量中的一系列目录。
    在Windows上有个注册表键值决定了Dll的搜索顺序:HKLMSystemCurrentControlSetSessionManagerSafeDllSearchMode。在windows 7,server2003,xp sp2中这个值为1,在xp,2000 sp4中为0。

    1值时的搜素顺序为:1.可执行文件所在目录,2.系统目录windowssystem32,3. 16位系统目录,4.windows目录,5.当前进程目录。6.环境变量PATH中的目录。

    0值时的搜素顺序为:1.可执行文件所在目录,2. 当前进程目录。3.系统目录windowssystem32,4. 16位系统目录,5.windows目录,6.环境变量PATH中的目录。

    4 DLL的加载与连接
    Windows DLL装入(除ntdll.dll外)和连接是通过ntdll.dll中一个函数LdrInitializeThunk实现的。先对LdrInitializeThunk()这个函数名作些解释“Ldr显然是“Loader”的缩写。而“Thunk”意为“翻译”、“转换”、或者某种起着“桥梁”作用的东西。这个词在一般的字典中是查不到的,但却是个常见于微软的资料、文档中术语。这个术语起源于编译技术,表示一小片旨在获取某个地址的代码,最初用于函数调用时“形参”和“实参”结合。后来这个术语有了不少新的特殊含义和使用,但是DLL的动态连接与函数调用时“形实结合”确实有着本质的相似。

    DLL文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。

    5 DLL注册及为什么需要注册?
    在系统故障中,有很多都是由于DLL文件丢失、损坏或没有注册造成的,比如Windows XP的压缩文件夹功能出现故障就很有可能是系统目录中的zipfldr.dll没有注册造成的,这类故障的解决方法也大多是下载一个对应的DLL并运行如下命令:

    for%1 in (%windir%system32*.dll)do regsvr32.exe /s %1

    很多人不理解为什么要这么做,是不是所有的DLL都能这样做呢?

    其实系统中有两种DLL,一种是不需注册即可使用的,另一种则是必须经过注册才能使用的。就好像一个临时工,和一个记录在员工名单上的长期合同工的区别一样。如何才能区分这两种DLL呢?方法很简单,可以用一个工具(如Dependency Walker)打开这个DLL,看函数输出表,如果其中包含以下两个函数(前者是注册DLL,后者是反注册DLL),那么就一定是需要注册才能使用的DLL了。

    DllRegisterServer
    DllUnregisterServer
    而regsvr32这个命令,实际上就是调用DLL中的这两个函数(“regsvr32 /u DLL文件名”调用的即为DllUnregisterServer反注册函数)。

    注册与不注册,.dll文件都在system32下面。不同的是,注册了会在注册表中有相应信息,同时载入到了dll缓存,没有注册信息和进缓存就不能使用(开机时操作系统的一些核心功能再加载到了内存,并开始在后台运行,程序、数据、模块都需要进入内存才能被访问。)。

    文件注册前和注册后都没有变化,只是通过命令把相应的信息添加到了注册表中。

    注册文件的命令行是 regsrv32

    regsrv32 xxx.dll

    regsrv32 xxx.dll /u

    regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname

    参数说明:

    /u - 解除服务器注册

    /s - 无声;不显示消息框

    /i - 调用 DllInstall,给其传递一个可选 [cmdline];跟 /u 一起使用时,卸载 dll

    /n - 不要调用 DllRegisterServer;这个选项必须跟 /i 一起使用

    展开全文
  • 浅析Windows程序输入法工作原理

    千次阅读 2018-12-23 22:28:56
    浅析Windows程序输入法工作原理一,输入法结构介绍二,Windows消息循环捕捉键盘消息三,总结 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入法程序也是一个进程,但是我们在任务管理器中却找不到该进程,...
  • dll文件32位64位检测工具以及Windows文件夹SysWow64的坑 自从操作系统升级到64位以后,就要不断的需要面对32位、64位的问题。相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program...
  • 从这篇文章开始,作者将带着大家来...第一篇文章主要包括两部分内容,开发环境(VS、编译设置)、基础技术、运行单一实例(互斥对象示例)、DLL延迟加载(skin++换皮肤示例)、资源释放(MFC示例)。希望对您有所帮助~
  • Windows编程DLL注入之Hook(钩子)注入

    千次阅读 2020-11-06 11:57:36
    消息可以由系统和应用程序生成,系统会为每个输入事件产生相应的消息。例如点击鼠标,按下键盘按键等。消息又分为队列消息和非队列消息,对于非队列消息,windows会直接将其发送到窗口处理函数,而对于队列消息,...
  • DLL劫持原理

    2020-01-03 10:27:05
    系统有一套标准的搜索DLL路径的规则,这套规则又分为两种搜索模式,安全搜索模式,非安全搜索模式。 默认情况下启用安全DLL搜索模式。要禁用此功能,需创建HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\...
  • 一、 静态链接库(LIB,也简称“静态库”)与动态链接库(DLL,也简称“动态库”)的区别  静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在...
  • <Examples:GridViewExample x:Class="Telerik.Windows.Examples.GridView.FirstLook.Example" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...
  • dll注入系列——内存加载

    千次阅读 2019-04-11 01:52:43
    dll注入的方式和程序正常加载dll模块的本质上是相同的,无非是通过导入表加载,利用LoadLibrary加载和一些系统机制强制加载。要使程序动态加载一个dll文件,也就是执行程序原本没有的代码,势必要改变程序的控制流,...
  • Windows DLL基本原理

    千次阅读 2014-06-09 06:14:55
    Windows DLL基本原理 Windows系统平台上,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才...
  • 对于内核层实现监控模块的加载,包括加载DLL模块、内核模块等。你也许会想到 HOOK 各种内核函数来实现。确定,在内核层中的 HOOK 已经给人留下太多深刻的印象了,有 SSDT HOOK、Inline HOOK、IRP HOOK、过滤驱动等等...
  • dll工作基本原理

    千次阅读 2018-06-21 14:49:47
    Windows DLL基本原理 Windows系统平台上,你可以将独立的程序模块创建为较小的DLL(Dynamic&nbsp;Linkable&nbsp;Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的...
  • 关于java加载dll文件

    千次阅读 2016-12-13 10:21:06
    最近项目中用到了Jni,需要用java调用Opencv生成的dll文件完成图像处理。 问题描述:UnsatisfiedLinkError:no msvcp120d in java.library.path dll文件是同事提供的,他同时提供了一个demo project。
  • 通过修改PE加载DLL

    千次阅读 2018-06-24 10:51:58
    基本概念除了DLL动态注入技术外,还可以通过手工修改PE文件的方式来加载DLL,这种方式只要应用过一次之后,每当进程开始运行时便会自动加载指定的DLL。整体思路如下:1、查看IDT是否有充足的空间,若无则移动IDT至...
  • DLL劫持源码-易语言

    2021-06-12 19:41:09
    首先会尝试从当前程序所在的目录加载DLL,如果没找到,则在Windows系统目录中查找,最后是在环境变量中列出的各个目录下查找。利用这个特点,先伪造一个系统同名的DLL,提供同样的输出表,每个输出函数转向真正的...
  • 在网上搜索了很多病毒木马的分析报告,看了一段时间后,发现还是有很多病毒木马都能够模拟PE加载器,把DLL或者是EXE等PE文件,直接从内存中直接加载到自己的内存中执行,不需要通过API函数去操作,以此躲过一些杀软...
  • dll注入是一种将Windows动态链接库注入到目标进程中的技术,具体的说,就是将dll文件加载到一个进程的虚拟地址空间中。对某个进程进行dll注入,也就意味着dll模块与该进程共用一个进程空间,则这个dll文件就有了操纵...
  • dll劫持

    千次阅读 2022-03-07 11:52:43
    Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件。 在windows平台下,很多应用程序的很多功能是相似的,抛去ui等等来说,大致的功能都差不多,比如都得...
  • 64位程序调用32位dll

    千次阅读 2019-11-15 15:40:45
    最近在做代码升级64位,因为有些第三方的模块没有源码,所以需要用到64位代码调用32位模块的方案,在网上找了很多资料和方法,最终参考国外的一篇文章解决了问题,原理是应用进程外com实现,具体见参考文献: ...
  • Windows DLL基本原理加载连接的实现

    千次阅读 2009-04-10 23:48:00
    Windows DLL基本原理 Windows系统平台上,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将...
  • DLL劫持原理&防御方法

    万次阅读 2019-05-18 14:35:01
    DLL劫持指的是,病毒通过一些手段来劫持或者替换正常的DLL,欺骗正常程序加载预先准备好的恶意DLL。 如下图,LPK.dll是应用程序运行所需加载的DLL,该系统文件默认在C:\Windows\system32路径下,但由于windows优先...
  • Windows DLL基本原理 Windows系统平台上,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将...
  • 三、Windows目录下的SysWOW64和System32的问题四、exe文件调用dll文件的过程 一、问题1:由于找不到vcruntime140d.dll。无法继续执行代码。重新安装程序可能会解决此问题。 最近运行exe文件的时候出现了:“由于找不...
  • Dll的基本原理和使用方法

    千次阅读 2019-01-11 19:34:35
    DLL程序和调用其输出函数的程序的关系       引言   比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在...
  • 滥用DLL搜索顺序并利用这种机制来加载一个流氓DLL而不是合法的被称为DLL加载,或者在MITRE ATT&CK框架中劫持。 在这篇文章中,你将了解更多关于DLL搜索顺序的基本原理,以及合法的二进制文件如何被武器化,并...
  • 三.MFC DLL窗口的创建和注入显示

    千次阅读 2022-02-19 16:31:27
    微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量....
  • Windows 10 动态库并行加载浅析

    千次阅读 2020-10-30 20:24:17
    Windows 10 并行加载Dll2.1 启动标记2.1 数据结构2.2 线程池的初始化2.3 LdrpMapAndSnapDependency2.4 LdrpWorkCallback2.5 LdrpProcessWork2.6 LdrpDrainWorkQueue3. 线程的退出4. 验证5. 问题重现6. 总结 Windows...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,938
精华内容 8,775
关键字:

windows程序加载dll原理