zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android Hook神器——XPosed入门(登陆劫持演示)

Android入门 神器 登陆 演示 hook 劫持 Xposed
2023-09-27 14:25:13 时间

假设想飞得高。就该把地平线忘掉。

这里写图片描写叙述

前段时间写了一篇有关于CydiaSubstrate的广告注入的文章(地址:http://blog.csdn.net/yzzst/article/details/47318751),大家都直呼过瘾。

可是。真正了解这一方面的同学应该这道。事实上另一个比CydiaSubstrate更出名的工具:XPosed。

不是由于Xposed比CydiaSubstrate做的多好。而是Xposed是彻底开源的。今天。我们就向大家简单的介绍一下Xposed。并书写一个简单的登陆劫持demo,让大家高速的入门学习Xposed。


Xposed

Xposed框架是一款能够在不改动APK的情况下影响程序执行(改动系统)的框架服务。通过替换/system/bin/app_process程序控制zygote进程。使得app_process在启动过程中会载入XposedBridge.jar这个jar包,从而完毕对Zygote进程及其创建的Dalvik虚拟机的劫持。


基于Xposed框架能够制作出很多功能强大的模块。且在功能不冲突的情况下同一时候运作。

此外。Xposed框架中的每个库还能够单独下载使用,如Per APP Setting(为每个应用设置单独的dpi或改动权限)、Cydia、XPrivacy(防止隐私泄露)、BootManager(开启自启动程序管理应用)对原生Launcher替换图标等应用或功能均基于此框架。

官网地址:http://repo.xposed.info/


源代码地址:https://github.com/rovo89


Xposed框架是基于一个Android的本地服务应用XposedInstaller与一个提供API 的jar文件来完毕的。

所以。安装使用Xposed框架我们须要完毕以下几个步骤:

安装本地服务XposedInstaller
须要安装XposedInstall.apk本地服务应用,我们能够在其官网的framework栏目中找到,下载并安装。地址为:

http://repo.xposed.info/module/de.robv.android.xposed.installer

安装好后进入XposedInstaller应用程序,会出现须要激活框架的界面,如图8-5所看到的。这里我们点击“安装/更新”就能完毕框架的激活了。部分设备假设不支持直接写入的话,能够选择“安装方式”,改动为在Recovery模式下自己主动安装就可以。

由于安装时会存在须要Root权限,安装后会启动Xposed的app_process,所以安装过程中会存在设备多次又一次启动。

TIPS:由于国内的部分ROM对Xposed不兼容,假设安装Xposed不成功的话。强制使用Recovery写入可能会造成设备重复重新启动而无法正常启动。

下载使用API库

其API库XposedBridgeApi-.jar(version是XposedAPI的版本,如我们这里是XposedBridgeApi-54.jar)文件。我们能够在Xposed的官方支持xda论坛找到,其地址为:

http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067

下载完毕后我们须要将 Xposed Library 拷贝到 lib文件夹(注意是 lib 文件夹不是Android提供的 libs 文件夹),然后将这个 jar 包加入到 Build PATH 中

假设直接将jar包放置到了libs文件夹下,非常可能会产生错 误“IllegalAccessError: Class ref in
pre-verified class resolved to unexpected
implementation”。


预计Xposed作者在其框架内部也引用了BridgeApi,这样操作避免重复引用。


实战,登陆劫持(原理)

之前跟大家也说过使用CydiaSubstrate进行广告注入(地址:http://blog.csdn.net/yzzst/article/details/47318751),非常多网友问我,就仅仅能简单的注入一个广告。还能做什么吗?

登陆劫持!!!,你没听错,今天我们这里就简单的演示一下,怎样对一个应用程序的登陆功能进行劫持,并把账号password打印出来。

如我们常见的登陆劫持,就是使用到了Hook技术来完毕的。那么这个登陆劫持是怎样完毕的呢?以下我们就详细来看看。一个我们在开发中常见到的登陆样例。首先我们看看一个常见的登陆界面是什么样子的。

其相应的登陆流程代码例如以下所看到的:

// 登陆button的onClick事件
mLoginButton.setOnClickListener(new OnClickListener() {

    @Override
public void onClick(View v) {
    // 获取用户名
        String username = mUserEditText.getText() + "";
        // 获取password
        String password = mPasswordEditText.getText() + "";

        if (isCorrectInfo(username, password)) {
            Toast.makeText(MainActivity.this, "登陆成功!", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(MainActivity.this, "登陆失败!", Toast.LENGTH_LONG).show();
        }
    }
});

我们会发现,登陆界面上面的用户信息都是存储在EditText控件上。然后通过用户手动点击“登陆”button才会将上面的信息发送至server端去验证账号与password是否正确。

这样就非常easy了,黑客们仅仅须要找到开发人员在使用EditText控件的getText方法后进行网络验证的方法,Hook该方法,就能劫持到用户的账户与password劫了。

TIPS:当然。我们也能够仿照上之前CydiaSubstrate的广告注入样例(地址:http://blog.csdn.net/yzzst/article/details/47318751)。做一个一模一样的Activity。在劫持原Activity优先弹出来。达到欺骗用户获取password的目的。

详细流程例如以下:


实战,登陆劫持(编码)

明确了原理以下我们就实际的操作一次。这里我们选择使用Xposed框架来操作。使用Xposed进行Hook操作主要就是使用到了Xposed中的两个比較重要的方法。handleLoadPackage获取包载入时候的回调并拿到其相应的classLoader;findAndHookMethod对指定类的方法进行Hook。

它们的详细定义例如以下所看到的:

  /**
     * 包载入时候的回调
     */
public void handleLoadPackage(final LoadPackageParam lpparam)


/**
     * Xposed提供的Hook方法
     * 
     * @param className 待Hook的Class
     * @param classLoader classLoader
     * @param methodName 待Hook的Method
     * @param parameterTypesAndCallback hook回调
     * @return 
     */
Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) 

当然,我们使用Xposed进行Hook也分为例如以下几个步骤:

1. 在AndroidManifest.xml文件里配置插件名称与Api版本

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <meta-data
            android:name="xposedmodule"
            android:value="true" />
        <!-- 模块描写叙述 -->
        <meta-data
            android:name="xposeddescription"
            android:value="一个登陆劫持的样例" />
        <!-- 最低版本 -->
        <meta-data
            android:name="xposedminversion"
            android:value="30" />
</application>

2. 新建一个入口类并继承并实现IXposedHookLoadPackage接口

例如以下操作,我们新建了一个com.example.loginhook.Main的类,并实现IXposedHookLoadPackage接口中的handleLoadPackage方法,将非com.example.login包名的应用过滤掉。即我们仅仅操作包名为com.example.login的应用。例如以下所看到的:

public class Main implements IXposedHookLoadPackage {

    /**
     * 包载入时候的回调
     */
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        // 将包名不是 com.example.login 的应用剔除掉
        if (!lpparam.packageName.equals("com.example.login"))
            return;
        XposedBridge.log("Loaded app: " + lpparam.packageName);
    }
}

3. 声明主入口路径

须要在assets文件夹中新建一个xposed_init的文件。并在当中声明主入口类。如这里我们的主入口类为com.example.loginhook.Main

4. 使用findAndHookMethod方法Hook劫持登陆信息

这是最重要的一步,我们之前所分析的都须要到这一步进行操作。

如我们之前所分析的登陆程序,我们须要劫持就是须要Hook其com.example.login.MainActivity中的isCorrectInfo方法。

我们使用Xposed提供的findAndHookMethod直接进行MethodHook操作(与Cydia非常相似)。在其Hook回调中使用XposedBridge.log方法,将登陆的账号password打印信息至Xposed的日志中。详细操作例如以下所看到的:

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Main implements