免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 系统安全 > 由hook引发的同步安全之谈

由hook引发的同步安全之谈

时间:2012-02-19 17:28来源:未知 整理:寂涯网络 点击:

在现在的HIPS和rootkit等都要用到H00K技术,H00K也分为很多种,如SSDT HOOK, INLINE HOOK, OBJECT H00K ##,这些hook技术都要对内存进行patch从而实现系统函数流程的跳转。而对系统内存进行patch的时候,必然要考虑到同步的问题。想必大家 有过这样的经历:安装一个H00K的时候,有时候蓝屏,有时候又正常。其实有主要一部分
原因是同步出现了问题。我们先来看一段INLINE H00K的代码(这里以H00K KiInsertQueueApc为例)带领大家看看问题的所在。  
[code]   
 mov eax, crO; //修改cro,去除写保护
 and eax, not 0x10000; 
 mov cr0, eax; 
 mov ebx, MyHook; 
 sub ebx, 0x804fec46; //0x804fd47a^Ki Ins ertQueuApc 的地址,这里用
硬编码。   
 sub ebx, 5; / / 算出MyHook相对KiInsertQueueApc的偏移。
 mov eax, 0x804fec46; 
 mov byte ptr [eax], 0xe9 //#JMP MyHook这条指令写入到
killnsertqueueapc函数开头 
 INC eax; 
 mov dword ptr [eax], ebx; 
[/code]   
代码很简单,应该都能看懂,用了硬编码,只为说明原理,不碍事。有人会认为这段代 码没有问题,实际情况也没什么大的问题,但是有时候会莫名其妙的蓝屏。这是为什么呢? 我们知道打邪0?3是一个多任务的操作系统,所以系统为每个线程分配了时间片,当时间片 用完的时候就会发生线程的切换。好了,如果在腕¥ byte ptr [681],0169这条指令执行完 毕发生了线程切换,killnsertqueueapc函数的开头则是这样的:
kd> u KiInsertQueueApc nt!KiInsertQueueApc:
804fec46 e9ff 558bec jmp
804fec4b 51 push
804fec4c 8bcl mov
804fec4e S0782e00 cmp
804fec52 8b4 808 mov
804fec55 8955fc mov
804fec58 7404 je
804fec5a 32c0 xor 6cdb424a
ecx
eax,ecx
byte ptr [eax+2Eh],0
ecx,dword ptr [eax+8]
dword ptr [ebp—4],edx
nt!KiInsertQueueApc+ 0K18 (804fec5e)
al, al
可以发现jmp 6cdb424a很显然是一个错误的地址,如果在线程切回来之前,其他线程调 用了killnsertqueueapc必然引发错误而蓝屏。虽然概率不大,但是如果一个用户群非常大的 软件这样写的话,那么就会有用户会遇到这样的问题。下面我们来进行个测试,我写个程序 不停的对KiInsertQueueApc进行HOOK和UNHOOK,不久就出现了问题:
STACK_COMMAKD: .trap 0xfffffffff8ac5e74 ; kb
FOILOWUP_NAME: MachineOwner
MODUIE_KAME: hardware
IMAGE_NAME: hardware
DEBUG_FLR_IMAGE_TIMESTAMP: 0
BUCKET_ID: CPU_CAIL_ERROR
Fo11owup: MachineOwner
*** Possible invalid call from 804fbae3 ( nt!KeInsertQueueApc+0x3b ) **^ Expected target 804fec46 ( nt!KiInsertQueueApc+Ox^ )
kd> u KiInsertQueueApc  
nt!K iInser t QueueApc:  
804fec4& e9ff558bec jmp 6cdb424a
804fec4b 51 push ecK
804fec4c 8bcl mov eaK,ecK
804fec4e 80782e00 cmp byte ptr [eaK+2Eh],0
804fec52 8b4808 mov ecK,dword ptr [eaK+8]
804fec55 8955fc mov dword ptr [ebp-4],edK
804fec58 7404 je nt !KiInsertQueueApc+0sil8
804fec5a. 32c0 xor al, al
正是执行完movbyteptr [681],0169这条指令,而其他线程在执行后面的2条指令前条 用了化11^忖0此此八口0导致了蓝屏。为了解决上述的问题,一般的1乩1邢}«^的代码如下:
[code]
cli;
mov byte ptr [eax], 0xe9; INC eax;
mov dword ptr [eax],ebx; sti;
[/code]
可以看到,就是在写入跳转指令的前后加入了⑴和出指令。仏1指令是关闭中断,STI 是恢复中断。为什么关闭中断就可以解决上述问题呢?上述的问题可以归结于数据没有同 步,在我们还没有?&14完内存时候,发生线程切换,有其他线程访问了该内存,所以出现 问题。关键在于线程切换,来看看线程是如何切换的。Wind0wS的线程切换是基于CPU的时钟 中断的,当CPU发生时钟中断的时候,会执行时钟中断的13匕时钟中断的ISR会根据当前线 程的时间片来判断是否需要切换线程。而化1指令可以关闭硬件中断,此时CPU不会相应时钟 中断,所以在没有主动让出时间片(如执行sleep, kewaitforsingleobject等函数)的情况下,是不会发生线程切换的。此时,就不会有线程在?&^11完内存前访问数据。还有提升1尺01 到015?八1^^八¥£级别也可以阻止线程切换。但是这2种方法只在单核上有效,在多核上并没多大用。

本页地址 http://www.jybase.net/xitonganquan/20120219778.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com