查看: 2615|回复: 9
收起左侧

[微点] 分析微点对dll劫持的处理

[复制链接]
a445441
发表于 2011-7-25 09:34:27 | 显示全部楼层 |阅读模式
本帖最后由 a445441 于 2011-7-26 10:23 编辑

   转帖地址:http://www.cnblogs.com/syscoder/articles/1677184.html

分析微点对dll劫持的处理
    由于想看看微点对dll劫持是怎么处理的,所以抽了点时间对微点针对这方面的处理进行了一下分析,恩!据我所知其它杀毒软件针对这个方面貌似没有处理,呵呵。所以只是分析微点是怎么处理的。
                                                                                 什么是dll劫持
    所谓dll劫持其实很简单,系统加载某些dll时候会首先在程序所在目录查找该dll是否存在,若存在就会加载该dll,l例如进程本来该加载system32下的abc.dll,但是程序所在目录又有一个abc.dll,那么程序就会加载本目录的abc.dll,而不会加载system32下的本来该加载的abc.dll,所以dll劫持就诞生了,同时注意并不是所有dll都可以劫持,像user32.dll等重要的dll是不可以的,程序总是会加载system32下的系统dll。
一个进程能不能加载两个名称相同但路径不相同的dll呢?一般情况下是不可能的,当一个abc.dll加载成功后,那么再去加载同名的abc.dll是不会成功的,这样只会增加其加载计数而已,不过特殊情况还是可以加载两个同名的dll的,当在abc.dll加载时,在abc.dll的DLLEntry中去加载同名的abc.dll是会成功的,因为这时当DLLEntry返回成功时才意味着该dll的成功加载,所以在DLLEntry中加载一个同名的dll时,系统并不会认为已经有一个同名dll已加载,加载完一个同名dll后,DLLEntry返回一个TRUE,这是会发现加载了两个同名dll,测试效果如图1:

 为什么要分析怎么加载两个同名的dll呢?呵呵,因为微点就是这么判断dll劫持的,微点认为假冒的dll必然要加载真正的dll,因为假冒的dll会调用真正的dll来完成调用转发,不然当进程调用某些功能会失败,假冒的dll要起到一个桥梁的作用,鉴于微点对该行为的查杀机制,所以接下来的测试都以该规格进行测试。
        下面开始模拟一下dll的劫持,因为不知道那些dll是可以劫持的,所以我们用dll注入的方法来模拟dll的劫持效果,把一个dll注入到IE进程中,注入的dll加载IE文件目录中的abc.dll,然后abc.dll加载system32目录下的abc.dll来完成模拟dll劫持的效果,我们先以system32目录下的wmp.dll劫持为例,写段代码进行测试,关于dll注入的过程就不再解释啦,假冒的wmp.Dll代码如下,代码1如下:
.386
.model flat,stdcall
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
dllname db 'c:\windows\system32\wmp.dll',0  
.code
TestWei  proc
         push   ebp
         mov   ebp,esp
         invoke LoadLibrary,offset dllname
         pop    ebp
ret
TestWei  endp
DllEntry proc histance:HINSTANCE ,fdwReason:dword,fimpload:dword
         .if fdwReason==DLL_PROCESS_ATTACH
                invoke  TestWei
         .endif
         mov    eax,1
         ret
DllEntry endp
end DllEntry
编译上面代码,把生成的dll重命名为wmp.dll并复制到IE进程所在的目录,打开IE进程后模拟dll劫持效果,微点会“报未知木马”如图2:
上图可以看到微点认为是病毒,当然这里都是满足条件测试的,若假冒的wmp.dll没有加载真正的wmp.dll,那么是不会受到查杀的,呵呵,若加载得是修改过名字的系统真正wmp.dll,微点也不会查杀,可见微点对这方面的查杀有很大不足。不过我们的测试还是在满足微点查杀机制的情况下测试,修改上面的代码1,修改成的代码如下(代码2):
.386
.model flat,stdcall
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
dllname db 'c:\windows\system32\wmp.dll',0  
.code
TestWei  proc
         invoke LoadLibrary,offset dllname
         ret
TestWei  endp
DllEntry  proc histance:HINSTANCE ,fdwReason:dword,fimpload:dword
         .if fdwReason==DLL_PROCESS_ATTACH
                invoke  TestWei
         .endif
         mov    eax,1
         ret
DllEntry endp
end DllEntry
      编译上面的代码,把生成的dll重新测试,却发现这次微点却不查杀了,我们成功加载了两个同名的wmp.dll, 这是为什么呢?难道代码有什么区别吗?对比一下就可以发现,代码1和代码2其实没有什么大的不同,唯一的不同之处是TestWei函数中代码2比代码1少了下面的代码:
                  Push   ebp
                  Mov   ebp,esp
      事实上,上面代码是查杀的关键,但微点不是把它当特征码来杀的,仔细想想这两句代码改变了什么呢?以至于会影响微点的判断力,也不兜圈子了,呵呵,你要知道微点会使用堆栈回溯来定位调用着,那么上面的情况就可以解释了,上面两句代码就改变了线程的堆栈,从而影响了微点堆栈回溯的查杀效果,可以判断的是微点是通过ebp实现堆栈回溯的,为了能表示明白,画张图展示一下,如图3:
上面的图可以折射出微点堆栈回溯的杀毒机制,图画的不好,呵呵,那么下面分析代码1和代码2为什么一个杀而一个不杀的原因,因为微点通过回溯到达LoadLibrary调用处时,此时已经到了假冒的dll中,此时的返回地址已到假冒的dll中,但微点不敢轻易判断其为病毒,因为exe可能调用了该dll,所以微点会继续向上回溯,若发现继续向上回溯的返回地址又到了该dll中,那么就会判断其为病毒,而代码1继续向上回溯的返回地址确实是在DLLEntry中,在假冒的dll中,所以微点会判断其为病毒,而代码2使用的ebp是DLLEntry的ebp,而该ebp通过回溯取得的返回地址在ntdll中,并且继续向上回溯返回地址不会再回到假冒的dll中,所以微点认为是exe进程调用了该dll,并认为是合法的,所以就产生了不同的处理结果,这样照成的结果是在DLLEntry中调用LoadLibrary都是被认为合法的,因为使用的是DLLEntry中的ebp,呵呵,微点在处理这个问题上存在很大的不足。
                                                                                      简单绕过查杀机制
        知道了原理当然很容易绕过,因为在用户态下,我们可以随意控制代码的流向,可以通过伪造ebp及返回地址来欺骗微点的回溯判断了,下面还是在满足测试条件下测试,其实代码2已经绕过了,在这只是做个示范,就是通过伪造ebp和返回地址,让微点在回溯过程中取得错误的ebp和返回地址,从而导致微点不得不停止堆栈回溯,那么修改代码1如下:
.386
.model flat,stdcall
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
.data
dllname db 'c:\windows\system32\wmp.dll',0  
.code
TestWei  proc
         Push  ebp  ;保存ebp
         Push  0   ;伪造返回地址为0
         Push  0   ;伪造ebp,微点会取得该值
         Mov  ebp,esp
         invoke LoadLibrary,offset dllname
         ;恢复堆栈,以便程序正常执行
         pop   eax
         pop   eax
         pop   ebp
         ret
TestWei  endp
DllEntry  proc histance:HINSTANCE ,fdwReason:dword,fimpload:dword
         .if fdwReason==DLL_PROCESS_ATTACH
                invoke  TestWei
         .endif
         mov    eax,1
         ret
DllEntry endp
end DllEntry
       上面代码通过push 0伪造了返回地址和ebp,微点取得返回地址为0和ebp为0后,将无法正常进行堆栈回溯,最后恢复堆栈,以便程序正常执行,上面代码生成的文件测试,发现微点没有杀。看来已经起了作用。针对ebp进行堆栈回溯的方法来定位调用者的弱点已经很明显了。而且这种情况很难处理。
                                                                              微点保存了系统目录结构
       俗话说:牵一发而动全身,通过dll劫持的分析,无意间还可以发现微点的其它情况,微点保存了系统详细的目录结构,当然这里只是推测而已,呵呵,下面做个测试,把windows目录的一个有微软数字签名的dll复制到system32目录中,并对其进行dll劫持测试,发现微点没有查杀,为什么呢?可能微点保存了系统的目录结构,知道system32目录下本来的文件是那些,那些本来是不存在的,微点之所以保存了系统关键目录的结构应该有它的的作用,其实它的作用也可以猜到,当某个病毒要对系统文件进行操作时,微点会去查询保存的系统目录,若保存的系统目录中有该系统文件,那么应当不容许其它进程修改或重命名的,否则对其操作的进程可能就是病毒或木马,在我看来保存系统目录是一个很好的防毒方案,微点在这个方面很是很不错的。这个有时间再测试。

上面简单分析了微点的一下查杀机制,有的地方只是推测,所以错误在所难免。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?快速注册

x

评分

参与人数 1人气 +1 收起 理由
ezpod32432 + 1 厉害。。

查看全部评分

will91911
发表于 2011-7-25 10:52:25 | 显示全部楼层
[:13我表示学习
-oAo-
发表于 2011-7-25 12:57:55 | 显示全部楼层
技术的东西看不太明白
xiaohf
发表于 2011-7-25 20:48:37 | 显示全部楼层
很好的技术帖,只能学习了。
tcjgdw
发表于 2011-7-25 22:44:49 | 显示全部楼层
近来在学习c++和汇编,不错,前来学习一下.
heaven888
发表于 2011-7-26 08:03:41 来自手机 | 显示全部楼层
十分好的技术帖
疯狂的小鬼
发表于 2011-7-26 08:22:09 | 显示全部楼层

原地址呢。在微点吗?
微点论坛吗?
a445441
 楼主| 发表于 2011-7-26 10:20:50 | 显示全部楼层
疯狂的小鬼 发表于 2011-7-26 08:22
原地址呢。在微点吗?
微点论坛吗?

不是 我等下发地址。。。
星空下的吻
发表于 2011-7-26 11:45:23 | 显示全部楼层
正常情况下IE哪里会加载wmp.dll?
zhq445078388
发表于 2011-7-26 15:09:09 | 显示全部楼层
表示如果这么做
注入的未知dll根本没做其他动作
直接就把系统dll入口点让出来了
除了驻留就是驻留
根本没恶意行为。。
为什么要报毒。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-2-4 14:57 , Processed in 0.135895 second(s), 18 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表