转:http://tech.ccidnet.com/art/295/20030116/36809_1.html
关键字: Windows;调试;API;跟踪;监视
来 源: 赛迪网
跟踪监视方案概览
作者:彭春华 发文时间:2003.01.16
当我们对某一目标程序进行API函数的跟踪监视分析时,根据跟踪监视的目标,基本上有以下几种途径实现对API函数的跟踪监视:
写Log记录分析
如果拥有目标程序的源代码,就可以在关键的API函数的入口点和出口点记录API的参数和运行结果。在除错程序中是经常可以看到这种方法的。该方法的缺点就是必须拥有源代码,每次修改Log时必须重新编译源代码。由于该方案和我们要讨论的目标不同,在此不作讨论。
将监视代码注入目标程序
该方案的原理是在目标程序运行时,将监视代码注入到目标程序的进程空间。监视代码通过前期的准备工作,修改目标程序的运行代码,使得目标程序调用指定的API函数时,运行指令会跳转到监视代码中,这样,监视代码就可以记录下API函数的运行参数,然后,监视代码在运行用来的API函数代码。在用来的API函数代码运行完后,再回到监视代码中,将来下运行结果,再返回目标程序。其运行原理图为:
在32位Windows平台上,各进程空间是独立的。要在目标程序中运行监视代码就必须将监视代码注入到目标进程。一种常用的方法就是将监视代码编译成一个DLL,再将该DLL注入到目标进程中。关于将DLL注入目标进程的文章有很多,比如在《Windows核心编程》上就详细介绍过CreateRemoteThread和SetWindowsHookEx的方法,关于DLL的注入不是本文的重点,在这里就不进行介绍,请读者参考其它相关的文章。
利用在目标程序中注入监视代码实现监视的方案,常见以下几种方式:
1.在目标函数写入跳转指令(jmp),跳转至监视代码实现监视
2.和第1种方式相同,在目标函数入口写入跳转指令,但在监视代码中实现监视的机制不同。
3.利用API Hook功能,修改EXE和DLL的导入表(Import Address Table),将监视代码中函数入口地址写入导入表中,当EXE或DLL调用其它DLL中API函数时,就可以跳转到监视代码中实现跟踪监视。
这里介绍的1~3种方案在很多资料上都介绍过,这里不再重复,他们都有一个最大的缺点:监视某个函数时必须知道函数的原型(即参数个数和调用方式——WINAPI调用还是其它?)。在写监视代码时必须确保监视代码函数的原型和被监视函数的原型一致。希望增加一个监视函数时必须增加一个监视代码。详细可以参考Detours和API Hook。
用代理DLL实现API函数的监视
用代理DLL实现API函数的监视就是将原来的DLL改名,用一个新的DLL代替原来的DLL。这个新的DLL的导出函数和用来DLL的导出函数相同,并且导出函数的顺序和原来的DLL一样。新的DLL名字和原来DLL的名字也一样。在新DLL中的每个函数实现代码中,就负责记录运行参数和运行结果,同时调用原来DLL的函数。其运行方式如图所示:
比如:A.exe调用B.DLL,希望监视B.DLL的导出函数时,就将B.DLL改名为C.DLL,生成一个新的监视模块B.DLL,其导出函数名和顺序和原来B.DLL完全相同,这样A.EXE调用B.DLL时就进入了监视模块,实现跟踪监视的目标。
这里新的B.DLL就是原来B.DLL的代理了,所有调用B.DLL的函数都会经过新的B.DLL得到监视。如果B.exe也调用了B.DLL,这样,不止A.exe的调用被监视了,B.exe的调用也被监视了。监视记录就多了一些无用的数据,对分析就增加了难度。对于这种方式,本文在此也不着更多的介绍。
利用调试函数实现跟踪监视
跟踪监视程序作为调试器对目标进程进行调试,在目标进程的API函数的入口设置断点。这样,当目标进程调用被监视的API函数时,目标程序将产生调试中断,系统将中断调试信息通知跟踪监视程序,同时被调试的目标进程挂起。这样,跟踪监视程序就可以访问目标进程的内存,得到API函数的参数。然后通知系统让挂起的目标进程继续运行。同样,在API函数的出口处再设置断点,就可以得到API函数的处理结果。
通过调试函数实现跟踪监视的方案实际上最基本的用法就是调试器。在调试器中可以轻松得到API函数的输入输出参数的,也可以得到变量的值。但利用调试器来作为跟踪监视程序的话,就非常的不方便了。产生断点调试信息时,首先必须自己记录下API函数的输入输出参数,其次让目标进程继续运行必须人工进行干预。由于过多的需要人工干预,在作为跟踪分析的工具上就无法有太大的作用。作为一个比较实用的跟踪监视工具,应该可以自动记录下输入输出参数,同时可以让目标进程自动进行运行而无需用户的干预。
那么,如果我们能自己编写一个类似调试器的功能,这个调试器只需要实现我们对于跟踪监视工具的要求,即自动记录输入输出参数,自动让目标进程继续运行。就可以达到跟踪监视工具的目的了。在下一篇文章中我们将对如何用调试函数达到这一要求进行详细说明。
参考资料:
1.《Windows核心编程》 , Jeffrey Richter,机械工业出版社
2.微软的MSDN
3.detours 可以在http://research.microsoft.com/sn/detours/ 上得到源代码。detours功能在WinNT和W2K下有效,对9X不支持。
(责任编辑 Sunny)
ps:本文参考代码http://download.csdn.net/detail/dragoo1/5024499