Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16497508
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:34:21

下载本文示例代码
  这几天研究了一下雅虎助手是如何干扰360卫士的,发现如果安装雅虎助手的时候不安装3721就不会有问题,看来问题出在3721上了。于是在安装雅虎助手的时候选择安装3721,结果问题果然出现了,联想到前几天在360论坛上看到vcmfc提到雅虎助手/3721通过一个系统CBT钩子干扰“360安全卫士”和“兔子”,于是特别留意了一下系统钩子运行的情况。安装了雅虎助手之后,我先运行了一个自编的系统钩子检查程序AntiHook.exe,果然立刻发现了雅虎助手安装的钩子,见下图: 【图antihook.gif】  yhelper.dll没有加密措施,对“360安全卫士”和“兔子”的迫害代码随处可见,比如,下面的代码是从Runonce中删除“兔子”和“360”的启动项,干扰这两个程序的运行: .text:53002C9E loc_53002C9E: ; CODE XREF: sub_53002993 285.text:53002C9E mov esi, ds:SHDeleteValueA.text:53002CA4 mov ebx, offset pszSubKey ; "SOFTWARE\\Microsoft\\Windows\\CurrentVersi"....text:53002CA9 push offset pszValue ; "Super Rabbit Winspeed".text:53002CAE mov edi, 80000002h.text:53002CB3 push ebx ; pszSubKey.text:53002CB4 push edi ; hkey.text:53002CB5 call esi ; SHDeleteValueA.text:53002CB7 push offset a360safe_0 ; "360Safe".text:53002CBC push ebx ; pszSubKey.text:53002CBD push edi ; hkey.text:53002CBE call esi ; SHDeleteValueA.text:53002CC0 pop ebp.text:53002CC1 pop ebx  上面的代码只是小手段,下面才是真正导致“360安全卫士”和“兔子”无法运行的“罪魁祸首”,这段代码运行的时候yhelper.dll钩子已经被安装(钩)到应用程序进程空间中了,所以已经可以访问被钩程序进程空间中的资源了,来看看代码: .text:53001BF2 loc_53001BF2: ; CODE XREF: DllMain(x,x,x) 50j.text:53001BF2 mov ecx, offset unk_53006740.text:53001BF7 call sub_53002E25.text:53001BFC push 1 ; int.text:53001BFE push offset aWinspeed ; "WINSPEED".text:53001C03 call sub_53002993.text:53001C08 push 1 ; int.text:53001C0A push offset a360safe ; "360SAFE".text:53001C0F call sub_53002993.text:53001C14 add esp, 10h.text:53001C17 jmp short loc_53001C42.text:53001C19 ; ---------------------------------------------------------------------------  关键点是函数sub_53002993,这个函数接受一个字符串参数,就是“360安全卫士”和“兔子”的进程名称,sub_53002993是函数做什么呢?很简单,就是先调用GetModuleFileName()得到当前Hook的进程名称,然后通过字符串比较确定是不是“360安全卫士”和“兔子”。如果是就通过API钩子的方式Hook以下API: DeleteFileATerminateProcessRegDeleteKeyARegDeleteValueAOpenProcessDeleteFileWMoveFileExWMoveFileWMoveFileExAMoveFileWithProgressAMoveFileWithProgressWRegDeleteKeyWRegDeleteValueWShellExecuteA  采用的方式很老套,就是修改API函数的前五个字节为一个跳转语句,跳到钩子程序中的处理函数,在处理函数中根据情况进行一下过滤。下面以雅虎助手用于替换DeleteFileA的处理函数为例,看看它都做了些什么。这个处理函数功能很简单,就是过滤一下要删除的文件,当检测到“兔子”和“safe360”在删除与自己相关的东西时就不执行删除工作,直接返回成功欺骗这两个程序,看看对DeleteFileA的处理函数: .text:5300217B ; int __stdcall YhDeleteFileA(char *).text:5300217B YhDeleteFileA proc near ; 函数名字是我命名的....................................... ;省略一些代码.text:530021C9 mov esi, ds:strstr.text:530021CF lea eax, [ebp var_104].text:530021D5 push offset aCns_0 ; "CNS".text:530021DA push eax ; char *.text:530021DB call esi ; strstr ;名字里有没有“cns”?.text:530021DD add esp, 14h.text:530021E0 test eax, eax.text:530021E2 pop edi.text:530021E3 jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:530021E5 lea eax, [ebp var_104].text:530021EB push offset aYahoo ; "YAHOO".text:530021F0 push eax ; char *.text:530021F1 call esi ; strstr ;名字里有没有“yahoo”?.text:530021F3 pop ecx.text:530021F4 test eax, eax.text:530021F6 pop ecx.text:530021F7 jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:530021F9 lea eax, [ebp var_104].text:530021FF push offset a3721 ; "3721".text:53002204 push eax ; char *.text:53002205 call esi ; strstr ;名字里有没有“3721”?.text:53002207 pop ecx.text:53002208 test eax, eax.text:5300220A pop ecx.text:5300220B jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:5300220D lea eax, [ebp var_104].text:53002213 push offset aV ; "雅虎".text:53002218 push eax ; char *.text:53002219 call esi ; strstr ;名字里有没有“雅虎”?.text:5300221B pop ecx.text:5300221C test eax, eax.text:5300221E pop ecx.text:5300221F jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:53002221 push [ebp arg_0] ;.text:53002224 call ebx ; unk_530070A4,调用保存在530070A4地址处的真正的DeleteFileA.text:53002226 jmp short loc_53002232.text:53002228 ; ---------------------------------------------------------------------------.text:53002228 ; 雅虎文件的返回点.text:53002228 loc_53002228: ; .text:53002228 ; 如果要删除的文件名包含yahoo的关键字,就转到这里.text:53002228 push 1 ;直接返回1表示成功,欺骗safe360和兔子以为文件已经删除.text:5300222A pop eax.text:5300222B jmp short loc_53002232....................................... ;省略一些代码.text:53002232.text:53002232 loc_53002232: ; .text:53002232 pop esi.text:53002233 pop ebx.text:53002234 leave.text:53002235 retn 4.text:53002235 YhDeleteFileA endp  现在明白了吧,“360安全卫士”和“兔子”一旦被钩上这个钩子,正常的功能就丧失了,因为所有与雅虎助手和3721相关的文件,注册表和进程都无法删除了。做软件的人都知道,在系统中安装钩子会影响系统的性能,一般都不会采用这种方法实现软件的功能,而雅虎助手和3721使用系统钩子与自己的本身功能没有任何关系,仅仅是为了干扰别人的软件就采用这种方式安装系统钩子,是不是太过分了?这种对其它软件的破坏是赤裸裸的,就根据这一点,“360安全卫士”和“兔子”就足以将雅虎助手和3721告上法庭。   这几天研究了一下雅虎助手是如何干扰360卫士的,发现如果安装雅虎助手的时候不安装3721就不会有问题,看来问题出在3721上了。于是在安装雅虎助手的时候选择安装3721,结果问题果然出现了,联想到前几天在360论坛上看到vcmfc提到雅虎助手/3721通过一个系统CBT钩子干扰“360安全卫士”和“兔子”,于是特别留意了一下系统钩子运行的情况。安装了雅虎助手之后,我先运行了一个自编的系统钩子检查程序AntiHook.exe,果然立刻发现了雅虎助手安装的钩子,见下图: 【图antihook.gif】  yhelper.dll没有加密措施,对“360安全卫士”和“兔子”的迫害代码随处可见,比如,下面的代码是从Runonce中删除“兔子”和“360”的启动项,干扰这两个程序的运行: .text:53002C9E loc_53002C9E: ; CODE XREF: sub_53002993 285.text:53002C9E mov esi, ds:SHDeleteValueA.text:53002CA4 mov ebx, offset pszSubKey ; "SOFTWARE\\Microsoft\\Windows\\CurrentVersi"....text:53002CA9 push offset pszValue ; "Super Rabbit Winspeed".text:53002CAE mov edi, 80000002h.text:53002CB3 push ebx ; pszSubKey.text:53002CB4 push edi ; hkey.text:53002CB5 call esi ; SHDeleteValueA.text:53002CB7 push offset a360safe_0 ; "360Safe".text:53002CBC push ebx ; pszSubKey.text:53002CBD push edi ; hkey.text:53002CBE call esi ; SHDeleteValueA.text:53002CC0 pop ebp.text:53002CC1 pop ebx  上面的代码只是小手段,下面才是真正导致“360安全卫士”和“兔子”无法运行的“罪魁祸首”,这段代码运行的时候yhelper.dll钩子已经被安装(钩)到应用程序进程空间中了,所以已经可以访问被钩程序进程空间中的资源了,来看看代码: .text:53001BF2 loc_53001BF2: ; CODE XREF: DllMain(x,x,x) 50j.text:53001BF2 mov ecx, offset unk_53006740.text:53001BF7 call sub_53002E25.text:53001BFC push 1 ; int.text:53001BFE push offset aWinspeed ; "WINSPEED".text:53001C03 call sub_53002993.text:53001C08 push 1 ; int.text:53001C0A push offset a360safe ; "360SAFE".text:53001C0F call sub_53002993.text:53001C14 add esp, 10h.text:53001C17 jmp short loc_53001C42.text:53001C19 ; ---------------------------------------------------------------------------  关键点是函数sub_53002993,这个函数接受一个字符串参数,就是“360安全卫士”和“兔子”的进程名称,sub_53002993是函数做什么呢?很简单,就是先调用GetModuleFileName()得到当前Hook的进程名称,然后通过字符串比较确定是不是“360安全卫士”和“兔子”。如果是就通过API钩子的方式Hook以下API: DeleteFileATerminateProcessRegDeleteKeyARegDeleteValueAOpenProcessDeleteFileWMoveFileExWMoveFileWMoveFileExAMoveFileWithProgressAMoveFileWithProgressWRegDeleteKeyWRegDeleteValueWShellExecuteA  采用的方式很老套,就是修改API函数的前五个字节为一个跳转语句,跳到钩子程序中的处理函数,在处理函数中根据情况进行一下过滤。下面以雅虎助手用于替换DeleteFileA的处理函数为例,看看它都做了些什么。这个处理函数功能很简单,就是过滤一下要删除的文件,当检测到“兔子”和“safe360”在删除与自己相关的东西时就不执行删除工作,直接返回成功欺骗这两个程序,看看对DeleteFileA的处理函数: .text:5300217B ; int __stdcall YhDeleteFileA(char *).text:5300217B YhDeleteFileA proc near ; 函数名字是我命名的....................................... ;省略一些代码.text:530021C9 mov esi, ds:strstr.text:530021CF lea eax, [ebp var_104].text:530021D5 push offset aCns_0 ; "CNS".text:530021DA push eax ; char *.text:530021DB call esi ; strstr ;名字里有没有“cns”?.text:530021DD add esp, 14h.text:530021E0 test eax, eax.text:530021E2 pop edi.text:530021E3 jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:530021E5 lea eax, [ebp var_104].text:530021EB push offset aYahoo ; "YAHOO".text:530021F0 push eax ; char *.text:530021F1 call esi ; strstr ;名字里有没有“yahoo”?.text:530021F3 pop ecx.text:530021F4 test eax, eax.text:530021F6 pop ecx.text:530021F7 jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:530021F9 lea eax, [ebp var_104].text:530021FF push offset a3721 ; "3721".text:53002204 push eax ; char *.text:53002205 call esi ; strstr ;名字里有没有“3721”?.text:53002207 pop ecx.text:53002208 test eax, eax.text:5300220A pop ecx.text:5300220B jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:5300220D lea eax, [ebp var_104].text:53002213 push offset aV ; "雅虎".text:53002218 push eax ; char *.text:53002219 call esi ; strstr ;名字里有没有“雅虎”?.text:5300221B pop ecx.text:5300221C test eax, eax.text:5300221E pop ecx.text:5300221F jnz short loc_53002228 ;是雅虎的文件,就直接跳转到返回点.text:53002221 push [ebp arg_0] ;.text:53002224 call ebx ; unk_530070A4,调用保存在530070A4地址处的真正的DeleteFileA.text:53002226 jmp short loc_53002232.text:53002228 ; ---------------------------------------------------------------------------.text:53002228 ; 雅虎文件的返回点.text:53002228 loc_53002228: ; .text:53002228 ; 如果要删除的文件名包含yahoo的关键字,就转到这里.text:53002228 push 1 ;直接返回1表示成功,欺骗safe360和兔子以为文件已经删除.text:5300222A pop eax.text:5300222B jmp short loc_53002232....................................... ;省略一些代码.text:53002232.text:53002232 loc_53002232: ; .text:53002232 pop esi.text:53002233 pop ebx.text:53002234 leave.text:53002235 retn 4.text:53002235 YhDeleteFileA endp  现在明白了吧,“360安全卫士”和“兔子”一旦被钩上这个钩子,正常的功能就丧失了,因为所有与雅虎助手和3721相关的文件,注册表和进程都无法删除了。做软件的人都知道,在系统中安装钩子会影响系统的性能,一般都不会采用这种方法实现软件的功能,而雅虎助手和3721使用系统钩子与自己的本身功能没有任何关系,仅仅是为了干扰别人的软件就采用这种方式安装系统钩子,是不是太过分了?这种对其它软件的破坏是赤裸裸的,就根据这一点,“360安全卫士”和“兔子”就足以将雅虎助手和3721告上法庭。 下载本文示例代码


雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士雅虎助手是这样迫害兔子和360安全卫士
阅读(196) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~