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

首先明白一点的是,只要有模块(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上。这个方便,并且不干扰程序的执行。

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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java可以通过调用本地dll来与ISAPI交互,具体实现如下: 1. 编写本地dll,该dll中包含与ISAPI通信的代码。 2. 在Java中使用JNA或JNI来调用该本地dll,实现与ISAPI的交互。 以下是一个简单的示例代码,使用JNA来调用本地dll: ```java import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; public class ISAPIClient { public interface ISAPI extends Library { ISAPI INSTANCE = (ISAPI) Native.loadLibrary("isapi", ISAPI.class); int init(); int send(String data); int close(); } public static void main(String[] args) { ISAPI isapi = ISAPI.INSTANCE; isapi.init(); isapi.send("Hello, ISAPI!"); isapi.close(); } } ``` 在本地dll中,你需要实现init、send、close这三个函数,并在其中实现与ISAPI的通信逻辑。例如: ```c #include <windows.h> #include <stdio.h> BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // 初始化ISAPI break; case DLL_PROCESS_DETACH: // 关闭ISAPI break; default: break; } return TRUE; } extern "C" __declspec(dllexport) int init() { printf("Init ISAPI\n"); return 0; } extern "C" __declspec(dllexport) int send(const char* data) { printf("Send data to ISAPI: %s\n", data); return 0; } extern "C" __declspec(dllexport) int close() { printf("Close ISAPI\n"); return 0; } ``` 当你调用ISAPIClient的main函数时,JNA会自动加载本地dll,并调用其中的init、send、close函数,完成与ISAPI的交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值