模块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函数的输入输出参数,其次让目标进程继续运行必须人工进行干预。由于过多的需要人工干预,在作为跟踪分析的工具上就无法有太大的作用。作为一个比较实用的跟踪监视工具,应该可以自动记录下输
入输出参数,同时可以让目标进程自动进行运行而无需用户的干预。
那么,如果我们能自己编写一个类似调试器的功能,这个调试器只需要实现我们对于跟踪监视工具的要求,即自动记录输入输出参数,自动让目标进程继续运行。就可以达到跟踪监视工具的目的了。在下一篇文章中我们将对如何用调试函数达到这一要求进行详细说明。
用Debug函数实现API函数的跟踪
本文详细介绍了如何利用调试函数实现API跟踪的方法,通过这种方法我们可以自己编写一个类似调试器的功能,实现自动记录输入输出参数,并让目标进程继续运行...
如果我们能自己编写一个类似调试器的功能,这个调试器需要实现我们对于跟踪监视工具的要求,即自动记录输入输出参数,自动让目标进程继续运行。下面我们就来介绍在不知道函数原型的情况下也可以简单输出监视结果的方案——用Debug函数实现API函数的监视。
用Debug函数实现API函数的监视
大家知道,VC可以用来调试程序,除了调试Debug程序,当然也可以调试Release程序(调试Release程序时为汇编代码)。如果知道函数的入口地址,只需在函数入口上设置断点,当程序调用了设置断点的函数时,VC就会暂停目标程序的运行,你就可以得到目标
程序内存的所有你希望得到的东西了。一般来说,只要你有足够的耐心和毅力,以及一些汇编知识,对于监视API函数的输入输出参数还是可以完成的。
不过,由于VC的调试器会在每次断点时暂停目标程序的运行,对目标程序的过多的暂停对于监视任务而言实在不能忍受。所以,不会有太多的人真的会用VC的调试器作为一个良好的API函数监视器的。
如果VC调试器能够在你设置好断点后,在运行时自动输出断点时的堆栈值(也就是函数的输入参数),在函数运行结束时也自动输出堆栈值(也就是函数的输出参数)和CPU寄存器的值(就是函数返回值),并且不会暂停目标程序。所有一切都是自动的无需我们干预。你会用它来作为监视器吗?我会的。
我不知道如何让VC这样作(或许VC真的可以这样,但我不知道。有人知道的话请通知我一声,谢谢),但我知道显然VC也是通过调用Windows API函数完成调试器的任务,而且,这些函数显然可以实现我的要求。我需要作的事情就