最近客户反映程序总是提示载入某个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成功,上面的调试过程就是在这台电脑上进行的。
|