Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

C/C++本地代码调试

帖子发起人: 烈火   发起时间: 2013-04-17 23:59 下午   回复: 1

Print Search
帖子排序:    
   2013-04-17, 23:59 下午
FireBurn 离线,最后访问时间: 2014/2/10 8:02:11 烈火

发帖数前50位
注册: 2013-01-26
发 贴: 28
LoadLibrary函数中碰到的奇怪问题

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

IP 地址: 已记录   报告
   2013-04-18, 23:30 下午
FireBurn 离线,最后访问时间: 2014/2/10 8:02:11 烈火

发帖数前50位
注册: 2013-01-26
发 贴: 28
Re: LoadLibrary函数中碰到的奇怪问题
Reply Quote
已经查明了问题出自一个桌面管理软件,它会对kernel32.dll进行hook,影响其中的多个函数,还会引发拷贝文件失败的情况,可能是我的程序没有通过它的验证。将其卸载就恢复正常,有趣的是再装上去后,原本LoadLibrary失败的机器也能Load成功。
IP 地址: 已记录   报告
高端调试 » 软件调试 » C/C++本地代码调试 » Re: LoadLibrary函数中碰到的奇怪问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.