前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一种注册表沙箱的思路、实现

一种注册表沙箱的思路、实现

作者头像
方亮
发布2019-01-16 15:51:27
4950
发布2019-01-16 15:51:27
举报
文章被收录于专栏:方亮方亮

        从今年4月份开始,我接触到一个沙箱项目。该项目的需求要求我们的沙箱具有良好的安全性和兼容性。当时我们研究了SandBoxIE和360的沙箱,基本确定通过“重定向”思路来实现这款沙箱。而我主要负责研究注册表这块。(转载请指明出处

        在操作系统中,我们对一个对象(文件、注册表键等)的操作存在“创建”、“打开”、“关闭”、“修改”、“删除”和“查询”等。这些操作的源便是那个对象,“重定向”思路就是针对这个对象“作手脚”。说得通俗点,就是通过“狸猫换太子”的方式达到欺骗上层的目的。以后有什么操作,我们便是对这个“狸猫”去作,从而达到保护“太子”的目的。说的“程序化”点,就是比如Create(APath) 要试图创建APath路径的对象(文件,注册表键等),我们通过Hook到Create的底层函数,获取APath,通过一定的规则将APath转换为BPath,同时创建BPath上的对象,将创建结果返回。当然以上只是最最简单的情况,而实际的思路则比这个要复杂的多。

        要达到“狸猫换太子”的目的,我们必须要在外界第一次接触到“太子”之前就下手做点事。于是这就涉及到下手早晚的问题。总得来说存在两种方案:

        一种方法是把“太子”的胚胎取出换到猫的肚子里培育,将“狸猫”的胚胎换到皇后(当然可能是其他女性)的肚子里培育。这种方案的优点是:我们在之前任何一个没人注意的时刻完成以上操作,从此就不用管啥了。但是缺点是:太不稳定,如果出问题了,那就是“胎死腹中”,对好坏哪方都没个交代。

        一种是把刚出生的“太子”抱走,再抱来一只“狸猫”。这种方案优点是:安全稳定,两种不同物种培育自己的胚胎问题不大。问题是:在“太子”出生这个万众瞩目的时刻,我们如何安全的将“太子”抱走,在把“狸猫”抱过来。

        貌似小说中都是使用第二种方案,我想可能是因为科技还不够发达,不能让不同DNA的动物之间相互培育胚胎。同样,针对我们这个项目,我们同样秉承一个准则:“能在ring3做的,我们就在ring3层做”,因为ring0层我们还没足够的把握去保证稳定性,而且一旦出了问题就是大问题——蓝屏(胎死腹中)。于是我们要Hook的函数是Ring3层NtDll中NtCreateKey、NtOpenKey和NtDeleteKey等函数。

        以上的讨论我们可以通过“狸猫和太子”的关系来描述。因为“狸猫”和“太子”都是一个完整的个体,所以描述非常方便。然而实际操作中,完整的将“狸猫”塑造成一个人样的“太子”形象是非常不现实的,因为整容费用太大。同样针对我们的项目,我们不可能将所有操作的对象都创造一个一样的真实的“映射”对象。打个比方,一个操作要枚举Classes Root注册表键,难道我们要将成千上万子键的Classes Root拷贝到我们重定向的键下么?或许这是一种一劳永逸的方法,但是谁也不愿意去当第一次触发“拷贝”操作的倒霉小孩。于是定下以下规则:

  1. 原始对象不能修改(修改值,属性,删除)
  2. 创建,我会在重定向注册表(其实就是真实注册表一个子键)中创建它。
  3. 枚举、查询、打开、关闭,我会综合原始注册表和重定向表之后去操作。
  4. 修改,我会在对应的重定向注册表中修改它
  5. 删除,我优先在重定向表中删除,其次再“操作”原始注册表(不是真删除,而是找个位置做标记)

        基于以上的原则和规则,就可以开始我们的开发之旅了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012年06月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档