




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、毕业设计说明书GRADUATE DESIGN设计题目:基于DLL注入与HOOK技术 的数据采集与分析学生姓名: 专业班级:学 院:指导教师: 摘 要摘 要HOOK技术在当今社会中扮演了一个很重要的角色。越来越多的人在使用它。而且用它的人数势必会继续增加。虽然,现在HOOK技术比较新奇 但是对于大多数的非专业的人来说它还是有点难度。Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标
2、窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。 关键词 DLL运行原理;制作与注入;windows api的替换-I-AbstractAbstractHOOK technology in today's society plays a very important role. More and more people are using it. And the number
3、of people using it will continue to increase. HOOK technology, though, now more novelty of nonprofessional people but for most it is a little difficult. Windows system is based on event driven mechanism, after all is the whole system is achieved through message passing. The hook is very important th
4、e system interface in Windows system, use it can intercept and handle to other applications, to complete the common application is difficult to achieve function. Hooks to monitor system or process in various event message, sent to the target window message interception and processing. In this way, w
5、e will be able to install custom of hook in the system, monitoring system of a specific event occurs, perform specific functions, such as intercepting input keyboard, mouse, screen word, from log surveillance and so on. Visible, hook can be used to realize many special and useful function. So for se
6、nior programmers, master the programming method of hook is necessary.Keywords DLL works; Production and injection; Replacement of the Windows API -i-目 录目 录摘 要IAbstractII第1章 绪论11.1前景11.2应用性和先进性11.3发展前景21.4个人想法21.5本章小结3第2章 需求与分析52.1 DLL简介52.2注入技术72.3 HOOK技术的原理102.4 Hook的应用模式112.5钩子应用级别122.6 Java简介142.
7、7 Java开发环境搭建162.8 Java主要特性16第3章 系统简述193.1设置钩子(HOOK)193.2释放钩子193.3钩子进程203.4调用下一个钩子函数213.5建立一个动态连接库(DLL)21第4章 设计与实现254.1 DLL注入并用钩子函数采集数据源代码254.2数据分析28结 论33参考文献34谢 辞35附 录36-III- 第1章 绪论第1章 绪论1.1 前景你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的.其实这些都是用到了windows的钩子函数。因
8、此本文将对钩子函数的相关知识进行阐述。对于一个商业软件来说,防止不法侵犯是个很重要的问题。这种问题在网络游戏中体现的比较突出。随着网络游戏被越来越多的人所熟知,网游外挂也渐渐走入了人们的视线。网游外挂的泛滥,给游戏运营商带来了不小的损失。后来游戏运营商为了防止游戏玩家使用外挂,还提出过:一旦系统发现某个玩家使用外挂,那么就对其帐号进行查封。因为游戏运行商的这个做法,甚至还有玩家将运营商告上法庭。那么这里又涉及到虚拟财产的问题。由于中国对这方面的立法还比较欠缺,所以对于运营商也好、对于游戏玩家也好,可能这不是最优的解决方案。1.2 应用性和先进性自从Microsoft公司推出第一个版本的Wind
9、ows操作系统以来,动态链接库(DLL)一直是这个操作系统的基础。Windows API 中的所有函数都包含在DLL中。3个最重要的DLL是:Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。创建DLL常常比创建应用程序更容易,因为DLL往往包含一组应用程序可以使用的自主函数。在DLL中通常没有用来处理消息循环或创建窗口的支持代码。DLL只是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个DLL将要调用的一组函数。当所有源
10、代码文件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。但是,对于一个DLL来说,必须设定该连链程序的DLL开关。这个开关使得链接程序能够向产生的DLL文件映像发出稍有不同的信息,这样,操作系统加载程序就能将该文件映像视为一个DLL而不是应用程序。你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的.其实这些都是用到了windows的钩子函数。许多现代操作系统都很注意利用已有的窗口应用程序的能力,为此引入了侦察技术(spying techniques)。HOOK技术完全可
11、以帮你解决这个问题。1.3 发展前景HOOK技术的主要目的不仅仅是提供一些高级的功能,更是为了能够向目标程序中注入用户提供的代码。与那些相对早期的老式操作系统(例如DOS和Windows 3.xx)不同,目前的Windows操作系统(Windows 9x以及Windows NT/2K)已经提供了复杂精密的机制用于为每个进程分配和维护独立的地址空间。这种设计结构实际上提供了内存的保护,因此一个应用程序不可能侵入其它应用程序的地址空间,当然也不能破坏操作系统。但同时也给程序开发中实现钩子(HOOK)带来了难题。1.4 个人想法 我的信息过滤,是通过截获Win32 API调用的HOOK技术来实现的。
12、截获Win32 API调用对于大多数Windows程序开发人员来说都是一个具有挑战性和令人感兴趣的课题。hooking这个术语代表了一种基本的技术手段,通过这种手段可以达到控制某段特定代码执行的目的。hooking技术为我们轻松地改变操作系统和第三方软件的行为提供了一种简单易行的机制,而不用获得他们的源代码。 许多现代操作系统都很注意利用已有的窗口应用程序的能力,为此引入了侦察技术(spying techniques)。hooking技术的主要目的不仅仅是提供一些高级的功能,更是为了能够向目标程序中注入用户提供的代码。 与那些相对早期的老式操作系统(例如DOS和Windows 3.xx)不同,
13、目前的Windows操作系统(Windows 9x以及Windows NT/2K)已经提供了复杂精密的机制用于为每个进程分配和维护独立的地址空间。这种设计结构实际上提供了内存的保护,因此一个应用程序不可能侵入其它应用程序的地址空间,当然也不能破坏操作系统。但同时也给程序开发中实现钩子(hook)带来了难题。对应用程序进行监察的作用 (1)监控API函数 监控API函数的调用为开发人员提供了极大的帮助,使他们可以跟踪API调用过程中的某个特定的不可见的动作,并有利于发现一些没有注意到的错误。例如,它可以监视与API调用的相关的内存空间以检查内存泄露情况。(2)调试 除了传统的调试方法,API钩子
14、也是一种广泛使用的调试技术。引入API钩子技术可以考察各组件的实现以及组件之间的相互关系。通过截获API也可以获取可执行的二进制代码中的某些信息。(3)深入了解操作系统开发人员经常需要了解操作系统内部的实现,以进行程序调试。特别是在某些API没有提供足够的说明文档的情况下,钩子技术可以帮助程序员理解它们的内部结构。(4)扩展原始的功能 通过向窗口应用程序中嵌入用户代码可以方便的扩展程序模块已有的功能。比方说,很多第三方软件不能满足用户对于信息安全级别的要求,程序员可以通过钩子技术监控应用程序,并在原有的功能中加入相关的预处理和对运行结果的处理。这样,不需要修改和重新编译源代码就可以改变应用程序
15、的行为。1.5 本章小结本章对本论文的写作背景、应用性和先进性和发展前景进行了研究。通过DLL注入与HOOK技术完成其它应用程序中大量数据的捕捉、存储和分析。主要使用的关键技术:DLL运行原理、制作与注入,windows API的替换等。-33- 第2章 需求与分析第2章 需求与分析2.1 DLL简介自从Microsoft公司推出第一个版本的Windows操作系统以来,动态链接库(DLL)一直是这个操作系统的基础。Windows API 中的所有函数都包含在DLL中。3个最重要的DLL是: Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行
16、用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。创建DLL常常比创建应用程序更容易,因为DLL往往包含一组应用程序可以使用的自主函数。在DLL中通常没有用来处理消息循环或创建窗口的支持代码。DLL只是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个DLL将要调用的一组函数。当所有源代码文件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。但是,对于一个DLL来说,必须设定该连链程序的DLL开关。这个开关使得链接程序能够向产生的DLL文件映像发出稍有不同的信息,这样,操作系统加载程序就能将该文件映像视为一个DLL而不
17、是应用程序。 在应用程序(或另一个DLL)能够调用DLL中的函数之前,DLL文件映像必须被映射到调用进程的地址空间中。若要进行这项操作,可以使用两种方法中的一种,即加载时的隐含链接或运行期的显式链接。 当创建DLL模块时,首先应该建立一个头文件,该文件包含了你想要输出的变量(类型和名字)和函数(原型和名字)。头文件还必须定义用于输出函数和变量的任何符号和数据结构。你的DLL的所有源代码模块都应该包含这个头文件。另外,必须分配该头文件,以便它能够包含在可能输入这些函数或变量的任何源代码中。拥有单个头文件,供DLL创建程序和可执行模块的创建程序使用,就可以大大简化维护工作。但要注意,尽量避免输出变
18、量或类,否则可能会使代码难以维护。 无论何时,进程中的线程都可以决定将一个DLL映射到进程的地址空间,方法是调用下面两个函数中的一个:HINSTANCE LoadLibrary(PCTSTR pszDLLPathName);HINSTANCE LoadLibraryEx( PCTSTR pszDLLPathName, HANDLE hFile; DWORD dwFlags);这两个函数均用于找出用户系统上的文件映像(使用上一章中介绍的搜索算法),并设法将DLL的文件映像映射到调用进程的地址空间中。两个函数返回的HINSTANCE值用于标识文件映像映射到的虚拟内存地址。如果DLL不能被映射到进程
19、的地址空间,则返回NULL。一旦DLL模块被显式加载,线程就必须获取它要引用的符号的地址,方法是调用下面的函数:FARPROC GetProcAddress( HINSTANCE hinstDll, PCSTR pszSymblolName);一个DLL可以拥有单个进入点函数DllMain。系统在不同的时间调用这个进入点函数,这个问题将在下面加以介绍。这些调用可以用来提供一些信息,通常用于供DLL进行每个进程或线程的初始化和清除操作。如果你的DLL不需要这些通知信息,就不必在DLL源代码中实现这个函数。 当DLL被初次映射到进程的地址空间中时,系统将调用该DLL的DllMain函数,给它传递参
20、数fdwReason的值DLL_PROCESS_ATTACH。只有当DLL的文件映像初次被映射时,才会出现这种情况。如果线程在后来为已经映射到进程的地址空间中的DLL调用LoadLibraryEx函数,那么操作系统只是递增DLL的使用计数,它并不再次用DLL_PROCESS_ATTACH的值来调用DLL的DllMain函数。 当处理DLL_PROCESS_ATTACH时,DLL应该执行DLL中的函数要求的任何与进程相关的初始化。例如, DLL可能包含需要使用它们自己的堆栈(在进程的地址空间中创建)的函数。通过在处理DLL_PROCESS_ATTACH通知时调用HeapCreate函数,该DLL
21、的DllMain函数就能够创建这个堆栈。已经创建的堆栈的句柄可以保存在DLL函数有权访问的一个全局变量中。注入有几个核心的API函数:LoadLibrary - 目标进程通过调用此函数来加载我们自己编写的DLL。OpenProcess - 用于打开要寄生的目标进程。VirtualAllocEx/VirtualFreeEx - 用于在目标进程中分配/释放内存空间。WriteProcessMemory - 用于在目标进程中写入要加载的DLL名称。CreateRemoteThread - 远程加载DLL的核心内容,用于控制目标进程调用API函数。LoadLibrary - 目标进程通过调用此函数来加
22、载病毒DLL。12.2 注入技术下面是几种向目标进程中注入用户代码(以下都用DLL说明)的方法。(1) 注册表如果要向与USER32.DLL链接的进程中注入用户DLL,只需要将DLL的名字加入注册表的这个键中: HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCuurrentVersionWindowsAppInit_DLLs即可。这个值可以是单个DLL的名字,也可以是由逗号或空格分隔开的一组DLL的名字。这个键下面的所有DLL都会被当前会话中的应用程序所加载(MSDN documentagion ),实际的加载是在USER32初始化的时候进行的。USE
23、R32读取该键中涉及到的DLL,然后在DllMain的代码中为他们调用LoadLibrary()。这种方法简单易行,但有它的限制条件。首先,它仅适用于与USER32.DLL相关的程序;其次,只有Windows NT和Windows 2000支持这种方式。另外,尽管这是一种安全无害的方式,但也有一些不足之处: 为了激活或解除DLL的注入,必须重新启动Windows 由于这是操作系统提供的功能,因此用户无法控制DLL的注入。也就是说,所有的GUI应用程序都会加载用户定义的DLL,不管是否需要。这就增加了系统的负担。(2) Windows提供的系统范围的钩子Windows Hooks是一种比较流行的
24、钩子技术。在MSDN中,钩子被描述成操作系统消息处理机制中的一个陷入。应用程序可以通过一段过滤程序监视进程和操作系统之间的消息传递,在消息到达目标窗口进程之前对其进行处理。钩子程序通常在DLL中实现。钩子代码运行在每一个被钩的进程的地址空间中。安装钩子需要调用SetWindowsHookEx(),操作系统把DLL映射到每一个目标进程的地址空间。因此DLL中的全局变量将被进行预处理,无法被加载钩子的进程共享,包含共享数据的变量必须放在一个共享的数据段中。下面的图中,钩子被Hook Server注入到两个应用程序的地址空间中。2一旦注入成功,SetWindowsHookEx()会返回这个钩子的句柄
25、,用于hook代码的最后调用CallNextHookEx()时使用。/-/ GetMsgProc/ Filter for the WH_GETMESSAGE - it's just a dummy/-LRESULT CALLBACK GetMsgProc( int code, / hook code WPARAM wParam, / removal option LPARAM lParam / message ) / We must pass the all messages on to CallNextHookEx. return :CallNextHookEx(sg_hGetMsg
26、Hook, code, wParam, lParam);代码中sg_hGetMsgHook由SetWindowsHookEx()获得并由CallNextHookEx()使用,因此它的值必须被所有被钩的进程以及hook服务程序共享。为此,我们必须将其存储在共享的数据段中。下面的例子引入了#pragma data_seg()。需要说明的是,共享数据段中的数据必须初始化,否则它们会被放在默认的数据段中,而#pragma data_seg()就变得无效了。/-/ Shared by all processes variables/-#pragma data_seg(".HKT")H
27、HOOK sg_hGetMsgHook = NULL;BOOL sg_bHookInstalled = FALSE;/ We get this from the application who calls SetWindowsHookEx()'s wrapperHWND sg_hwndServer = NULL;#pragma data_seg()当钩子DLL成功加载到目标进程的地址空间之后,想要卸载它由两种情况,要么是hook服务程序调用UnhookWindowsHookEx(),要么是应用程序被关闭。当调用UnhookWindowsHookEx()时,操作系统会找到被hook的进程
28、,将DLL的锁数目减1,这样,当锁数目变为0的时候,DLL就会自动从进程的地址空间中移除。这种方法的优点是:Windows 9x和Windows NT/2K均支持这种机制与使用注册表方式不同,当不再钩子DLL时,可以调用UnhookWindowsHookEx()卸载钩子但它也有不足之处: 它会大大降低系统的性能,因为系统要增加大量对消息处理的过程 不容易调试。而且如果打开了多个VC窗口,调试过程会变得更加复杂 它可能会影响整个系统的正常运行,有时不得不重新启动以恢复系统运作(3) 用CreateRemoteThread()函数注入DLL 这种方法仅适用于Windows NT/2K。在Windo
29、ws 9x中调用这个函数,不会出错,但返回值永远是NULL。CreateRemoteThread()函数用于创建一个运行在其他进程虚拟空间中的线程。 通过remote threads来注入DLL是Jeffrey Ritcher提出的方法。它的基本原理很简单,但却是一种相当不错的方法。我们知道,任何进程都可以调用LoadLibrary()来加载DLL,现在的问题就是,在没有访问权限的情况下,如何使一个外部进程按照我们的意愿调用LoadLibrary()?这里有一个诀窍,先看一下CreateRemoteThread()的参数。 HANDLE CreateRemoteThread( HANDLE h
30、Process, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );参数hProcess指定了目标进程,而lpStartAddress指定了所创建线程需要运行的函数地址,lpParameter指定了这个函数的参数。这个函数被定义成ThreadProc() DWORD WINAPI ThreadProc( LPVOID
31、lpParameter );现在再看看LoadLibrary的定义, HMODULE LoadLibrary( LPCTSTR lpFileName );可以看出,他们具有"相同"的模式。这样我们就可以用LoadLibrary()作为这个运行的函数,在远程线程创建的时候被调用,它的参数由lpParameter提供,即我们自己定义的钩子DLL。LoadLibrary()函数的入口地址可以用GetProcAddress()获得。这样,当远程进程运行的时候,它就会调用LoadLibrary()为所在进程加载钩子DLL。还有一点需要注意,当调用CreateRemoteThread(
32、)时,它首先要调用OpenProcess()函数打开目标进程。在这里就有一个访问权限问题。那些操作系统的进程,都有着严格的权限限制,直接打开这些进程可能会导致失败。也就是说,应用程序必须要有足够的权限才可以改变操作系统的行为。为了得到访问系统进程资源的权限,必须获得调试特权(debug privilege)。2.3 HOOK技术的原理钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。钩子实际上是一
33、个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程
34、序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。钩子子程是一个应用程序定
35、义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。系统钩子与线程钩子,SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。线程钩子用于监视指定线程的事件消息。线程钩子一般在当前线程或者当前线程派生的线程内。系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。系统自动将包含“钩子回调函数”的DLL映射到受钩子函数影响的所有进程的
36、地址空间中,即将这个DLL注入了那些进程。几点说明:(1)如果对于同一事件(如鼠标消息)既安装了线程钩子又安装了系统钩子,那么系统会自动先调用线程钩子,然后调用系统钩子。(2)对同一事件消息可安装多个钩子处理过程,这些钩子处理过程形成了钩子链。当前钩子处理结束后应把钩子信息传递给下一个钩子函数。(3)钩子特别是系统钩子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装钩子,在使用完毕后要及时卸载。52.4 Hook的应用模式(1) 观察模式最为常用,像Windows提供的SetWindowHook就是典型地为这类应用准备的。而且这也是最普遍的用法。这个模式的特点是,在事情发生的时候,发出
37、一个通知信息。观察者只可以查看过程中的信息,根据自己关心的内容处理自己的业务,但是不可以更改原来的流程。如全局钩子中,经常使用的鼠标消息、键盘消息的监视等应用。金山词霸屏幕取词的功能是一个典型的应用(具体技术可以参考此类文章)。(2) 注入模式这个模式和观察模式最大的不一样的地方在于,注入的代码是为了扩展原始代码的功能业务。插件模式是此类模式的典型案例。不管瘦核心的插件系统(如Eclipse)还是胖核心的插件系统(如Delphi、Visual Studio等IDE环境),其对外提供的插件接口都是为了扩展本身系统的功能的。这种扩展的应用方式的典型特点,就是新的扩展代码和原来的代码会协调处理同类业
38、务。(3) 替换模式如果针对应用目的不同,可以叫修复模式或破解模式。前者是为了修改系统中的BUG,后者是为了破解原有系统的限制。很多黑客使用此种模式,将访问加密锁的DLL中的导出表,替换成自己的函数,这样跳过对软件的控制代码。这类应用的难点是,找出函数的参数。这类模式的特点是,原有的代码会被新的代码所替换。前面三个是基本模式,还有很多和实际应用相关的模式。(4) 集权模式此类模式的出现,大都是为了在全部系统中,统一处理某类事情。它的特点不在于注入的方式,而在于处理的模式。这个模式,大都应用到某类服务上,比如键盘服务,鼠标服务,打印机服务等等特定服务上。通过统一接管此类服务的访问,限制或者协调对
39、服务的访问。比如键盘锁功能的实现,就是暂时关闭键盘的所有应用。这类模式的特点主要会和特点服务有关联。(5) 修复模式替换模式的一种,这里强调的是其应用的目的是为了修复或扩展原有系统的功能。(6) 破解模式替换模式的一种,这里强调的是其应用的目的是为了跳过原有系统的一部分代码。如加密检测代码,网络检测代码等等。(7) 插件模式注入模式的一种,在系统的内部直接依靠HOOK机制进行扩展业务功能。(8) 共享模式这类应用中,经常是为了获取对方的数据。必然我希望获取对方系统中,所有字符串的值。可以通过替换对方的内存管理器,导出所有字符串。这个应用比较特殊。不过其特点在于,目的是达到系统之间的数据共享。其
40、实现,可能是观察模式,也可能是替换模式。2.5 钩子应用级别上面叙述的DLL注入技术是侦测系统中的关键部分,提供了控制进程的手段。然而如果想要进一步控制目标进程中API函数的行为,注入技术是不够的。在接下来的这一部分,将要介绍几种可行的钩子,以及他们的优缺点。根据钩子应用的级别,可以分为两种情况-内核级和用户级。理解这两种模式首先要知道Win32子系统API和本地API的关系。内核级与用户级钩子实现方法的最大不同之处在于,内核级钩子是通过一个内核态的驱动程序封装起来的,而用户级钩子通常是引入一个用户定义的DLL。(1)NT 内核级钩子在NT的内核态系统服务中实现钩子有很多种方法。比较常用的一种
41、拦截机制最初是由Mark Russinovich和Bryce Cogswell在他们的文章Windows NT System-Call Hooking中提出来的。其基本思想是在用户态下面设置拦截以监视NT的系统调用。它在用户态的程序即将接受操作系统服务之前的那一点设置了钩子,因此这是一种很灵活的机制。(2)Win32 用户级钩子代理DLL,截获API最简单的办法就是用一个同名的DLL来替换原有的DLL,当然,新的DLL要负责导出原DLL中的所有符号。这就需要在DLL的导出段中添加函数的转移调用,它可以将一个函数的调用委派到另外一个DLL中的函数。例如#pragma comment(linker
42、, "/export:DoSomething=DllImpl.ActuallyDoSomething")如果采用这种技术,新的DLL的一定要兼容原有的DLL。当一个程序被运行的时候,它所连接的DLL也被相应的加载到内存中。由于事先无法得知DLL将被加载到的地址,所以也就无法确定每一个导出函数的实际入口地址。遍历整个代码的映像以确定每一个函数的地址会增加很多额外的处理时间,从而拖垮系统运行的效率。这里的关键是,每一次对某个导入函数的调用实际上都要转移到相同的地址去。因此,在IAT表中,每一次对导入函数的调用都是一个间接调用,它使用JMP指令转移到真正的代码地址。使用这种方法,
43、程序加载时就无需搜索整个文件的镜像。引入了GDI32.DLL中的TextOutA()和GetStockObject()函数。利用IAT表的拦截系统必须查出记录导入函数地址的位置,然后以用户提供的函数的地址替换它。这里最重要的一点是,新的函数必须与原来的函数有完全一样的属性。关键的步骤包括:·在IAT中查找导入段(imported section)·查找导出目标函数的IMAGE_IMPORT_DEOR段·找到记录函数原始地址的IMAGE_THUNK_DATA段 ·用自定义的函数替换原函数 替换了函数的地址,就可以保证每一次调用都会被定向到拦截函数处。 IA
44、T中的.idata域不一定是可写的区域,我们必须确定.idata是否可写。这可以由VirtualProtect()函数实现。2.6 Java简介Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前
45、景。bcb指的是Borland C+ Builder的简称,Borland是公司名,C+ Builder是一款windows下的集成开发工具。Java由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。Java平台由Java虚拟机(Java Virtual Machine,简称JVM)和Java 应用编程接口(Application Programming Interface,简称API)构成。Java应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,
46、Java应用程序就可运行。Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。常用的Java平台基于Java1.4,最近版本为Java1.7。Java分为三个体系J2SE(Java2 Platform Standard Edition,java平台标准版),J2EE(Java 2 Platform,Enterprise Edition,java平台企业版),J2ME(Java 2 Platform Micro Edition,java平台微型版)。Java的诞生时对传统计算机模式的挑战,对计算机软
47、件开发和软件产业都产生了深远的影响:(1)软件4A目标要求软件能达到任何人在任何地方在任何时间对任何电子设备都能应用。这样能满足软件平台上互相操作,具有可伸缩性和重要性并可即插即用等分布式计算模式的需求。(2)基于构建开发方法的崛起,引出了CORBA国际标准软件体系结构和多层应用体系框架。在此基础上形成了Java.2平台和.NET平台两大派系,推动了整个IT业的发展。(3)对软件产业和工业企业都产生了深远的影响,软件从以开发为中心转到了以服务为中心。中间提供商,构件提供商,服务器软件以及咨询服务商出现。企业必须重塑自我,B2B的电子商务将带动整个新经济市场,使企业获得新的价值,新的增长,新的商
48、机,新的管理。(4)对软件开发带来了新的革命,重视使用第三方构件集成,利用平台的基础设施服务,实现开发各个阶段的重要技术,重视开发团队的组织和文化理念,协作,创作,责任,诚信是人才的基本素质。总之,目前以看到了Java对信息时代的重要性,未来还会不断发展,Java在应用方面将会有更广阔的前景。Java编程语言的风格十分接近C、C+语言。Java是一个纯粹的面向对象的程序设计语言,它继承了 C+语言面向对象技术的核心。Java舍弃了C语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用
49、的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。Java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。编辑Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可
50、以使用记事本(Notepad)、EditPlus等程序,在Linux平台上可使用VI工具等。在记事本中输入如下代码:public class HelloWorld/Java程序的入口方法,程序将从这里开始执行public static void main(String args)/向程序台打印一条语句System.out.println("Hello world!");编辑上面的Java文件时,注意程序中粗体字标识的单词,Java程序严格区分大小写。将上面文本保存为Hello Word.java,该文件就是Java程序的源程序。编写好Java程序的源代码后,接下来应该编译该
51、Java源文件来生成字节码了。2.7 Java开发环境搭建分析数据的实现语言是Java,自然少不了Java语言环境的搭建步骤,为了构建Java开发环境,必须首先上甲骨文公司的官方网站下载JDK的安装包,根据自己电脑的操作系统选择正确的版本下载。然后双击下载好的JDK安装文件,按照提示将JDK安装到指定的文件夹,配置好classpath以及cpath环境变量即可。具体操作步骤如下:(1)打开我的电脑-属性-高级-环境变量 (2)新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:Program FilesJavajdk1.7.0变量名:CLASSPATH
52、 变量值:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar;(3)选择“系统变量”中变量名为“Path”的环境变量,双击该变量,把JDK安装路径中bin目录的绝对路径,添加到Path变量的值中,并使用半角的分号和已有的路径进行分隔。 变量名:Path 变量值:%JAVA_HOME%bin;%JAVA_HOME%jrebin;这是java的环境配置,配置完成后直接启动eclipse,它会自动完成java环境的配置2.8 Java主要特性Java语言是简单的。Java语言的语法与C语言和C+语言很接近,使得大多数程序员很容易学习和使用Java7。另一方面
53、,Java丢弃了C+中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。Java语言是面向对象的。Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C+语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。Java语言是分布式的。Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个
54、网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。Java语言是安全的。Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类Cla
55、ssLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。Java语言是体系结构中立的。Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。Java语言是可移植的。这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。Java语言是解释型的。如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。Java是高性能的。与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C+。Java语言是多线程的。在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水溶液中的离子反应与平衡(讲义)-2023年高考化学二轮复习(新高考专用)
- CN120208785A 一种碳酸二乙酯热泵精馏装置及工艺
- 老年人保健知识培训小结课件
- 生物的变异和进化-2025年高考生物专项复习原卷版
- 人教版八年级英语下册专练:短文填空20篇(含答案)
- CN120198213A 基于穿透监管的自适应风险评估调整方法及系统
- 人教版八年级英语下册 Unit 1-Unit 10 期末复习之作文书面表达范文
- 配送员礼仪基础知识培训课件
- 2025版水电费远程抄表与用户服务合同
- 2025年企业研发项目抵押借款合同
- 2025年天津市中考语文试卷深度评析及2026年备考策略
- 2025年继电保护实操考试题带答案
- (2025)国库知识竞赛题库及答案
- (2025年标准)产假提前上班协议书
- 医院价格委员会管理制度及实施
- 2025年重庆市面向社会公开选拔社区专职工作者后备库人选考试(综合知识)历年参考题库含答案详解(5套)
- 2025-2026学年人教鄂教版(2024)小学科学三年级上册(全册)教学设计(附目录P137)
- 2025年广东省中考语文试卷(含答案解析)
- 2025年质量月知识竞赛题库含答案(初赛)
- (高清版)T∕CES 243-2023 《构网型储能系统并网技术规范》
- 山东淄博小升初数学真题试卷
评论
0/150
提交评论