【vc++精品源码栏目提醒】:网学会员为广大网友收集整理了,利用Debug函数实现API函数的跟踪 - 讲义教程,希望对大家有所帮助!
利用Debug函数实现API函数的跟踪 本文由cnfczn贡献 如果我们能自己编写一个类似调试器的功能 这个调试器需要实现我们对于跟踪监视工具的 要求即自动记录输入输出参数自动让目标进程继续运行。
下面我们就来介绍在不知道函 数原型的情况下也可以简单输出监视结果的方案——用 Debug 函数实现 API 函数的监视。
用 Debug 函数实现 API 函数的监视 大家知道 可以用来调试程序 VC 除了调试 Debug 程序 当然也可以调试 Release 程 序 调试 Release 程序时为汇编代码。
如果知道函数的入口地址只需在函数入口上设置 断点当程序调用了设置断点的函数时VC 就会暂停目标程序的 运行你就可以得到目 标程序内存的所有你希望得到的东西了。
一般来说只要你有足够的耐心和毅力以及一些 汇编知识对于监视 API 函数的输入输出参数还 是可以完成的。
不过由于 VC 的调试器会在每次断点时暂停目标程序的运行对目标程序的过多的暂停对 于监视任务而言实在不能忍受。
所以不会有太多的人真的会用 VC 的调试器作为一个良好 的 API 函数监视器的。
如果 VC 调试器能够在你设置好断点后 在运行时自动输出断点时的堆栈值 也就是函数 的 输入参数在函数运行结束时也自动输出堆栈值也就是函数的输出参数和 CPU 寄存 器的值就是函数返回值并且不会暂停目标程序。
所有一切都是自 动的无需我们干预。
你会用它来作为监视器吗我会的。
我不知道如何让 VC 这样作或许 VC 真的可以这样但我不知道。
有人知道的话请通 知 我一声谢谢但我知道显然 VC 也是通过调用 Windows API 函数完成调试器的任务 而且这些函数显然可以实现我的要求。
我需要作的事情就是自己利用这些 API 函数写 一个简单的调试器在目标程序断点发生 时自动输出监视结果并且自动恢复目标程序的运 行。
显然用 VC 调试器作为监视器的话无需知道目标函数的原型就可以得到简单的输入输 出 参数和函数运行结果而且由于监视代码没有注入目标程序中就不会出现监视目标函数 和监视代码的冲突。
VC 调试器显然可以跟踪递归函数也可以跟踪 DLL 模块调用 DLL 本 身的函数以及 EXE 内部调用自身的函数。
只要你知道目标函数的入口地址就可以跟踪 了监视 Exe 自身的函数可以通过生成 Exe 模块时选择输出 Map 文件就可以参考 Map 文件得到 Exe 内部函数的地址。
没有听说 VC 不能调试多线程的最多是说调试多线程 比较麻烦----证明多 线程是可以调试的。
显然VC 也可以调试 DllMain 中的代码。
这些 已经可以证明通过调试函数可以实现我们的目标了。
如何编写实现我 们目标的程序需要哪些调试函数 如何编写实现我们目标的程序需要哪些调试函数 首先让目标程序进入被调试状态 首先让目标程序进入被调试状态 对于一个已经启动的进程而言利用 DebugActiveProcess 函数就可以捕获目标进程将 目标进程进入被调试状态。
BOOL DebugActiveProcessDWORD dwProcessId 参数 dwProcessId 是目标进程的进程 ID。
如何通过 ToolHelp 系列函 数或 Psapi 库函数 获得一个运行程序的进程 ID 在很多文章中介绍过 这里就不再重复。
对于服务器程序而言 由于没有权限无法捕获目标进程可以通过提升 监视程序的权限得到调试权限进行捕获目 标进程用户必须拥有调试权限。
对于启动一个新的程序而言通过 CreateProcess 函数设置必要的参数就可以将目标程 序进入被调试状态。
BOOL CreateProcessLPCTSTR lpApplicationName LPTSTR lpCommandLine LPSECURITY_ATTRIBUTES lpProcessAttributes LPSECURITY_ATTRIBUTES lpThreadAttributes BOOL bInheritHandles DWORD dwCreationFlags LPVOID lpEnvironment LPCTSTR lpCurrentDirectory LPSTARTUPINFO lpStartupInfo LPPROCESS_INFORMATION lpProcessInformation 该函数的具体说明请参考 MSDN在这里我仅介绍我们感兴趣的参数。
这里和一般的用 法 不同作为被调试程序 dwCreationFlags 必须设置为 DEBUG_PROCESS 或 DEBUG_ONLY_THIS_PROCESS。
这样启 动的目标程序就会进入被