原创,首先国内各种rom版本不一,对官方教程中clock的hook很难做到,其次中文教程太少。。楼主也是刚接触Android hook,如有错误请多多指正

首先配置Xposed框架,这一步因机而异,网上有不同机型的各种rom,我这里用的是MI NOTE, MIUI 7 ,内核 Android 6.0,放一个别人做的挺好的教程

http://www.miui.com/thread-3694869-1-1.html

另外,本文参考资料如下:

https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

http://www.codefrom.com/paper/Xposed%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E5%9F%BA%E7%A1%80%E7%AF%87

全部文件下载链接在文末:

新建一个Xposed模块的步骤如下:

下载得到api-53.jar,api-53-source.jar                              ,版本低一点的话兼容性好

Android Studio新建空工程

Manifest配置如下:

两个文件放入app\libs目录,右键Add to library.(这还没完!注意!)

要把build.gradle下方新加上

repositories {

jcenter();

}

并把原有的dependencies块改成

dependencies {

provided 'de.robv.android.xposed:api:53'provided 'de.robv.android.xposed:api:53:sources'}

这样做的目的是编译出的apk不含有de\robv\...(如图)

222.png (23.94 KB, 下载次数: 1)

2016-4-18 10:05 上传

再次编译提示出错时更改styles.xml为

新建一个class如下:

packagecom.dyna.hook1;importde.robv.android.xposed.IXposedHookLoadPackage;importde.robv.android.xposed.XposedBridge;importde.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;public classMainActivityimplementsIXposedHookLoadPackage {public voidhandleLoadPackage(finalLoadPackageParam lpparam)throwsThrowable {

XposedBridge.log("Loaded app: "+ lpparam.packageName);

}

}

在app\src\main\assets目录(没有就新建这个目录)下新建文件xposed_init入口assets/xposed_init配置,声明需要加载到 XposedInstaller 的入口类:com.dyna.hook1.MainActivity(完整类名:包名+类名)

选择目标:

注意,你只能hook函数!替换或在之前或之后插入都是可以的,应当hook一些特殊而不常用的函数以避免性能和其他可能问题。

找到包xx.xx.xx中类xx.xx.xx.zz中的yy方法

public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {    if (!lpparam.packageName.equals("xx.xx.xx"))        return;     XposedBridge.log("we are in XX!");}

然后,代码这样:

packagecom.dyna.hook1;import staticde.robv.android.xposed.XposedHelpers.findAndHookMethod;//这里多了一个importimportde.robv.android.xposed.IXposedHookLoadPackage;importde.robv.android.xposed.XC_MethodHook;importde.robv.android.xposed.XposedBridge;importde.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;public classMainActivityimplementsIXposedHookLoadPackage {public voidhandleLoadPackage(finalLoadPackageParam lpparam)throwsThrowable {if(!lpparam.packageName.equals("xx.xx.xx"))return;

findAndHookMethod("xx.xx.xx.zz", lpparam.classLoader,"yy",newXC_MethodHook() {@Overrideprotected voidbeforeHookedMethod(MethodHookParam param)throwsThrowable {// this will be called before the clock was updated by the original method}@Overrideprotected voidafterHookedMethod(XC_MethodHook.MethodHookParam param)throwsThrowable {// this will be called after the clock was updated by the original method}

});

}

}

注意此处的yy方法不带参数,如果有参数,需要在调用findAndHookMethod函数中列举它们的类型,该函数最后一个参数是一个XC_MethodHook的实例,其中有两个可重载的方法,beforeHookedMethod可以通过param.args操作传入值甚至跳过原有函数返回自定义的结果,afterHookedMethod可以修改返回值以及其他后期操作(完全替换可通过重载XC_MethodReplacement类的replaceHookedMethod方法实现)。

实例:如果调用了aa.yy(),那么param.thisObject的值应该是aa

动手吧!

首先,我们新建一个工程,包名就叫xx.xx.xx,新建一个类zz,继承于TextView(为贴近官方指导,这样可以对param.thisObject强制类型转换为TextView进行进一步操作)这个apk功能很简单,在屏幕上显示当前“硬币”数量,点击“Use Coin”后消耗硬币

首先是zz.java:

packagexx.xx.xx;

importandroid.content.Context;

importandroid.util.AttributeSet;

importandroid.widget.TextView;

/**

* Created by Deva on 2016/4/17 0017.

*/public classzz extendsTextView{

public intcoin;

publiczz(Contextcontext) {

super(context);

coin= 10;

}

publiczz(Contextcontext, AttributeSet attrs) {

super(context,attrs);

coin= 10;

}

final voidyy(){

coin-= 1;

this.setText(String.valueOf(coin));

}

public voidtt(){

coin+= 1;

}

}

可以看到其中yy方法是我们按键所调用的,也是我们将要hook的对象

接着是MainActivity.java:

packagexx.xx.xx;

importandroid.support.v7.app.AppCompatActivity;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.TextView;

public classMainActivity extendsAppCompatActivity {

Button usecoin;

zz cur_coin;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

cur_coin=(zz) findViewById(R.id.coin);

usecoin=(Button) findViewById(R.id.usecoin);

usecoin.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(Viewv) {

cur_coin.yy();

}

});

}

}

最后是activity_main.xml:

做完以上步骤,我们编译生成apk并运行,可以看到正常的效果。

接下来我们对apk进行hook。

按照一开始的部分一直操作,最后将MainActivity.class修改为:

packagecom.dyna.hook1;

importandroid.graphics.Color;

importandroid.util.Log;

importandroid.widget.TextView;

import staticde.robv.android.xposed.XposedHelpers.findAndHookMethod;

importde.robv.android.xposed.IXposedHookLoadPackage;

importde.robv.android.xposed.XC_MethodHook;

importde.robv.android.xposed.XposedBridge;

importde.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

public classMainActivity implementsIXposedHookLoadPackage {

public voidhandleLoadPackage(finalLoadPackageParam lpparam) throwsThrowable{

if(lpparam.packageName.contains("xx.xx.xx") == false)

return;

XposedBridge.log("we are in "+ lpparam.packageName);

findAndHookMethod("xx.xx.xx.zz", lpparam.classLoader,"yy", newXC_MethodHook() {

@Override

protected voidbeforeHookedMethod(MethodHookParam param) throwsThrowable {

// this will be called before the clock wasupdated by the original method}

@Override

protected voidafterHookedMethod(XC_MethodHook.MethodHookParam param) throwsThrowable {

// this will be called after the clock wasupdated by the original methodTextView tv = (TextView) param.thisObject;

String text =tv.getText().toString();

tv.setText(text + " :)");

tv.setTextColor(Color.RED);

}

});

}

}

安装到手机上,进入xPosed Installer ->模块(Modules),会发现你写的hook1,勾选之后重启手机,再次运行XX,看看效果吧!

1111.png (20.29 KB, 下载次数: 1)

2016-4-18 10:04 上传

两个工程(Hook.rar)

下载地址:http://pan.baidu.com/s/1kV5yc0f  密码 x7z4

android hook方法替换,Android Hook入门教程相关推荐

  1. 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程

    认识AndEngine什么是AndEngine 随着Android手机.平板的盛行,Android下的游戏也不断的变得火热.而对于游戏开发有兴趣的同学们,应该也想要学习开发游戏.虽说游戏开发的引擎较多 ...

  2. Android 2D游戏引擎AndEngine快速入门教程

    Android 2D游戏引擎AndEngine快速入门教程 介绍:AndEngine是一款知名的Android 2D游戏引擎.该引擎代码开源,并且可以免费使用.本书详细讲解如何使用AndEngine引 ...

  3. android 筛选菜单_使用C语言开发跨平台(win/android)应用(PainterEngine 快速入门教程)...

    PainterEngine导引 PainterEngine是一个基于C语言编写的完全开源的图形游戏引擎.你可以在这里下载到PainterEngine的完整代码及相关帮助文档 matrixcascade ...

  4. android局部布局替换,Android 局部布局替换的实现方式

    最近再搞远程视频的功能,其中要实现加载视频.加载视频失败.加载成功的局部布局替换,查阅相关资料,找到一种投机取巧的方式. 首先分别写这三种效果的子布局,分别为 top_remotetreate.xml ...

  5. android onclick方法吗,Android中button的onClick事件几种方法

    Android中button的onClick事件几种方法 发布时间:2020-09-03 02:36:31 来源:脚本之家 阅读:100 作者:水桶前辈 Android中button的onClick事 ...

  6. storyline发布方法_(完整)ArticulateStoryline入门教程

    1 目录 1.Articulate Storyline 入门教程:中文安装教程 ( 图文 ) ............................................. 2 2.Art ...

  7. android post方法吗,Android中使用Post请求的方法

    本文实例讲述了Android中使用Post请求的方法.分享给大家供大家参考.具体如下: 一.需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中 ...

  8. android studio 安卓制作app入门教程,Android开发:AndroidStudio安卓APP入门教程

    轻松学会Android,让工作主动找你 即使你是零基础,也能掌握真正的技术 低风险.低投入,随时随地学习 全方位的技术支持:高清视频.源码.资料.技术指导 课程目录 章节1:初识篇 课时1开发环境搭建 ...

  9. android局部布局替换,android – 子片段替换父片段根布局

    我有一个5个片段的viewpager,其中一个我希望通过按钮点击完全替换它.我也希望能够通过后退按钮隐藏子片段. 这里的片段布局: 当我尝试像这样替换contacts_layout时: ImportC ...

最新文章

  1. 长此以往的发展,以BCH为代表的数字货币终将会为自己正名
  2. 如何快速阅读一篇英文文献
  3. 直播技术(从服务端到客户端)二
  4. 判断一个字符串是否全部相同
  5. 数据库设计五要点 让数据库设计更加规范
  6. 录入班级学生姓名科目成绩_如何利用钉钉发布考试成绩
  7. 最新出炉|也许你该看看这份的模型数据
  8. 《Flask 入门教程》第 3 章:模板
  9. Python基础(7) - 函数
  10. robotframework使用之 下拉框的选择的几种用法
  11. 5G关键技术及应用、5G移动通信组网架构
  12. B站视频、音频分开传输
  13. Unity中加载倾斜摄影模型、dem叠加卫星影像做真实地形
  14. spring boot中的banner制作
  15. 综述 | 语义分割经典网络及轻量化模型盘点
  16. 如何快速去除图片上的水印?去除图片水印怎么做?
  17. 手把手带你实现QQ分享
  18. 《趣弹幕-滚动LED显示屏-隐私协议》
  19. Hive中小表与大表关联(join)的性能分析
  20. canvas --用循环画圆

热门文章

  1. 2021年牛宝宝起名取名,惊艳有诗意的三字女孩名
  2. JLX256160 液晶屏串行 无字库
  3. 计算机固态和机械什么意思,固态硬盘和机械硬盘有什么不同?详解固态硬盘和机械硬盘...
  4. 解决dataTable在element下的tab切换时表头与内容错位问题
  5. sci影响因子小于1计算机,影响因子小于1的期刊_影响因子_柳叶刀影响因子多少...
  6. 关于给hexo博客增加节日气氛主题切换(包括中国春节和圣诞节)
  7. DELPHI Webbrowser 响应回车键(EWB响应正常,无需额外代码)
  8. OH~My Godness ~!被点到了...
  9. 计算机行业职业名称英语,行业英语学习
  10. Hive中的left semi join和left anti join