现在的位置: 首页 > 综合 > 正文

查看DLL的引用计数

2018年07月07日 ⁄ 综合 ⁄ 共 809字 ⁄ 字号 评论关闭

Windows的每个进程都有DLL文件,每个DLL都有一个引用计数,当引用计数为零时DLL才会被卸载。

比如在代码中对统一个DLL文件调用了LoadLibrary两次,而只调用了FreeLibrary一次,那么这个DLL不会被卸载。那么如何查看DLL的引用计数呢?

DLL的相关信息在进程环境块中(PEB),需要使用WinDbg工具查看。

而这个环境块是由Windows内核维护的,所以它不像API层那么稳定,随着Windows的升级或升级补丁它都可能会发生变化。

所以我们需要知道当前系统的编译版本号,这样才能确定我们的结构体和哪些系统版本相对应。

系统版本编译号可以查看注册表

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

其中BuildLabEx字段就是当前系统的编译版本号,以我的Win8.1 x64为例

当编译版本号不同时,那么内核层的一些数据结构可能就会发生变化。

回到正题,用WinDbg查看DLL引用计数。随便调试一个程序,输入“dt _LDR_DATA_TABLE_ENTRY”指令即可查看包含DLL引用计数的结构。

Windows 7 SP1(7601.18247.amd64fre.win7sp1_gdr.130828-1532)

其中的LoadCount字段就是DLL的引用计数。

但是到了Windows 8.1(9600.17415.amd64fre.winblue_r4.141028-1500),其结构变成了

虽然其中也有个ObsoleteLoadCount字段,但是看名字也可以知道,它已经被废弃了,不再保存DLL引用计数。

那么新的引用计数器在哪呢?在_LDR_DDAG_NODE结构下(偏移0x050)

再次在WinDbg中输入命令“dt _LDR_DDAG_NODE”查看该结构

可以看到其中有个LoadCount字段,这就是DLL的引用计数。

抱歉!评论已关闭.