介绍了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
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
相关文章推荐
- 很多.net 程序员不知道又非常重要的 .net高级调试技巧.调试别人的dll方法内的变量.
- dll源代码调试全攻略~包括ISAPI,API HOOK,GINA等dll的源代码调试方法
- [转]dll源代码调试全攻略~包括ISAPI,API HOOK,GINA等dll的源代码调试方法
- dll源代码调试全攻略~包括ISAPI,API HOOK,GINA等dll的源代码调试方法~
- dll源代码调试全攻略~包括ISAPI,API HOOK,GINA等dll的源代码调试方法~
- dll源代码调试全攻略~包括ISAPI,API HOOK,GINA等dll的源代码调试方法【转】
- 解决hal.dll丢失问题 调试方法启动XP
- 嵌入式技巧:ARM的三种中断调试方法介绍
- Linux通过源代码安装软件的方法介绍
- 介绍几种很棒的wince驱动调试方法——在wince应用程序中直接访问硬件
- 爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍
- 如何调试带有源代码的dll文件
- 对Hadoop源代码中Child类的调试方法
- DLL调试方法
- PHP在浏览器上跟踪调试的方法以及使用ChromePhp、FirePHP的简单介绍
- 调试Dll的方法
- 介绍一种很棒的wince驱动调试方法——在wince应用程序中直接访问硬件(作者:gooogleman)
- 使用WinDbg调试Silverlight中遇到“Failed to find runtime DLL (clr.dll), 0x80004005”问题的解决方法之一
- android 源代码导入调试方法
- 用全局钩子截掉所有进程的鼠标和键盘 DLL的调试方法