Posted on 2010-01-04 21:12
S.l.e!ep.¢% 阅读(788)
评论(0) 编辑 收藏 引用 所属分类:
RootKit
解决某IM软件A和某IM软件B无法在Sandboxie中运行的问题
2009-06-16 13:46
今天在Sandboxie中运行TM 2009,结果bugreport.exe蹦出来了。调了一下,发现是Sandboxie的实现机制和某IM软件A新增的安全模块功能冲突导致的。
Sandboxie中运行的每个进程都会加载SbieDll.dll,这个模块会Inline Hook一堆API。而某IM软件A的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也一样能正常工作。
某IM软件B和某IM软件A的情况相同。
|