今天同事测试时发现界面有个模块始终无法显示,使用Process Explorer查看发现对应dll没有加载。然后开始排查问题:
1.首先,看exe有没有加载这个dll的行为
假设A.exe调用B.dll
windbg打开exe,设置断点
sxe ld B.dll
运行,发现成功断下来,继续g完成,查看依旧没有加载B.dll
说明
A.exe中尝试加载了B.dll,但是B.dll因为某种原因加载失败
2.然后,开始看B.dll是因为什么加载失败
最简单的就是我们去看下LoadLibrary执行结果,
如下设置断点
kernel32!LoadLibraryExW (win 10上bu kernelbase!LoadLibraryExW)
怎么查看当前加载的模块名称呢,我们知道这个名称是LoadLibrary的第一个参数,因此可如下获取当前加载的模块名
du poi(@esp+4)
然后就是一个断点慢慢走,直到模块名为B.dll (为了加快速度,也可以先Load一遍,大概找下规律,先用sxe ld断到B.dll前几个dll,然后再设置LoadLibrary断点)
然后依次执行如下命令
p单独调试进入函数 (F11 or F8)
gu执行完函数 (Shift+F11)
!gle即可获得函数GetLastError值
此时lasterror=126
errorlook查看 126 => "找不到指定的模块。"
但实际上查看发现B.dll是存在的,此时可以猜想
B.dll静态依赖的某个dll不存在了
3.使用depends.exe工具查看B.dll
发现如下
很明显,程序静态导入sfc.dll的SfcIsFileProtected,sfc.dll不存在时会出现无法加载B.dll的情况。
至此,问题定位。
sfc.dll缺少在很多精简Ghost系统上存在,依赖这个文件可以检测一个文件是否系统文件。为了解决这个静态依赖,可以考虑动态Loadlibrary sfc.dll导出函数来检测,sfc.dll不存在时可以考虑按照System32等系统目录做简单过滤判断。
原创,转载请注明来自http://blog.csdn.net/wenzhou1219