dll源代码调试全攻略~包括ISAPI,API HOOK,GINA等dll的源代码调试方法~

来源:互联网 发布:小米移植网络助手 编辑:程序博客网 时间:2024/05/17 00:01

本文转自:http://blog.csdn.net/kesummer/article/details/2580114

先明白一点的是,只要有模块(exe,dll,sys等是模块)对应的正确符号文件,我们都可以使用代码去调试。

1:普通dll 首先写一个exe加载要调试的dll,下好断点后再按f5,会弹出一个框,让你输入调用该dll的程序,我们只要填入加载该dll的exe的路径即可。

或者在project->setting->debug里填入调用该dll的路径也是一样的。

2:com,activex控件。和上述基本一致。如果是IE插件,那么就填入IE的路径。

3:shell扩展这个需要注意一些问题:下面的话来自Windows Shell扩展编程完全指南(系统崩溃请找该文的作者,切勿来找我,谢谢) 当shell扩展被 Explorer调用后, 它会在内存中呆上一段时间, 这会使你无法重新编译并生成Shell扩展DLL文件.

要让 Explorer 更迅速地卸载Shell扩展执行文件,需要创建如下注册表项: HKLM/Software/Microsoft/Windows/CurrentVersion/Explorer/AlwaysUnloadDLL 并将其值设为 "1". 对于Win9x, 这是你能做的最好的方法。

而在Win NT/2000上, 你可以找到如下键: HKCU/Software/Microsoft/Windows/CurrentVersion/Explorer 并创建一个名为DesktopProcess的DWORD值 1. 这会使桌面和任务栏运行在同一个进程中, 而其他每一个 Explorer 窗口都运行在它自己的每一个进程内. 也就是说,你可以在单个的Explorer 窗口内进行调试, 而后只要你关闭该窗口,你的DLL就会被马上卸载, 这就避免了因为DLL正被Windows使用而无法替换更新. 而如果不幸出现这种情况,你就不得不注销登录后再重新登录进Windows从而强制卸载使用中的Shell扩展DLL.

----------- 完成上面的任务后,和普通DLL那样调试,不过要选择系统目录里面的explorer.exe

4:ISAPI DLL 建议使用vs2003以及以上版本的vc。 MFC ISAPI都有一个全局类,命名为C+工程名+Extension 在此类的构造函数的第一行之前加上下面三行代码的其中一行 1:)MessageBox(NULL,"Please debug me!","Debug",MB_OK|MB_SERVICE_NOTIFICATION); 2:)DebugBreak(); 3:)_asm int 3 然后在生成目录的文件夹上点右键,以debug为例,选择"共享与安全",在web共享里面选择”共享“该文件夹,权限设置为”执行“最后点确定。运行IIS,在浏览器里面输入http://127.0.0.1/debug/isapi的名字(如testisapi.dll,如果需要输入密码则运行inetmgr,找到debug虚拟目录,点属性,然后勾选匿名访问。这时会弹出一个对话框,先别点确定,回到vs2003中,在要调试的地方下好断点,然后在任务管理器中找到用户名为IWAM_XX的DLLHOST的进程ID,然后在vs2003菜单中选择调试->进程->选择刚才找到的进程ID,然后点附加,再点刚才弹出的框的确定(如果使用2或者3则点取消),然后程序就会停在断点下了,如果没停则是没下好断点,或者RPWT。

5:消息钩子这个简单啊。。都不想再说了,假设写了个键盘钩子,需要勾住计算器的击键操作。先下好断点,在vs2003菜单中选择调试->进程->选择计算器,点附件按钮,最后在计算器上击键,程序就会停在断点处。

6:API HOOK 如果是注入到别的进程的API HOOK,那么调试方法和消息钩子一样。挂钩本进程,则直接启动调试。。。实在太简单了。

7:GINA 这个稍微繁琐。方法多种多样。

1:)参考下面的文章如何在单个计算机上调试 GINA DLL http://support.microsoft.com/kb/260901/zh-cn How to debug a GINA DLL on a single computerhttp://support.microsoft.com/default.aspx?scid=kb;EN-US;Q260901

2::)用NTSD调试,修改下面注册表,(来自MSDN,不行请找微软) HKEY_LOCAL_MACHINE      Software           Microsoft                Windows NT                     CurrentVersion                          Image File Execution Options                               winlogon.exe                                    Debugger = ntsd -d

 3:)双机kernel windbg与user ntsd联合调试,在vm里面设置系统以调试方式启动,然后在目标系统的注册表加上 HKEY_LOCAL_MACHINE/Software/Microsoft/Windows NT/CurrentVersion/Image File Execution Options/WinLogon.EXE/Debugger

ntsd -d -x -g

,然后重新启动vm里面的系统,选择调试方式启动,然后开启windbg,选择内核调试,连接上系统。等啊等,winlogon会被ntsd中断,并且反映到windbg里面,这时是打开代码下断点的好机会。这个就是所谓的kernel windbg与user ntsd联合调试。

-----------8:其它调试方式使用TRACE宏把信息输出到dbgview上。这个方便,并且不干扰程序的执行。

总结:windows程序调试,想怎么调就怎么调。

原创粉丝点击