Android逆向Hook学习——第一篇:Xposed

2024-02-28 17:30

本文主要是介绍Android逆向Hook学习——第一篇:Xposed,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

一、前言 

我于2019年5月3号写下本文,今天正好是劳动节,故在此祝各位劳动节快乐,然后呢我来讲一下本文,我呢学习逆向方面没有多久但总归还是有点收获的,于是我就想把我学到的Android逆向Hook方面的知识和技巧分享给大家。我准备分为四篇:Xposed、Cydia Substrate、Android inline hook和FrIDA。同时也请大家指出我的不正确的地方或者补充于你的技巧和知识

Android逆向Hook学习系列:
第一篇:Xposed;第一篇:Android inline Hook;第三篇:Frida(待添加)

二、正文

2.1、Xposed原理介绍


Xposed是一款特殊的Android应用,通过替换system\bin\下面的的app_process等文件来控制zygote进程,进而实现控制手机上所有的app进程;缺点就是不能hook应用的so中的函数。


2.2、Xposed安装


Xposed的GitHub地址:https://github.com/rovo89/XposedInstaller


环境:OPPO R11、Android Studio3.3.1、Java1.8.0_201 注:可以使用模拟器、但是Android4.0-4.4和Android5.0以上的Android系统安装的版本是不同的


Xposedinstaller的apk下载页面:https://repo.xposed.info/module/de.robv.android.xposed.installer


下载完APK安装后,刷入Xposed框架,如果成功就会是我这样子。如果你已经成功了,那么你就推开了Xposed的大门

 

2.3、Xposed代码的编写


新建一个项目,请注意如果你只是hook,那么可以选择add no activity,但是如果有和自身app交互,那么就选择empty activity。我为了给大家演示,是有展示的,所以我选择empty activity。

创建成功后找到AndroidManifest,xml,在文件里面添加如下代码。

<meta-dataandroid:name="xposedmodule"android:value="true" />
<meta-dataandroid:name="xposeddescription"android:value="XposedProject" />
<meta-dataandroid:name="xposedminversion"android:value="30" />

第一个xposedmodule的属性为ture,证明这是一个xposed的module;第二个xposeddescription,这是介绍项目的话语;第三个xposedminversion则是说明该xposedmodule所支持的最小版本,而最低版本就是30。

我们新建一个Java类并且继承接口IXposedHookLoadPackage和重写handleLoadPackage方法。

package com.yymjr.android.xposedproject;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookMain implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {}}

在src/mian目录下添加一个assets目录,目录下添加一个xposed_init文件,里面的代码是你的Hook类的包名+类名。


而本项目就是:com.yymjr.android.xposedproject.HookMain。


编写MainActivity代码如下:

package com.yymjr.android.xposedproject;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.HelloWorldTV);textView.setText(getInfmation());}private String getInfmation(){return "666666666";}}

大家就可以看到结果就是这样子,而Hook代码我们现在写上。

package com.yymjr.android.xposedproject;import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XC_MethodHook;import de.robv.android.xposed.XposedHelpers;import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookMain implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {if(!lpparam.packageName.equals("com.yymjr.android.xposedproject")) return;XposedHelpers.findAndHookMethod("com.yymjr.android.xposedproject.MainActivity", lpparam.classLoader, "getInfmation", new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);param.setResult("6666666");}});}}

重新编译,而且在XposedInstaller里面把该APP选上并且重启

2.4、Xposed技巧

注:paramTypes是指函数传参的类---来自一位不愿暴露的网友的提醒
1.通过Class.getName获取clazz。  <Xposed Hook Apk不在classes.dex中定义的类>

XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);if (param.hasThrowable()) return;Class<?> clazz = (Class<?>) param.getResult();if (clazz.getName().equals("")){ //判断类名XposedHelpers.findAndHookMethod(clazz, "methodName", paramTypes, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});}}});

2.通过Hook Application的attachBaseContext/onCreate/attach来获取DexClassLoader

XposedHelpers.findAndHookMethod(Application.class, "attch", Context.class, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);if (param.hasThrowable()) return;ClassLoader classLoader = ((Context) param.args[0]).getClassLoader();XposedHelpers.findAndHookMethod("className", classLoader, "methodName", paramTypes, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});}});

3.打印方法堆栈。

XposedHelpers.findAndHookMethod("className", lpparam.classLoader, "methodName", paramTypes, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);try {throw new NullPointerException();}catch (NullPointerException e) {Log.getStackTraceString(e);}}});

4.构造函数。 注:Jadx反编译apk后,看不出来是构造函数,直接hook将会导致classnotfound,使用apktool反编译打开smali文件。

本帖最后由 一夜梦惊人 于 2019-5-2 22:51 编辑

一、前言
我于2019年2月19号写下本文,今天正好是元宵节,故在此祝各位元宵节快乐,新的一年里万事如意、步步高升和发大财!然后呢我来讲一下本文,我呢学习逆向方面没有多久但总归还是有点收获的,于是我就想把我学到的Android逆向Hook方面的知识和技巧分享给大家。我准备分为四篇:Xposed、Cydia Substrate、Android inline hook和FrIDA。同时也请大家指出我的不正确的地方或者补充于你的技巧和知识(我将会说明于你的论坛ID)
Android逆向Hook学习系列:
第一篇:Xposed;第一篇:Android inline Hook;第三篇:Frida(待添加)


二、正文


2.1、Xposed原理介绍


Xposed是一款特殊的Android应用,通过替换system\bin\下面的的app_process等文件来控制zygote进程,进而实现控制手机上所有的app进程;缺点就是不能hook应用的so中的函数。


2.2、Xposed安装


Xposed的GitHub地址:https://github.com/rovo89/XposedInstaller


环境:OPPO R11、Android Studio3.3.1、Java1.8.0_201 注:可以使用模拟器、但是Android4.0-4.4和Android5.0以上的Android系统安装的版本是不同的


Xposedinstaller的apk下载页面:https://repo.xposed.info/module/de.robv.android.xposed.installer


下载完APK安装后,刷入Xposed框架,如果成功就会是我这样子。如果你已经成功了,那么你就推开了Xposed的大门,但是任重而道远,还需努力!



2.3、Xposed代码的编写


新建一个项目,请注意如果你只是hook,那么可以选择add no activity,但是如果有和自身app交互,那么就选择empty activity。我为了给大家演示,是有展示的,所以我选择empty activity。



创建成功后找到AndroidManifest,xml,在文件里面添加如下代码。

 

[Java] 纯文本查看 复制代码

?

1

2

3

4

5

6

7

8

9

<meta-data

    android:name="xposedmodule"

    android:value="true" />

<meta-data

    android:name="xposeddescription"

    android:value="XposedProject" />

<meta-data

    android:name="xposedminversion"

    android:value="30" />


第一个xposedmodule的属性为ture,证明这是一个xposed的module;第二个xposeddescription,这是介绍项目的话语;第三个xposedminversion则是说明该xposedmodule所支持的最小版本,而最低版本就是30。



接下来找到buile.gradle(module:app)文件,在里面添加如下代码。

 

[Asm] 纯文本查看 复制代码

?

1

2

3

compileOnly 'de.robv.android.xposed:api:82'

 

compileOnly 'de.robv.android.xposed:api:82:sources'



我们新建一个Java类并且继承接口IXposedHookLoadPackage和重写handleLoadPackage方法。

 

[Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

package com.yymjr.android.xposedproject;

 

 

import de.robv.android.xposed.IXposedHookLoadPackage;

 

import de.robv.android.xposed.callbacks.XC_LoadPackage;

 

 

public class HookMain implements IXposedHookLoadPackage {

 

    @Override

 

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

 

 

    }

 

}


在src/mian目录下添加一个assets目录,目录下添加一个xposed_init文件,里面的代码是你的Hook类的包名+类名。


而本项目就是:com.yymjr.android.xposedproject.HookMain。


编写MainActivity代码如下:

 

[Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

package com.yymjr.android.xposedproject;

 

 

import android.support.v7.app.AppCompatActivity;

 

import android.os.Bundle;

 

import android.widget.TextView;

 

 

public class MainActivity extends AppCompatActivity {

 

    private TextView textView;

 

 

    @Override

 

    protected void onCreate(Bundle savedInstanceState) {

 

        super.onCreate(savedInstanceState);

 

        setContentView(R.layout.activity_main);

 

        textView = findViewById(R.id.HelloWorldTV);

 

        textView.setText(getInfmation());

 

    }

 

 

    private String getInfmation(){

 

        return "吾爱破解论坛——by 一夜梦惊人";

 

    }

 

}



大家就可以看到结果就是这样子,而Hook代码我们现在写上。

 

[Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

package com.yymjr.android.xposedproject;

 

 

import de.robv.android.xposed.IXposedHookLoadPackage;

 

import de.robv.android.xposed.XC_MethodHook;

 

import de.robv.android.xposed.XposedHelpers;

 

import de.robv.android.xposed.callbacks.XC_LoadPackage;

 

 

public class HookMain implements IXposedHookLoadPackage {

 

    @Override

 

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

 

        if(!lpparam.packageName.equals("com.yymjr.android.xposedproject")) return;

 

        XposedHelpers.findAndHookMethod("com.yymjr.android.xposedproject.MainActivity", lpparam.classLoader, "getInfmation", new XC_MethodHook() {

 

            @Override

 

            protected void afterHookedMethod(MethodHookParam param) throws Throwable {

 

                super.afterHookedMethod(param);

 

                param.setResult("破解成功——by 一夜梦惊人");

 

            }

 

        });

 

    }

 

}


重新编译,而且在XposedInstaller里面把该APP选上并且重启。



成功破解!


2.4、Xposed技巧

 

注:paramTypes是指函数传参的类---来自一位不愿暴露的网友的提醒
1.通过Class.getName获取clazz。  <Xposed Hook Apk不在classes.dex中定义的类>

[Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {

 

            @Override

 

            protected void afterHookedMethod(MethodHookParam param) throws Throwable {

 

                super.afterHookedMethod(param);

 

                if (param.hasThrowable()) return;

 

                Class<?> clazz = (Class<?>) param.getResult();

 

                if (clazz.getName().equals("")){ //判断类名

 

                    XposedHelpers.findAndHookMethod(clazz, "methodName", paramTypes, new XC_MethodHook() {

 

                        @Override

 

                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {

 

                            super.afterHookedMethod(param);

 

                        }

 

                    });

 

                }

 

            }

 

        });


2.通过Hook Application的attachBaseContext/onCreate/attach来获取DexClassLoader。 来源:据说是非虫大佬提出的思路,无从查证。如若错误请指正。 参考:支付宝订单监控

 

[Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

XposedHelpers.findAndHookMethod(Application.class, "attch", Context.class, new XC_MethodHook() {

 

                @Override

 

                protected void afterHookedMethod(MethodHookParam param) throws Throwable {

 

                    super.afterHookedMethod(param);

 

                    if (param.hasThrowable()) return;

 

                    ClassLoader classLoader = ((Context) param.args[0]).getClassLoader();

 

                    XposedHelpers.findAndHookMethod("className", classLoader, "methodName", paramTypes, new XC_MethodHook() {

 

                        @Override

 

                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {

 

                            super.afterHookedMethod(param);

 

                        }

 

                    });

 

                }

 

            });


3.打印方法堆栈。

 

[Java] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

XposedHelpers.findAndHookMethod("className", lpparam.classLoader, "methodName", paramTypes, new XC_MethodHook() {

 

            @Override

 

            protected void afterHookedMethod(MethodHookParam param) throws Throwable {

 

                super.afterHookedMethod(param);

 

                try {

 

                    throw new NullPointerException();

 

                }catch (NullPointerException e) {

 

                    Log.getStackTraceString(e);

 

                }

 

            }

 

        });


4.构造函数。 注:Jadx反编译apk后,看不出来是构造函数,直接hook将会导致classnotfound,使用apktool反编译打开smali文件。



看见constructor就可以知道这是一个构造函数,而构造函数则是不需要输入methodName的。

XposedHelpers.findAndHookConstructor("className", lpparam.classLoader, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});

5.免重启。 

 

Xposed每次更新或者安装module都需要重启,本技巧就是免于重启。<该代码未经任何修改>

/*** @author DX*         这种方案建议只在开发调试的时候使用,因为这将损耗一些性能(需要额外加载apk文件),调试没问题后,直接修改xposed_init文件为正确的类即可*         可以实现免重启,由于存在缓存,需要杀死宿主程序以后才能生效*         这种免重启的方式针对某些特殊情况的hook无效*         例如我们需要implements IXposedHookZygoteInit,并将自己的一个服务注册为系统服务,这种就必须重启了*         Created by DX on 2017/10/4.*/public class HookLoader2 implements IXposedHookLoadPackage {//按照实际使用情况修改下面几项的值/*** 当前Xposed模块的包名,方便寻找apk文件*/private final String modulePackage = "com.xxx.plugin";/*** 宿主程序的包名(允许多个),过滤无意义的包名,防止无意义的apk文件加载*/private static List<String> hostAppPackages = new ArrayList<>();static {// TODO: Add the package name of application your want to hook!hostAppPackages.add("com.eg.android.AlipayGphone");hostAppPackages.add("com.xxx.plugin");}/*** 实际hook逻辑处理类*/private final String handleHookClass = TargetHook.class.getName();/*** 实际hook逻辑处理类的入口方法*/private final String handleHookMethod = "handleLoadPackage";@Overridepublic void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {if (hostAppPackages.contains(loadPackageParam.packageName)) {//将loadPackageParam的classloader替换为宿主程序Application的classloader,解决宿主程序存在多个.dex文件时,有时候ClassNotFound的问题XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {Context context=(Context) param.args[0];loadPackageParam.classLoader = context.getClassLoader();invokeHandleHookMethod(context,modulePackage, handleHookClass, handleHookMethod, loadPackageParam);}});}}/*** 安装app以后,系统会在/data/app/下备份了一份.apk文件,通过动态加载这个apk文件,调用相应的方法* 这样就可以实现,只需要第一次重启,以后修改hook代码就不用重启了* @param context context参数* @param modulePackageName 当前模块的packageName* @param handleHookClass   指定由哪一个类处理相关的hook逻辑* @param loadPackageParam  传入XC_LoadPackage.LoadPackageParam参数* @throws Throwable 抛出各种异常,包括具体hook逻辑的异常,寻找apk文件异常,反射加载Class异常等*/private void invokeHandleHookMethod(Context context, String modulePackageName, String handleHookClass, String handleHookMethod, XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {File apkFile=findApkFile(context,modulePackageName);if (apkFile==null){throw new RuntimeException("寻找模块apk失败");}//加载指定的hook逻辑处理类,并调用它的handleHook方法PathClassLoader pathClassLoader = new PathClassLoader(apkFile.getAbsolutePath(), ClassLoader.getSystemClassLoader());Class<?> cls = Class.forName(handleHookClass, true, pathClassLoader);Object instance = cls.newInstance();Method method = cls.getDeclaredMethod(handleHookMethod, XC_LoadPackage.LoadPackageParam.class);method.invoke(instance, loadPackageParam);}/*** 根据包名构建目标Context,并调用getPackageCodePath()来定位apk* @param context context参数* @param modulePackageName 当前模块包名* @return return apk file*/private File findApkFile(Context context, String modulePackageName){if (context==null){return null;}try {Context moudleContext = context.createPackageContext(modulePackageName, Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);String apkPath=moudleContext.getPackageCodePath();return new File(apkPath);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}return null;}
}

6.主动调用函数。 提醒:@$喂人民服雾  参考:Xposed模块编写那些事--https://www.freebuf.com/articles/terminal/114910.html

Class<?> clazz = XposedHelpers.findClass("className",lpparam.classLoader);
XposedHelpers.callMethod(clazz.newInstance(),"methodName",paramTypes, paramValue);

 

注:第一个参数是hook类的对象,在本代码获取了类,但是没有实例化,所以调用newInstance;paramValue是传入参数的值。

 

7.内部类(inner_class)hook

首先获取class,而内部类则是用$连接。

XposedHelpers.findAndHookMethod("className$inner_class", lpparam.classLoader, "methodName", paramTypes, new XC_MethodHook() {@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}
});

8.调用静态函数

Class[] clazz = new Class[1];clazz[0] = Clazz;XposedHelpers.callStaticMethod(XposedHelpers.findClass("[/size][/font][font=黑体][size=3]className[/size][/font][font=黑体][size=3]", classLoader),"[/size][/font][font=黑体][size=3]methodName[/size][/font][font=黑体][size=3]",[/size][/font][/align][align=left][font=黑体][size=3]                                    clazz,
[/size][/font][font=黑体][size=3]paramValue[/size][/font][font=黑体][size=3]);

请注意这里如果要传入参数的Clazz,请传为数组类,而参数的值则是可变,否则将会出错!

三、后言

本贴来源转载,如有违规请联系删帖!!!

×

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。

 

这篇关于Android逆向Hook学习——第一篇:Xposed的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756134

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss