Re: LoadLibrary函数中碰到的奇怪问题
C/C++本地代码调试
LoadLibrary函数中碰到的奇怪问题
烈火
2013-04-17, 23:59 下午
最近客户反映程序总是提示载入某个dll失败,而且故障现象还会扩散。原本只出现在一台电脑上,几天后同一个房间的电脑几乎全部出现了这个问题。但是Dll本身没有问题,拷被到其它地方可以正常使用。
直观上感觉是病毒或者木马,不管怎样还是调试看看。
在LoadLibrary上设置断点。
0:005> bp kernel32!loadlibrarya
操作程序,触发断点
0:005> g
Breakpoint 0 hit
eax=00000000 ebx=00000001 ecx=023ef630 edx=73e0e578 esi=023ef630 edi=024143e8
eip=7c801d7b esp=0012f5dc ebp=0012f6b0 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
kernel32!LoadLibraryA:
7c801d7b 8bff mov edi,edi
接下来就比较诡异了,先看一下LoadLibrary的代码
0:000> u kernel32!loadlibrarya
kernel32!LoadLibraryA:
7c801d7b 8bff mov edi,edi
7c801d7d 55 push ebp
7c801d7e 8bec mov ebp,esp
7c801d80 837d0800 cmp dword ptr [ebp+8],0
7c801d84 53 push ebx
7c801d85 56 push esi
7c801d86 7414 je kernel32!LoadLibraryA+0x88 (7c801d9c)
7c801d88 6850e1807c push offset kernel32!`string' (7c80e150)
单步执行应该是要走到7c801d7d这个地方,单步一下
0:000> t
eax=00000000 ebx=00000001 ecx=023ef630 edx=73e0e578 esi=023ef630 edi=024143e8
eip=0012f595 esp=0012f2e0 ebp=0012f6b0 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
<Unloaded_AT10.DLL>+0x12f594:
0012f595 9c pushfd
见鬼了,这是什么地方
0:000> u 0012f595
<Unloaded_AT10.DLL>+0x12f594:
0012f595 9c pushfd
0012f596 6874f31200 push offset <Unloaded_AT10.DLL>+0x12f373 (0012f374)
0012f59b e860fdffff call <Unloaded_AT10.DLL>+0x12f2ff (0012f300)
0012f5a0 9d popfd
0012f5a1 61 popad
0012f5a2 81c4dc020000 add esp,offset <Unloaded_AT10.DLL>+0x2db (000002dc)
0012f5a8 e9ce276d7c jmp kernel32!LoadLibraryA (7c801d7b)
0012f5ad 0000 add byte ptr [eax],al
继续多次单步,
0:000> p
eax=00000000 ebx=00000001 ecx=023ef630 edx=73e0e578 esi=023ef630 edi=024143e8
eip=0012f5a8 esp=0012f5dc ebp=0012f6b0 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
<Unloaded_AT10.DLL>+0x12f5a7:
0012f5a8 e9ce276d7c jmp kernel32!LoadLibraryA (7c801d7b)
嗯,这回要回到LoadLibrary了吧
0:000> p
eax=00000000 ebx=00000001 ecx=023ef630 edx=73e0e578 esi=023ef630 edi=024143e8
eip=0012f595 esp=0012f2e0 ebp=0012f6b0 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
<Unloaded_AT10.DLL>+0x12f594:
0012f595 9c pushfd
靠,又回到这个鬼地方了。
这个步骤会反复多次。大部分的电脑最终会LoadLibray失败,而且虽然代码里只有Load一次,实际还是会重复Load多次,最后会飞到一个莫名其妙的地方,使程序崩溃。只有一台电脑最终会LoadLibrary成功,上面的调试过程就是在这台电脑上进行的。
Re: LoadLibrary函数中碰到的奇怪问题
烈火
2013-04-18, 23:30 下午
已经查明了问题出自一个桌面管理软件,它会对kernel32.dll进行hook,影响其中的多个函数,还会引发拷贝文件失败的情况,可能是我的程序没有通过它的验证。将其卸载就恢复正常,有趣的是再装上去后,原本LoadLibrary失败的机器也能Load成功。