百度空间 | 百度首页 
 
查看文章
 
解决TM 2009和QQ 2009无法在Sandboxie中运行的问题
2009-06-16 13:46
今天在Sandboxie中运行TM 2009,结果bugreport.exe蹦出来了。调了一下,发现是Sandboxie的实现机制和TM 2009新增的安全模块功能冲突导致的。

Sandboxie中运行的每个进程都会加载SbieDll.dll,这个模块会Inline Hook一堆API。而TM 2009的TSSafeEdit.dat(其实是一个dll)会检测一些API有没有被Inline Hook,一旦发现就试图进行恢复。

但是TSSafeEdit.dat中的代码在恢复Inline Hook时为了能顺利写入,先调用VirtualProtec给目标内存设置了PAGE_READWRITE(0x04)属性,但是恢复结束后并没有设置回原始的PAGE_EXECUTE_READ(0x20)属性。在开启了DEP的系统上,PAGE_READWRITE的区域自然是不可执行的,于是就异常了。

TSSafeEdit.dat用upx压缩过,解开后可以找到如下两处设置属性的代码:

.text:100019CD                 push    eax
.text:100019CE                 push    4              ; PAGE_READWRITE
.text:100019D0                 push    edi
.text:100019D1                 push    esi
.text:100019D2                 call    dword_1000A168 ; kernel32!VirtualProtec

.text:10001CF7                 push    eax
.text:10001CF8                 push    4              ; PAGE_READWRITE
.text:10001CFA                 push    ebx
.text:10001CFB                 push    edi
.text:10001CFC                 call    dword_1000A168 ; kernel32!VirtualProtec

把那两个push 4改成push 0x20就可以让TM 2009正常在Sandboxie中运行了。

需要注意,TM 2009运行后会检查TSSafeEdit.dat是否被修改,如果被修改则会试图获取原始文件恢复之。要避免被恢复可以借助Sandboxie的相关机制来进行限制,如禁止SelfUpdate.exe进程运行等。


细心的朋友可能还会有疑问:改成push 0x20不是就等于没改内存属性PAGE_EXECUTE_READ(0x20)么,那么这部分内存仍然是不可写的,后面恢复Inline Hook时不会出异常么?答案是不会。

因为TSSafeEdit.dat恢复Inline Hook时写内存用的是WriteProcessMemory()而不是memcpy()之类直接内存访问的方式。对WriteProcessMemory()这种血腥暴力的API来说,只读内存属性是不影响写入的。换句话说,TSSafeEdit.dat中那两个
VirtualProtec()调用其实是不必要的,全改成nop也一样能正常工作。

QQ 2009和TM 2009的情况相同。

 
网友评论:
9
2009-06-17 09:14 | 回复
牛x。
 
10
2009-06-17 10:04 | 回复
咦,为啥只剩9楼了……
 
11
2009-06-17 21:41 | 回复
我是来看血腥暴力API的
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu