• 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究


    20145307陈俊达_安卓逆向分析_Xposed的hook技术研究

    引言

    其实这份我早就想写了,xposed这个东西我在安卓SDK 4.4.4的时候就在玩了,root后安装架构,起初是为了实现一些屌丝功能,比如自动抢红包,微信阻止撤回,语音可转发等效果,现在步入了SDK 6.0时代,安上了黑域还有绿色守护真的省电,尤其你在装谷歌全家桶的时候,那个是真的费电啊!这篇文章,我想写一点xposed的工作原理。在不修改APK的情况下,影响其运行过程的服务框架。可以根据自己的需求编写模块,让模块控制目标应用的运行。

    start

    首先环境介绍 oneplus 3 手机 安卓6.0 root后安装xposed架构

    好了好了开始!

    你先下载好架构是没什么用的,之后需要人为的去编写模块去加载重启运行才行。那好,我们想要知道手机里某个app的某个类的某个方法中的某个函数,就要去指明他的包,这样在架构加载重启后才能去识别这个参数去hook,之后在ide的控制台下就能看见输入或者输出的参数的相关信息了,并去修改。

    举一个例子,上篇博客中出现的登录app中.java文件中出现的isOK(字符,字符)这个函数是检查的帐号和密码,那我们如果能hook到这个函数,那这个登录系统就是很不稳了。那我们现在就可以针对他来进行模块的编写了。

    public class LoginActivity extends Activity {  
      
        private final String ACCOUNT="jclemo";  
        private final String PASSWORD="123456";  
        private EditText etAccount, etPassword;  
        private Button btnLogin;  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_login);  
      
            etAccount=(EditText)findViewById(R.id.et_account);  
      
            etPassword=(EditText)findViewById(R.id.et_password);  
      
            btnLogin=(Button)findViewById(R.id.btn_login);  
      
            btnLogin.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    if (isOK(etAccount.getText().toString(), etPassword.getText().toString())) {  
                        Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show();  
                    } else {  
                        Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_SHORT).show();  
                    }  
      
                }  
            });  
      
        }  
      
        private boolean isOK(String account, String password){  
            return account.equals(ACCOUNT) && password.equals(PASSWORD);  
        }  
    

    打开安卓IDE,新建一个项目,模块不需要界面,所以我们选择no activity就好,不要添加layout.xml

    在空项目的java文件夹中新建一个类,命名用Module就好

    接下来配置安卓manifest.xml

    在main文件下创建一个assets文件夹,在里面创建一个普通文件,命名为xposed_init,然后打开输入包的名字和你的类的包名

    新建一个文件夹,命名为jar,然后将XposedBridgeApi.jar包放进去,我在网上下载的是54版本,之后右键add lib,加入到我们程序需要的库里面。

    编写模块类Module.java

    以下为全部代码

    .xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
        package="com.samuelzhan.xposehook">  
      
        <application android:allowBackup="true" android:label="@string/app_name"  
            android:icon="@mipmap/ic_launcher" android:theme="@style/AppTheme">  
      
            <meta-data  
                android:name="xposedmodule"  
                android:value="true"/>  
      
            <meta-data  
                android:name="xposeddescription"  
                android:value="Hook Test!"/>  
      
            <meta-data  
                android:name="xposedminversion"  
                android:value="54"/>  
        </application>  
      
    </manifest>  
    

    java的Module模块类

    public class Module implements IXposedHookLoadPackage {  
      
        @Override  
        public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {  
            if (loadPackageParam.packageName.equals("com.example.logintest")) {  
      
                XposedHelpers.findAndHookMethod("com.example.logintest.LoginActivity",  
                        loadPackageParam.classLoader,  
                        "isOK",  
                        String.class,  
                        String.class,  
                        new XC_MethodHook() {  
                            @Override  
                            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {  
      
                            }  
      
                            @Override  
                            protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
                            }  
                        });  
      
            }  
        }  
      
    } 
    

    这里我们可以看到,Module继承了IXposedHookLoadPackage接口,当系统加载应用包的时候回回调 handleLoadPackage;XposedHelpers的静态方法 findAndHookMethod就是hook函数的的方法,其参数对应为类名+loadPackageParam.classLoader+方法名+参数类型+XC_MethodHook回调接口

    这里的第一个参数类名必须要有包名前缀,即“packageName+className”

    参数里有一个监听类XC_MethodHook,该类在hook前后回调,通过回调方法的MethodHookParam可以拦截到函数参数。Xposed除了hook目标应用的函数之外,还可以hook某些类的构造方法,对应的方法为XposedHelpers.findAndHookConstructor()。

    接下来就签名打包生成apk文件吧,安装到手机上,然后提示有新的xposed模块更新,直接授权加上重启手机就好,热重启很快的。

    重启后我们就可以hook那个isOK函数了,用以下来记录获取登录的密码

    new XC_MethodHook() {  
        @Override  
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {  
            XposedBridge.log("账号:"+(String)param.args[0]+"   密码:"+(String)param.args[1]);  
            Log.d("xxx","账号:"+(String)param.args[0]+"   密码:"+(String)param.args[1]);  
        }  
      
        @Override  
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
            Log.d("zz", param.getResult().toString());  
        }  
    });
    

    手机连接到ide后登录,我们在IDE的控制台上能够看到帐号和密码

    当然也可修改

    new XC_MethodHook() {  
        @Override  
        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {  
            //修改参数  
            param.args[0]="jclemo";  
            param.args[1]="123456";  
        }  
      
        @Override  
        protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
            Log.d("zz", param.getResult().toString());  
        }  
    });
    

    让他的id永远为jclemo,密码永远为123456。之后重新打包,发送到安卓手机上!

    总结

    这个实验只是xposed研究很小很小的一个方面,还有很多深入的内容需要去研究,下次实验本来打算做的是cydia研究,因为他在苹果越狱上有很大的贡献,想要在安卓平台上也进行一次实验,但是很尴尬的一点就是,这个平台只支持到4.4.4平台,而我的手机最低需要6.0,无法安装4.4.4的cydia,因此无法继续运行,所以改成安卓apk的签名研究!

  • 相关阅读:
    windows 下读取文件夹下所有文件的文件名
    centos7安装python3
    python 实现google 在线中英文翻译
    删除docker /var/lib/docker报Device or resource busy问题处理
    java list 去重
    OpenStack与KVM的区别与联系
    虚拟化kvm virsh 常用命令
    linux 监控服务器流量
    openstack 全套学习资料地址
    二、Openstack入坑指南
  • 原文地址:https://www.cnblogs.com/Jclemo/p/6992113.html
Copyright © 2020-2023  润新知