首页
社区
课程
招聘
[讨论]360OS里的财产隔离系统和微信分身
发表于: 2015-11-8 11:41 21924

[讨论]360OS里的财产隔离系统和微信分身

2015-11-8 11:41
21924
http://blog.csdn.net/yunajie/article/details/50894488

2016-07-08 更新

由于公司放弃该方案哪就不压箱底了,开源造福人类,呵呵

先说一下实现双开(多开)的几种方案

1. 静态修改APK包名,然后重打包
    作为厂商肯定不推荐这个方式拉,可能存在法律风险
2. 动态修改APK包名
    对原生代码修改量小,兼容性差,部分APP需单独适配
3. 动态修改进程的实例
    对原生代码修改量大,兼容性一般,可能会导致系统一些乱七八糟的BUG
4. 通过多用户机制实现
    MIUI的实现机制,更多的是修改多用户在相关的代码
5. 通过动态加载(运行)的机制来实现(LBE的平行空间)
    作为第三方开发者,不能ROOT,不能修改系统源码,逼的LBE用这种方式,也是难为他们了

上面几种方式是常见的几种方式,我选择的是方式2,之所以用第2种方式是由于去年年底友商也只出了微信的双开,从技术角度我需要尽快跟进,所以用了一个代码修改量小,门槛不算高的方式快速跟进。

OK,接下来我详细说一下方式2的细节。

我们分为两部分:

1. 安装部分
APP安装流程就不科普了,操作是这样的,先安装微信,然后再一次安装微信,这个时候会在系统里存在两个微信,当然原生代码做了校验,我们修改了关键函数校验代码,通过PackageInstaller第二次安装微信的流程如下:
PackageManagerServer::installPackageLI // 安装函数
//#yunajie@System.Security.AppClone.Feature {@  
if ( ((installFlags & PackageManager.INSTALL_WEIXIN_CLONE) != 0) ) {  
    pkg = pp.parsePackage(tmpPackageFile, parseFlags | PackageParser.PARSE_CLONE_WEIXIN);  
} else {  
    pkg = pp.parsePackage(tmpPackageFile, parseFlags);  
}  
// @}  

PackageParser::parsePackageSplitNames // 解析函数
//#yunajie@System.Security.AppClone.Feature {@  
if ((flags & PARSE_CLONE_WEIXIN) != 0) {  
    //Log.i("yunajie", "parsePackageSplitNames::printStackTrace1: " + packageName);  
    //new Exception().printStackTrace();  
    //Log.i("yunajie", "parsePackageSplitNames::printStackTrace2");  
    if ("com.tencent.mm".compareToIgnoreCase(packageName) == 0) {  
        boolean bInstallWeixinShadow = false;  
        Throwable throwable = new Throwable();  
        StackTraceElement[] stackElements = throwable.getStackTrace();  
  
        if (null != stackElements) {  
            for (int i = 0; i < stackElements.length; i++) {  
                String szMethodName = stackElements[i].getMethodName();  
                if ("installPackageLI".compareToIgnoreCase(szMethodName) ==  0 ||  
                     "scanPackageLI".compareToIgnoreCase(szMethodName) ==  0) {  
                    bInstallWeixinShadow = true;  
                    break;  
                }  
            }  
        }  
  
        throwable = null;  
  
        if (bInstallWeixinShadow) {  
            return Pair.create("com.tencent.mm2".intern(),  
                    (splitName != null) ? splitName.intern() : splitName);  
        }  
    }  
}  
// @}  

PackageParser::buildClassName // 处理一下类
//#yunajie@System.Security.AppClone.Feature {@  
if ("com.tencent.mm2".compareToIgnoreCase(pkg) == 0) {  
    return ("com.tencent.mm" + cls).intern();  
}  
// @}  


呵呵,到此为止,已经可以安装两个微信了,但实际上还运行不起来,看第2部分

2. 运行部分
好了,当你看到桌面上有2个微信图标是不是很兴奋,结果运行不起来,打开JNI日志,查看各种崩溃信息我已经修改了绝大部分的问题了,主要是查找类的时候路径找不到,看代码了。
class_linker::FindClass
//#yunajie@System.Security.AppClone.Feature {@  
LOG(INFO) << "yunajie::FindClass1: " << descriptor;  
std::string str_descriptor(descriptor);  
if (str_descriptor.find("tencent/mm2com") != std::string::npos) {  
    str_descriptor.erase(1, 15);  
} else if (str_descriptor.find("tencent/mm2") != std::string::npos) {  
    str_descriptor.erase(15, 1);  
}  
LOG(INFO) << "yunajie::FindClass2: " << str_descriptor;  
descriptor = const_cast<const char*>(str_descriptor.c_str());  
// @}  

是不是很简单,对,就是很简单。

3. 后续总结
已经完美运行了,没发现什么问题,咦,发红包崩溃啊,好,有包名校验,改之:
ContextWrapper::getPackageName
//#yunajie@System.Security.AppClone.Feature {@  
String pkg = mBase.getPackageName();  
if ("com.tencent.mm2".compareToIgnoreCase(pkg) == 0) {  
    Throwable throwable = new Throwable();  
    StackTraceElement[] stackElements = throwable.getStackTrace();  
  
    if (null != stackElements) {  
        for (int i = 0; i < stackElements.length; i++) {  
            if (stackElements[i].getClassName().indexOf("MyKeyboardWindow") > 0) {  
                pkg = "com.tencent.mm";  
                break;  
            }  
        }  
    }  
  
    throwable = null;  
  
    return pkg;  
}  
//@}  


完。

====== 华丽的分割线 ======

目前工作上的需求,在研究这两个功能。总结了这两个功能的实现的方法,不知道是否正确,请高手斧正。
1. 财产隔离系统
财产隔离系统很明显就是把进入“交易模式”的app和其它app在运行时隔离起来,那么如何实现隔离呢?
1.1 通过沙箱来实现,我们知道沙箱一般可以分为虚拟化和仿真化两类,目前Android平台好像都没看到正真意义上的沙箱的产品,当然LBE、腾讯手机管家及、360安全卫士这些产品的沙箱我一直都持怀疑态度,在不root的情况下,这些产品监控app的行为就不用说了,难道他们都带一个虚拟机下去?听到一些小道消息,他们的沙箱更多的是通过把他们处理好的apk替换掉本地apk来实现的,我不确定。360OS到有可能加了真正的沙箱,当然一切都是猜测,下周我详细研究一下再来更新这贴了。

1.2 通过hook关键函数来实现,在进入隔离模式后、除隔离模式里的app能正常读写需要的数据及访问网络等等外,其它的app(系统关键app除外)的读写、访问之类的都拒绝掉。

1.3 还有就是通过linux的多账户来实现,比如隔离系统的app跑在另外一个账户里,那么相对现在的账户也是隔离的了,魅族的手机有一个访客模式,据说是通过多账户来实现的。

关于隔离系统我能想到的只有这么多,还望大家踊跃发言,一起讨论一下,最后说一下微信分身,360OS里的微信分身是同一个用户、多进程但是同一个进程名,所以我猜如果隔离系统做好的,微信分身自然就再简单不过了。

----

更新一下信息:
1. 360OS的财产隔离系统是通过多用户实现的
2. 360OS的微信分身还在研究是如何实现的(详情见9楼)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 50
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我也对这个东西很感兴趣呀,有空一起交流吗456853837
2015-11-8 14:51
0
雪    币: 293
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
加不了你QQ,提示没这个QQ。
2015-11-9 10:40
0
雪    币: 50
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是群号呀,不好意思,忘说了
2015-11-9 11:20
0
雪    币: 228
活跃值: (75)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我个人觉得只是把包名改了,然后底层做一些适配
2015-11-12 15:31
0
雪    币: 206
活跃值: (840)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
360的沙箱功能倒是分析过,是在把原应用加层壳修改入口,壳中hook java函数和so函数,卸载原应用,安装壳应用
2015-11-12 17:31
0
雪    币: 212
活跃值: (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
同时开十个微信都没问题,用Xposed
2015-11-16 18:49
0
雪    币: 293
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
详细说说,多谢。
2015-11-17 16:08
0
雪    币: 293
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
自己来填坑了,360OS的微信分身是如何实现的还不知道,因为手上拿到的手机无法ROOT,可以ROOT的手机已经在路上了。但这里和大家分享一下思路:
1. 我们知道可以通过修改包名达到共纯的目的,对于微信这类的app当然最好不要直接修改包名,我们可以在框架层动态的修改包名,骗过系统以为有两个包,然后运行com.tencent.mm2的时候把需要的东西全部映射回原来的包,这是我的做法,已经完美运行了。
2. 研究了leshi的做法,他是直接去修改ams的流程来实现的,感觉这做法对ams的流程修改有点大,说不好会有坑。
2016-3-15 10:22
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
加个扣 1888843,研究下
2016-3-15 21:07
0
雪    币: 293
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
已更新(开源)
2016-7-8 17:01
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
12
还是学LBE做个android沙箱吧,一堆hook
2016-7-8 20:13
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
多谢开源。
2016-7-9 22:41
0
雪    币: 53
活跃值: (280)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
早期隔离系统是多账户,ps就能看到
分身据说framework里修改量比各位想象中多太多
2016-7-11 17:20
0
游客
登录 | 注册 方可回帖
返回
//