今天冷知识百科网小编 敖玉白 给各位分享注入dll有什么用途的知识,其中也会对请问dll注册和反注册的作用(dll 反注册)相关问题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在我们开始吧!
请问dll注册和反注册的作用
看来你还不了解DLL文件的作用:
在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对**的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。
1 关于注册DLL: 当程序需要DLL文件而找不到该文件的时候,我们就得注册,以通知程序DLL文件位置以便让文件调用。
2 关于反注册DLL: 当我们不需要DLL或者程序卸载不掉这个文件的时候,我们才需要反注册,一般是不用进行反注册的。
DLL注入有什么用?
简单的说,dll注入就是在远程进程加入一段代码,随时监控程序运行并可以根据运行情况自动运行相应的内容,dll注入难在dll的编写,由于是dll程序,且远程运行,所以在调试很困难,需要熟练地编程功底才能编写,而且dll注入等于给远程进程增加了一个线程,对于一些会自检线程的程序,有被发现的风险。
易语言大神来啊,关于DLL的
没源码,不过我认为是它说得很清楚了因为不存在编辑框1这个变量或窗口组件。我猜你想用调用这个dll的程序的编辑框1,但在易语言里是无法直接这样调用的,它只会检查你编的dll里有没有编辑框1这个窗口组件,而不管调用这个dll的程序是否有编辑框1这个窗口组件。只要你编的dll里没有编辑框1这个窗口组件,它就无法被调用。要是真想调用也不是没有办法,但直接调用是不行的。
DLL注入是干什么的?
所谓DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。要实现DLL注入,首先需要打开目标进程。 DLL注入在黑客技术中也叫做进城插入技术,一些木马、**插件、破坏**毒为了能够随系统启动或者伪装为系统进程,会插入系统的DLL文件并调用其中封装的函数,例如键盘截取就利用了DLL注入并且调用了HOOK钩子机制 详细例子: hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程 PROCESS_VM_OPERATION | //允许远程VM操作 PROCESS_VM_WRITE, //允许远程VM写 FALSE, dwRemoteProcessId ) 由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。 如果进程打不开,以后的操作就别想了。进程打开后,就可以建立远线程了,不过别急,先想想这个远线程的线程函数是什么?我们的目的是注入一个DLL。而且我们知道用LoadLibrary可以加载一个DLL到本进程的地址空间。于是,自然会想到如果可以在目标进程中调用LoadLibrary,不就可以把DLL加载到目标进程的地址空间了吗?对!就是这样。远线程就在这儿用了一次,建立的远线程的线程函数就是LoadLibrary,而参数就是要注入的DLL的文件名。(这里需要自己想一想,注意到了吗,线程函数ThreadProc和LoadLibrary函数非常相似,返回值,参数个数都一样) 还有一个问题,LoadLibrary这个函数的地址在哪儿?也许你会说,这个简单,GetProcAddress就可以得出。于是代码就出来了。 char *pszLibFileRemote="my.dll"; PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"); CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL); 但是不对!不要忘了,这是远线程,不是在你的进程里,而pszLibFileRemote指向的是你的进程里的数据,到了目标进程,这个指针都不知道指向哪儿去了,同样pfnStartAddr这个地址上的代码到了目标进程里也不知道是什么了,不知道是不是你想要的LoadLibraryA了。但是,问题总是可以解决的,Windows有些很强大的API函数,他们可以在目标进程里分配内存,可以将你的进程中的数据拷贝到目标进程中。因此pszLibFileRemote的问题可以解决了。 char *pszLibFileName="my.dll";//注意,这个一定要是全路径文件名,除非它在系统目录里;原因大家自己想想。 //计算DLL路径名需要的内存空间 int cb = (1 + lstrlenA(pszLibFileName)) * sizeof(char); //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区 pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 iReturnCode = WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL); OK,现在目标进程也认识pszLibFileRemote了,但是pfnStartAddr好像不好办,我怎么可能知道LoadLibraryA在目标进程中的地址呢?其实Windows为我们解决了这个问题,LoadLibraryA这个函数是在Kernel32.dll这个核心DLL里的,而这个DLL很特殊,不管对于哪个进程,Windows总是把它加载到相同的地址上去。因此你的进程中LoadLibraryA的地址和目标进程中LoadLibraryA的地址是相同的(其实,这个DLL里的所有函数都是如此)。至此,DLL注入结束了。
dll文件是干什么用的?
DLL文件(Dynamic Linkable Library 即动态链接库文件),是一种不能单独运行的文件,它允许程序共享执行特殊任务所必需的代码和其他资源
比较大的应用程序都由很多模块组成,这些模块分别完成相对**的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。
Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将**的程序模块创建为较小的 DLL 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。
一般来说,DLL 是一种磁盘文件,以.dll、.DRV、.FON、.SYS 和许多以 .EXE 为扩展名的系统文件都可以是 DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导出函数,用于向外界提供服务。DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。
在 Win32 环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配。Windows 操作系统对 DLL 的操作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。
调用方式:
1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。
隐式的调用:需要把产生动态连接库时产生的 .LIB 文件加入到应用程序的工程中,想使用 DLL 中的函数时,只须说明一下。隐式调用不需要调用 LoadLibrary() 和 FreeLibrary()。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB 导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。
当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。LIB 文件中也包含了对应的 DL L文件名(但不是完全的路径名),链接程序将其存储在 EXE 文件内部。
当应用程序运行过程中需要加载 DLL 文件时,Windows 根据这些信息发现并加载 DLL,然后通过符号名或标识号实现对 DLL 函数的动态链接。所有被应用程序调用的 DLL 文件都会在应用程序 EXE 文件加载时被加载在到内存中。可执行程序链接到一个包含 DLL 输出函数信息的输入库文件(.LIB文件)。操作系统在加载使用可执行程序时加载 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)。
正因为DLL 有占用内存小,好编辑等的特点有很多电脑**都是DLL格式文件。但不能单独运行。
动态链接库通常都不能直接运行,也不能接收消息。它们是一些**的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。
DLL到底是个什么文件?它的作用是什么?
DLL(动态连接库),既然是动态,那么就是有静态连接库,我想如果这么说大家
会更明白:
也许有的人在DOS下编写过程序都明白这么一件事情,我写了一个程序,里面有一
个功能就是把屏幕的内容翻转在转90°打印出来,那么我需要把整个程序写好放
到我的所有代码中,但是如果我写另外一个程序的时候也有相通的功能,我可以
调用以前的程序这个功能吗?当然是不可以的了,所以我就要重新的写一次,如
果有5个需要调用这个功能的程序,我的这个功能函数需要20K的地方,那么我的
硬盘就有80K的垃圾出现(20k*5 - 20k),这仅仅是一个函数,大家是否可以数
清除WINDOWS如果这样来写,需要多少函数吗?你看看所有的按钮、滚动条、
Listbox\Textbox\checkBox\窗体、打印对话框、颜色对话框、打开、保存、另存
、字体对话框、文件的排列、拷贝、粘贴...... 这一切的一切是不是都需要在所
有的程序中都要写出来呢?如果真的是这个样子,那么我们的windows应该按TB来
计算了(1TB=1024GB),也许你说你的硬盘很大,那么他们还要在运行的时候占
用相同大下的内容呢!所以发展出来了,动态连接库(dll)这个感念:
动态连接,就是把这些相通的功能、函数都放到一种特殊形式的windwos可执行文
件中(dll),生成一个DLL的时候,程序员需要写出,其中包含那些函数需由其
他程序来访问。这个过程叫做对函数的“导出”
创建windows程序的时候,专门的连接程序对程序的对象文件进行扫描,并生成一
个列表,列出那些调用的函数在那个DLL那个位置,指定各个函数所在位置的过程
叫做对函数的“导入”,当程序运行的时候,一旦要求用到执行文件内部没有的
函数,windows就会自动装载动态连接库,使应用程序可以访问这些函数。此时,
每个函数的地址都会解析出来,并且以动态的方式连接到程序里--这便是术语
“动态连接”的由来。
另外还有一个好处,就是当你更新你的这个函数的版本和功能的时候,静态连接
所需要做的工作是多少(假设按windwos来说他有上千个这样的函数,一共有100
多个程序来使用,那静态连接需要100000次的更新,动态连接只需要1000次)
,从而也节省了内存的空间。
动态连接库不一定是DLL扩展名的,也可以是ocx、vbx、exe、drv 等等的
大家可以发现在调用WIN32 api的时候里面都会有说明是来自于那个dll等宿主文
件的
现在我就在这里讲讲一些标准的dll用途:
看下面这个API声明:
Public Declare Function GetWindowsDirectory Lib "kernel32" Alias
"GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long)
As Long
看见kernel32了吗,其实这个就是kernel32.dll的名字,你可以在你的硬盘里找
到他,这就是说GetWindowsDirectory这个函数是在kernel32.dll里面,他的别名
是GetWindowsDirectoryA,()中是他的参数,有两个一个是字符型,一个是长
整型,返回值也是长整型。lpBuffer ------- String,指定一个字串缓冲区,
用于装载Windows目录名。除非是根目录,否则目录中不会有一个中止用的“\”
字符nSize ---------- Long,lpBuffer字串的最大长度,返回值 为Long,复制
到lpBuffer的一个字串的长度。如lpBuffer不够大,不能容下整个字串,就会返
回lpBuffer要求的长度。零表示失败。
这就是API声明的意义所在!
DLL的说明
KERNEL32.DLL ---- 低级内核函数。使用他可以完成内存管理、任务管理、
资源控制等。
USER32.DLL------于windows管理有关的函数。消息、菜单、光标、计时器
、通信和其他大多数非现实函数都可以从这里找到
GDI32.DLL-------图形设备接口库。于设备输出有关的函数:大多数绘图
、显示场景、图元文件、坐标及其字体函数都可以从这梨找到。
COMDLG32.DLL\LZ32.DLL\VERSION.DLL\---这都是提供一些附加函数的库,包
括通用对话框、文件压缩、版本控制的支持。
COMCTL32.DLL --------一个新的windows控件集合,比如TreeView和RichTextBox
等等,最初这个好像是为了win95而制作的,但是现在也使用与NT下
MAPI32.DLL---------提供了一套电子邮件的专用函数
NETAPI32.DLL--------提供了一套访问和控制网络的函数
ODBC32.DLL--------(不用我再说了吧)ODBC功能的DLL之一
WINMM.DLL------(这可不是WINDOWS的MM)是多媒体控制访问函数集合
windows api正在快速发展和变化,是你我任何单个人都追赶不上的速度发展,幸
运的是我们不用掌握所有的windows API,只是掌握需要经常使用的WINDOWs api
和他的常规结构、基本感念就可以了,这亮点很重要。
DLL注入有什么用?
简单的说,dll注入就是在远程进程加入一段代码,随时监控程序运行并可以根据运行情况自动运行相应的内容,dll注入难在dll的编写,由于是dll程序,且远程运行,所以在调试很困难,需要熟练地编程功底才能编写,而且dll注入等于给远程进程增加了一个线程,对于一些会自检线程的程序,有被发现的风险。