被安全软件撞了一下腰

半个月前的调试记录,整个过程还是挺有意思的,发出来存档用吧。


不久前,客户给工程部的同事反映最近软件出现了一些奇怪的问题。现象就是有在进行使用某个功能的时候要载入一个Dll,有一台电脑在会载入失败,而且载入失败的时候会反复弹出提示对话框,都点掉之后程序就会崩溃。同事首先尝试重新拷贝这个dll文件,现象依旧;重新拷贝整个应用软件,依然无果。事情还没完,又过了几天,到了周末的时候,客户突然打电话给我说,陆续又有几台客户端载入这个Dll都会失败了。同时,客户还反映了一个新的问题,应用在下载文件时非常慢,同样的一开始也是一两机有这种情况,几天过去越来越多的机器遇到同样的问题。


于是周一就到客户那边现场看看情况。第一判断感觉像是病毒,因为只有病毒才符合“扩散”这种特征。实际观察之后,进程和启动项的确有一些疑似流氓软件的东西。但是手工清除之后故障没有得到排除。而且客户的电脑上还装有正版nod32,病毒库也有更新。分析到这里,感觉无从下手了,只有出绝招,上调试器。


在客户机上安装好WinDBG,在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失败,而且虽然代码里只有LoadLibrary一次,实际还是会重复Load多次,最后会飞到一个莫名其妙的地方,使程序崩溃。


没办法,建议客户重装系统。先重装了一台,然后再试,没问题了。不过客户又提出由于机器数量较多,重装比较费时,希望能找到一个简便的解决方法,能找到原因最好,实在不行再考虑全部重装。虽然问题很棘手,我还是答应下来,尽一尽人事。


载入Dll失败的问题查到这个程度已经超出我的理解范围了,暂时把它放到一旁,看看下载文件慢的问题。程序会从两个来源上下载文件,这里姑且称为A和B。A的速度较快,B的较慢,所以默认情况下软件会先从A下载,B作为后备。但是从实际情况来看,似乎是直接从B下载的。


还是上调试器,那断点从哪里开始设呢?想了想,程序使用了共享方式进行下载,要先进行共享连接。于是断点就设在WNetAddConnection2A上

0:007> bp mpr!wnetaddconnection2a
断点命中后看看共享连接的地址,看看MSDN里对于WNetAddConnection2A的参数说明

DWORD WNetAddConnection2(
  LPNETRESOURCE lpNetResource,  // connection details
  LPCTSTR lpPassword,           // password
  LPCTSTR lpUsername,           // user name
  DWORD dwFlags                 // connection options
);

typedef struct _NETRESOURCE { 
  DWORD  dwScope; 
  DWORD  dwType; 
  DWORD  dwDisplayType; 
  DWORD  dwUsage; 
  LPTSTR lpLocalName; 
  LPTSTR lpRemoteName; 
  LPTSTR lpComment; 
  LPTSTR lpProvider; 
} NETRESOURCE;
依葫芦画瓢,找到lpRemoterName
0:007> dd esp l2
02cefe34  0066ebec 02cefe5c
0:007> dd 2cefe5c l8
02cefe5c  00000002 00000001 00000003 00000001
02cefe6c  73e086d4 02e115a8 00000000 00000000
0:007> da 2e115a8
02e115a8  "\\SEVER\SHARE" //此处隐去真实的地址信息
和A的地址一样,连接没有错,那连接是否成功呢?

0:007> gu
eax=00000000 ebx=02e115a8 ecx=7c8099fd edx=004c0001 esi=02de8f48 edi=02e17478
eip=0066ebec esp=02cefe48 ebp=02e17568 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
eax=0,表示NO_ERROR,那么连接成功了。

继续单步跟踪,具体不再赘述,在没有源代码的情况下进行单步跟踪,大家都可以想象得到有多么的枯燥。

终于跟踪到CopyFile函数的地方了,当时还犹豫了一下,是步过还是步入呢。转念一想,都跟踪到这了,进去看看吧。

继续单步,到了内部调用CopyFileExW的地方了。

eax=00000000 ebx=00000000 ecx=001bfae8 edx=02e0e545 esi=7ffddbf8 edi=0449ffbc
eip=7c828711 esp=0449fe10 ebp=0449fe34 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!CopyFileA+0x3f:
7c828711 e804f4ffff      call    kernel32!CopyFileExW (7c827b1a)

继续步入,WinDBG一阵忙碌,我正心生疑惑,蹦出结果来了

0:002> t
eax=00000000 ebx=00000000 ecx=001bfae8 edx=02e0e545 esi=7ffddbf8 edi=0449ffbc
eip=7c827b1a esp=0449fe0c ebp=0449fe34 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!CopyFileExW:
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\WINDOWS\system32\xxxhook.dll - //这里隐去具体的名称
7c827b1a e9c1cfc684      jmp     xxxhook!MyCopyFileExW (01494ae0)
我靠,这就是传说中的DllHook?单步跟了几句,看得头晕脑胀(饿得,那个时候加班到晚上8点了)。退出来,直接看看CopyFileExW的结果

0:002> gu
eax=00000000 ebx=00000000 ecx=f8ca8ed1 edx=00000000 esi=7ffddbf8 edi=0449ffbc
eip=7c828716 esp=0449fe28 ebp=0449fe34 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
kernel32!CopyFileA+0x44:
7c828716 8bf0            mov     esi,eax
eax=0,拷贝失败。原来罪魁祸首就是这个xxxhook.dll呀。立马打电话给客户,告知已经找到结果了,那个dll不是木马就是病毒。客户倒是提了个醒,说会不会是某个安全软件的。于是看了一下Dll的描述,还真是。由于卸载还需要密码,无法立即操作验证,当晚就先回去了。第二天再来,卸掉那个安全软件,故障消失了,Dll载入成功了,文件拷贝的速度也正常了。

有趣的是,重新安装那个安全软件后,故障也没有再次出现,具体原因就不得而知了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值