android无感知拍照github,装X指南之通过 VirtualApp 实现免 Root 权限 Hook

40d659f0bf72a6b6df188a0bca47d4fc.png

装X指南之通过 VirtualApp 实现免 Root 权限 Hook

一、前言

之前写的 「装X指南之Xposed安装与配置」,有人反馈手机 root 风险较大,而且操作成本高,有没有什么方法是不需要 root 就能够实现 hook 的或者不需要 Xposed 也能玩起插件的?于是就有了这篇文章,离开 Xposed ,带你免 root 实现 hook!

二、VirtualApp

1、关于 VirtualApp 的介绍

VA目前被广泛应用于插件化开发、无感知热更新、自动化、多开等技术领域,但它决不仅限于此,Android本身就是一个极其开放的平台,免安装运行APK这一Feature打开了无限可能-----这都取决于您的想象力。

感谢 asLody 开源,据说他写这个项目才高二,佩服佩服~

VirtualApp 项目地址:

2、VirtualApp 的原理

VirtualApp 伪造了一套 framework 代码,实现所有在其进程启动的应用,都运行在一个虚拟空间(注:个人理解,如有错误,还请指出)。

VirtualApp 源码学习与原理分析

3、VirtualApp 使用问题

Github 上的代码,作者已经没有继续开源更新了,可以看到后续的所有修改,都在作者的商业版上操作,所以有可能在使用上会出现一些 bug。

其实可以看到「商业版」,不管稳定性与兼容性,都做了很大的修复和改动,最重要的是,支持 Dalvik 和 Art 的 Java Hook( API 同 Xposed ),可惜在作者没有公开源码的情况下,我们个人不可能为了学习去购买「商业版」~

特别说明:作者明确指出,如果项目需要投入商业使用,请购买「商业版」。我们这里仅做技术学习使用

aa9dd9cae2935c3784ca3c5ed43c0f71.png

商业版特性

4、VirtualHook 介绍

上文说到我们无法使用「商业版」的 VirtualApp ,来进行 Hook ,准确来说是作者没把 Hook 的 Api 公开。

下面我要介绍另一个基于 VirtualApp 改造的项目 —— VirtualHook(区分:VirtualApp 与 VirtualHook 的区别,不要搞混了,后文使用 VirtualHook 来实践),感谢 rk700 开源 VirtualHook 与 YAHFA

1)VirtualHook 项目地址:

2)VirtualHook 构成:

VirtualHook is a tool for hooking application without root permission. It is based on two projects:

VirtualApp. It's a plugin framework which allows running applications in its virtual space.

YAHFA . It's a hook framework for ART which allows hooking Java method of the application.

3)VirtualHook 注入

关键的地方,VirtualHook 修改 VirtualApp 的核心代码,提供 Hook 注入代码的窗口

以下是在 VirtualApp 里面 VClienImpl 类注入的关键代码

DexClassLoader dexClassLoader = new DexClassLoader(apkPath,

VEnvironment.getDalvikCacheDirectory().getAbsolutePath(),

libPath,

appClassLoader);

// YAHFA do hook

HookMain.doHookDefault(dexClassLoader, appClassLoader);复制代码

public void findAndBackupAndHook(Class targetClass, String methodName,

String methodSig, Method hook, Method backup);复制代码

三、YAHFA

1、YAHFA 介绍

YAHFA(Yet Another Hook Framework for ART) 是基于 ART 的 Hook 框架,支持 Android 5.0 ~ 9.0 版本的 Java 方法的 Hook 与替代 。而 VirtualHook 则是靠 YAHFA 实现的免 Root Hook。

来自看雪论坛:

YAHFA 项目地址:

2、YAHFA 原理

我是看不太懂里面的原理,但是还是把别人的分析过程,贴出来给大家,希望看懂的朋友,不吝分享:

写文的时候,好像作者的博客挂了,不过还是写上吧

csdn 一位博主分享的原理分析

3、YAHFA Hook

解释一下相关变量与方法:

className:指定要 hook 的类名

methodName:指定要 hook 的方法

methodSig:指定要 hook 的方法签名

hook():该方法是你 hook 方法需要处理的逻辑,这里执行 hook 相关操作

backup():是原方法的调用,一般不需要重写什么

1)普通方法

如 Log.e() 方法。代码如下:

public class Hook_Log_e {

public static String className = "android.util.Log";

public static String methodName = "e";

public static String methodSig = "(Ljava/lang/String;Ljava/lang/String;)I";

public static int hook(String tag, String msg) {

Log.w("YAHFA", "in Log.e(): "+tag+", "+msg);

return backup(tag, msg);

}

public static int backup(String tag, String msg) {

Log.w("YAHFA", "Log.e() should not be here");

return 1;

}

}复制代码

2)静态方法

静态方法和静态差不多,区别就是,静态的方法在hook和origin的参数中,少一个 Object 的参数。如 URI.create() 方法。代码如下:

public class Hook_url {

public static String className = "java.net.URI";

public static String methodName = "create";

public static String methodSig = "(Ljava/lang/String;)Ljava/net/URI;";

public static Object hook(String url)

{

// 改变 url 的值

url = "http://www.baidu.com";

return origin(url);

}

public static Object origin(String url)

{

Log.w("YAHFA", "String.startsWith() should not be here");

return url;

}

}复制代码

3)匿名内部类

内部类只是编译时的概念,一旦编译成功,就会出现两个不同的类,例如,类outClass中有个intClass,那么编译后就出现一个名为outClass.class和一个outClass$intClass.class的类。所以className中就要指定类路径为a.b.c.outClass$intClass

4、获取方法的签名描述符

1)方法签名描述符组成,括号内是参数的签名,括号外是返回值的签名:

如 Log.e() 里面的方法:

public static int e(String tag, String msg)

对应

(Ljava/lang/String;Ljava/lang/String;)I复制代码

2)各类型参照表

除了 boolean 和 long 类型分别是 Z 和 J 外,其他的描述符对应的都是 Java 类型名的大写首字母。另外,void 的描述符为 V

File Desciptor

Java Language Type

Z

boolean

B

byte

C

char

S

short

I

int

J

long

F

float

D

double

V

void

[

array

L + 类型描符 + ;

引用类型

说明:

数组用 [ 表示,二维数组 [[ 表示。如: [Ljava/lang/String; 对应 String[],

[[Ljava/lang/Object; 对应 Object[][]

引用类型注意前面的 L , “/” 分割和 “;” ,不要遗漏了。如:Lcom/tencent/wcdb/Cursor;

String 是对象,所以是:Ljava/lang/String;

还是不知道怎么写的话,可以通过以下 adb 命令找到方法签名描述符:

1. 查看 Java 类的方式 javap -s java.awt.Label

2. 查看 Android 类的方式 javap -s -bootclasspath "D:\Program Files\Android\android-sdk\platforms\android-25\android.jar" -classpath bin/classes android.app.Activity

3. 查看第三方 Jar 的类的方式 javap -s -classpath "D:\AMap_Location.jar" com.amap.api.location.AMapLocation复制代码

四、VirtualHook 搭配 YAHFA 使用教程

我们这里是使用 VirtualHook 来实践 。总体步骤如下:

git clone VirtualHook 工程或者下载源码

新建 module 并配置为插件

将 module 打包成 apk,并放到手机里面

在 VirtualHook 里面,克隆目标 App 和加载插件 apk

项目目录结构如下:

4f9ea1660be5373ff1740b7b3948f94f.png

项目目录结构

app 和 lib 是 VirtualApp 相关代码

YAHFA 是 Hook 框架代码

demoHookPlugin 是插件 module

1、配置插件 module

配置插件 module 的 AndroidManifest.xml 的 meta-data 的值,设置 value 为 true

android:label="@string/app_name">

android:name="yahfa.hook.plugin"

android:value="true"

/>

复制代码

2、配置 Hook 类

假如我们需要 Hook 处理 Log.e() 方法,新建一个 Hook_Log_e 类,并在 lab.galaxy.yahfa.HookInfo 配置(不配置的话,hook 不生效),代码如下:

public class HookInfo {

public static String[] hookItemNames = {

"lab.galaxy.yahfa.demoPlugin.Hook_Log_e",

};

}复制代码

注意:HookInfo 类的包名,如果需要改的话,要同时改 HookMain.doHookDefault() 方法里面的包名。

public static void doHookDefault(ClassLoader patchClassLoader, ClassLoader originClassLoader) {

try {

Class> hookInfoClass = Class.forName("lab.galaxy.yahfa.HookInfo", true, patchClassLoader);

String[] hookItemNames = (String[])hookInfoClass.getField("hookItemNames").get(null);

for(String hookItemName : hookItemNames) {

doHookItemDefault(patchClassLoader, hookItemName, originClassLoader);

}

hookInfoClasses.add(hookInfoClass);

}

catch (Exception e) {

e.printStackTrace();

}

}复制代码

3、验证结果

这里我写了个 hook 微信启动页的 onCreate() 方法。

public class Hook_Wx_Launcher {

public static String className = "com.tencent.mm.ui.LauncherUI";

public static String methodName = "onCreate";

public static String methodSig = "(Landroid/os/Bundle;)V";

public static Activity LauncherUi;

public static void hook(Object thiz, Bundle b) {

Log.w("czc", "LauncherUI oncreate");

return "";

}

public static void backup(Object thiz, Bundle b) {

Log.w("YAHFA", "LauncherUI backup");

return;

}

}复制代码

安装打包好的插件apk,插件左上有个小图标,以作区别,同时克隆 微信 到 VirtualHook 里面

78576e24b7a306387136a1d75f2a65f7.png

插件

d8334c1eac966b7ab1f9d5f19de99a27.png

安装

hook 成功打印出 log

b1dbc0b86b5e7713b70067ed41f45355.png

Hook_Wx_Launcher

更多技术分享,请加微信公众号——码农茅草屋:

码农茅草屋

简介VirtualApp是一个App虚拟化引擎(简称VA)。VirtualApp已兼容Android 0(8.0 Preview)。VirtualApp在你的App内创建一个虚拟空间,你可以在虚拟空间内任意的安、启动和卸载APK,这一切都与外部隔离,如同一个沙盒。运行在VA中的APK无需在外部安,即VA支持运行APK。VA目前被广泛应用于双开/多开、应用市场、模拟定位、一键改机、隐私保护、游戏修改、自动化测试、无感知热更新等技术领域,但它决不仅限于此,Android本身就是一个极其开放的平台,运行APK这一Feature打开了无限可能--------这都取决于您的想象力。申明当您需要将VirtualApp用于商业用途时,请务必联系QQ:10890 购买商业授权。您如果未经授权将VirtualAppApp模块作为您自己的App用于牟利或上传软件市场,我们取证后将直接报警(侵犯著作权罪)。购买商业授权是对我们最大的支持和认可,我们将投入更多精力和时间来不断完善优化VirtualApp,作为购买商业授权的回报,您可以获得未开放的商业版本和1vs1的支持(技术、运营、预警)!同时我们也支持基于VirtualAppAPP订制开发,请联系:QQ:10890 洽谈。请注意VirtualApp代码的更新频率非常快(以小时为单位),每一次代码的更新都有可能修复重大BUG,所以请 watch 本项目,并注意随时更新代码,以给您带来损失!已支持的加固(不断更新)360加固腾讯加固梆梆加固梆梆企业版(12306客户端 Pass)爱加密百度加固娜迦加固乐变加固网易易盾通付盾(已支持的加固均可通过VA来脱壳,本技术不公开)在VA使用Google服务VA支持运行官方的Google服务套件,同时我们也提供了对MicroG的支持。您可以通过在VA中安MicroG来支持Google服务,这样,即使外部没有Google服务,用户也可以在VA中享受Google服务。MicroG套件可在此下载:Download MicroGMicroG的必要模块:Services CoreServices Framework ProxyStore如果您需要在VA中使用官方的Google服务套件(外部已安的前提下),则可以通过 GmsSupport.installGms(userId) 来安。注意,您不能同时安MicroGms和官方的Gms。使用说明前往你的Application并添加如下代码:@Override     protected void attachBaseContext(Context base) {         super.attachBaseContext(base);         try {             VirtualCore.getCore().startup(base);         } catch (Throwable e) {             e.printStackTrace();         }     }安App:VirtualCore.getCore().installApp({APK PATH}, flags);启动App:VirtualCore.getCore().uninstallApp({PackageName});该App的基本信息:VirtualCore.getCore().findApp({PackageName});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值