ART 虚拟机下Hook工具:VirtualHook

http://bbs.pediy.com/thread-216786.htm

Github: https://github.com/rk700/VirtualHook

代码结构:

Plugin (apk in sd card)
YAHFA
VirtualApp
 

YAHFA是一个ART的Hook框架(可以Hook应用层、Java API、native code)

VirtualApp是一个开源Android  sandbox,其为App伪造了一套Java Framework,让OS认为App是运行在VA的一个子进程。

Hook原理:

利用VirtualApp提供的虚拟空间,我们就可以实现很多事情了。应用启动时,会初始化Application,此时会在应用所在的进程中调用bindApplication()。而VirtualApp重写了相关代码,那么我们就可以在把注入代码的窗口放在这里,从而实现应用启动时,加载外部的hook代码。

其具体实现也非常简单,在类VClientImpl的方法bindApplicationNoCheck()中,完成了对应用Application的创建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
    try {
        mInstrumentation.callApplicationOnCreate(mInitialApplication);
        PatchManager.getInstance().checkEnv(HCallbackHook.class);
        if (conflict) {
            PatchManager.getInstance().checkEnv(AppInstrumentation.class);
        }
        Application createdApp = ActivityThread.mInitialApplication.get(mainThread);
        if (createdApp != null) {
            mInitialApplication = createdApp;
        }
    catch (Exception e) {
        if (!mInstrumentation.onException(mInitialApplication, e)) {
            throw new RuntimeException(
                "Unable to create application " + mInitialApplication.getClass().getName()
                        ": " + e.toString(), e);
        }
    }
    VActivityManager.get().appDoneExecuting();
}

我们只需要在这个方法的末尾处,添加注入窗口即可。从而,所有在VirtualApp中运行的应用,都会被附加上注入窗口。所以,本文所说的非root权限hook应用,更准确来说,hook的是在VirtualApp中运行的应用。

调用过程:应用启动 -- bindApplication() -- bindApplicationNoCheck() -- 1)startIOUniformer()//IO重定向

sdcard路径重定向

---2)applyHookPlugin() //加载Hook插件(内部调用HookMain.doHookDefault(...),使用YAHFA框架)

VA伪造的“公共空间”绝对路径:

/data/user/0/io.virtualhook/virtual/data/app/com.google.android.gms/lib

VEnvironment.getRoot()返回值:

/data/user/0/io.virtualhook/virtual/data/

Android 7.0下path(package安装路径)等于

/data/app/packagename-1/base.apk

Android之sandbox技术的更多相关文章

  1. Android的NDK技术

    Android的NDK技术

  2. 本人讲课时录制的Android应用开发技术教学视频

    网盘地址:http://yun.baidu.com/pcloud/album/info?query_uk=1963923831&album_id=3523786484935252365 本人讲 ...

  3. 【转】Android 防破解技术简介

    http://www.cnblogs.com/likeandroid/p/4888808.html Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是 ...

  4. Android推送技术研究

    前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解. 为什 ...

  5. 全面了解Android热修复技术

    WeTest 导读 本文探讨了Android热修复技术的发展脉络,现状及其未来. 热修复技术概述 热修复技术在近年来飞速发展,尤其是在InstantRun方案推出之后,各种热修复技术竞相涌现.国内大部 ...

  6. Android热修复技术原理详解(最新最全版本)

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...

  7. 聊聊真实的 Android TV 开发技术栈

    智能电视越来越普及了,华为说四月发布智能电视跳票了,一加也说今后要布局智能电视,在智能电视方向,小米已经算是先驱了.但是还有不少开发把智能电视简单的理解成手机屏幕的放大,其实这两者并不一样. 一.序 ...

  8. Android 插件化技术窥探

    在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式: 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿 ...

  9. Android 防破解技术简介

    Android 防破解技术简介 这几年随着互联网的不断发展,Android App 也越来越多!但是随之而来的问题也越来越多,这其中比较令人头疼的问题就是:有些不法分子利用反编译技术破解 App,修改 ...

随机推荐

  1. Android输入法框架系统(上)

    输入法,就是用来输入字符(包括英文,俄文,中文)的工具.输入法你可以看成是一种字符发生器,它将输入数据触摸事件或者按键事件转化为其他更丰富的字符.在PC时代,输入法的原始输入来自实体键盘,鼠标,然后输 ...

  2. centos7下Redis-Sentinel安装和配置

    一.Redis的安装 1.从官网https://redis.io/download下载最新的stable版本(也可以下载unstable版本)redis-4.0.9.tar.gz. 2.上传到Cent ...

  3. PHP 之 Ci框架下隐藏index.php

    1. 修改 apache 配置文件 开启重写模块 conf/httpd.conf 去掉前面的# LoadModule rewrite_module modules/mod_rewrite.so 对于U ...

  4. C语言基础:指针初级(补充) 分类: iOS学习 c语言基础 2015-06-10 21:54 19人阅读 评论(0) 收藏

    结构体指针:指向结构体指针的变量的指针. 结构体指针指向结构体第一个成员变量的首地址 ->:   指向操作符 定义的指针变量必须指向结构体的首地址,才可以使用  ->  访问结构体成员变量 ...

  5. 简单shell实现局域网IP扫描

    #!/bin/bash network=$1 time=$(date +%H%M%S) for i in $(seq $2 $3) do ping -c 1 -w 2 $network.$i > ...

  6. 、搭建Android开发环境

    一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:Eclipse:http://www.eclipse.org/downloads/ ...

  7. android系列9.LinearLayout 学习2

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. C++ 写的地图控件,支持google 百度 在线离线地图

    C++处理google  百度地图在网上查阅了很多都是通过浏览器方式显示地图信息, 跟我目前项目很不符合, 所以仔细研究了一下C++方式显示地图.通过地图投影以及墨卡托投影,在通过平面地图计算经纬度. ...

  9. JSON-java

    import net.sf.json.JSONArray; import net.sf.json.JSONObject; JSONObject jsonObject1 = new JSONObject ...

  10. Java 中的语法糖(7/15整个周六上午总结)

    语法糖定义指的是,在计算机语言中添加某种语法,这种语法能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会:但是这种语法对语言的功能并没有影响.Java中的泛型,变长参数,自动 ...