• Android Xpose Hook(一)





    实验环境:
        Droid4x模拟器 (目前Android版本4.2.2)
        Android Studio

    1.下载相关工具
    XposedInstaller下载
    http://repo.xposed.info/module/de.robv.android.xposed.installer

    XposedBridged.jar下载


    2.安装XposedInstaller并激活
    激活步骤: 启动XposedInstaller -> 框架 -> 安装更新 ->模拟器重启 (ps:模拟器会直接屏幕黑掉,直接结束进程即可,不行就反复试几下 )
    激活后这里会有绿色的数字信息


    3.Android Studio新建一个测试工程(被Hook的APP)
    UI如下:


    MainActivity类新建如下被Hook函数 (如上3个按钮点击分别传递对应的参数进入,返回值显示在textview控件上)
    public String sayhello(int num1, int num2 )
    {
    if (num1 + num2 < 100) {
    return "so small than 100!";
    }
    if (num1 + num2 == 100) {
    return "equal 100!";
    }
    if (num1 + num2 > 100) {
    return "so big than 100!";
    }
    return "error";
    }

    4.新建我们的XposedHook工程(建议SDK版本选择4.0.3)
    ●在AndroidManifest文件中加入如下代码
    <meta-data
    android:name="xposedmodule"
    android:value="true" />
    <meta-data
    android:name="xposeddescription"
    android:value="Easy example" />
    <meta-data
    android:name="xposedminversion"
    android:value="54" />

    新建lib目录
    将下载好的
    XposedBridged.jar放入该目录
    并右键->Add To Library   这个步骤会在grandlew中添加
    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile files('lib/XposedBridgeApi-54.jar')
    }
    我们要将compile files修改为provided files,最后效果如下
    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    provided files('lib/XposedBridgeApi-54.jar')
    }

    添加assets目录
    在该目录下添加xposed_init   
    该文件的作用是指定module入口类,Hook的实现代码在该类中
    格式: 包名称 + 类名
    com.bingghost.xposeddemo.XposedHook

    新建xposed_init中指明的入口类XposedHook
    public class XposedHook implements IXposedHookLoadPackage {
    public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
    XposedBridge.log("Loaded app: " + lpparam.packageName);

    if (!lpparam.packageName.equals("com.bingghost.simplehelloworld"))
    {
    return;
    }

    findAndHookMethod("com.bingghost.simplehelloworld.MainActivity", lpparam.classLoader, "sayhello", int.class, int.class, new XC_MethodHook() {
    protected void afterHookedMethod(MethodHookParam param) {
    String str = (String) param.getResult();
    Log.v("hook after result :", str);
    Integer para1 = (Integer) param.args[0]; //获取参数1
    Integer para2 = (Integer) param.args[1]; //获取参数2
    String s1 = Integer.toString(para1);
    String s2 = Integer.toString(para2);
    param.setResult("i am new result! after"); //设置返回值

    Log.v("hook param1:", s1);
    Log.v("hook param2:", s2);
    Log.v("hook result:", "i am new result! after");
    }

    protected void beforeHookedMethod(MethodHookParam param) {
    param.setResult("i am new result! before"); //
    Integer para1 = (Integer) param.args[0]; //获取参数1
    Integer para2 = (Integer) param.args[1]; //获取参数2
    String s1 = Integer.toString(para1);
    String s2 = Integer.toString(para2);
    Log.v("hook before param1:", s1);
    Log.v("hook before param2:", s2);

    param.args[0] = 100; //设置参数1
    param.args[1] = 200; //设置参数2

    Log.v("hook", "before hook!");
    }

    });
    }
    }

    handleLoadPackage           包加载时会调用
    afterHookedMethod         Hook函数调用前
    beforeHookedMethod     Hook函数后
    XposedBridge.log              打印的内容将在XposedInstall的日志界面

    安装好XposedDemoAPP 在模块中勾选上重启系统



    5.运行结果
    测试APP显示结果如下:


    点击第2个按钮logcat输出











  • 相关阅读:
    android应用框架搭建------BaseActivity
    Android中Application类用法
    Android App框架设计之编写基类BaseActivity
    android Application类的详细介绍
    Linux使用jstat命令查看jvm的GC情况
    cocos2dx怎样设置ios和Android横屏竖屏的几种方法
    网络请求 http get post 一
    Java多线程中wait, notify and notifyAll的使用
    一个人生活,怎样摆脱孤独提升幸福感?
    js控制文本框仅仅能输入中文、英文、数字与指定特殊符号
  • 原文地址:https://www.cnblogs.com/bingghost/p/5208139.html
Copyright © 2020-2023  润新知