您的位置:首页 > 编程语言

介绍了8种非常YD用源代码去调试DLL的方法

2012-04-16 10:45 351 查看
首先明白一点的是,只要有模块(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 computer
http://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上。这个方便,并且不干扰程序的执行。
http://blog.csdn.net/KeSummer/archive/2008/06/23/2580114.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐