sfc.dll丢失导致dll加载失败

时间:2024-04-03 22:34:41

今天同事测试时发现界面有个模块始终无法显示,使用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丢失导致dll加载失败

很明显,程序静态导入sfc.dll的SfcIsFileProtected,sfc.dll不存在时会出现无法加载B.dll的情况


至此,问题定位。

 sfc.dll缺少在很多精简Ghost系统上存在,依赖这个文件可以检测一个文件是否系统文件。为了解决这个静态依赖,可以考虑动态Loadlibrary sfc.dll导出函数来检测,sfc.dll不存在时可以考虑按照System32等系统目录做简单过滤判断。


原创,转载请注明来自http://blog.csdn.net/wenzhou1219