android hook方法替换,Android Hook入门教程
原创,首先国内各种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入门教程相关推荐
- 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程
认识AndEngine什么是AndEngine 随着Android手机.平板的盛行,Android下的游戏也不断的变得火热.而对于游戏开发有兴趣的同学们,应该也想要学习开发游戏.虽说游戏开发的引擎较多 ...
- Android 2D游戏引擎AndEngine快速入门教程
Android 2D游戏引擎AndEngine快速入门教程 介绍:AndEngine是一款知名的Android 2D游戏引擎.该引擎代码开源,并且可以免费使用.本书详细讲解如何使用AndEngine引 ...
- android 筛选菜单_使用C语言开发跨平台(win/android)应用(PainterEngine 快速入门教程)...
PainterEngine导引 PainterEngine是一个基于C语言编写的完全开源的图形游戏引擎.你可以在这里下载到PainterEngine的完整代码及相关帮助文档 matrixcascade ...
- android局部布局替换,Android 局部布局替换的实现方式
最近再搞远程视频的功能,其中要实现加载视频.加载视频失败.加载成功的局部布局替换,查阅相关资料,找到一种投机取巧的方式. 首先分别写这三种效果的子布局,分别为 top_remotetreate.xml ...
- android onclick方法吗,Android中button的onClick事件几种方法
Android中button的onClick事件几种方法 发布时间:2020-09-03 02:36:31 来源:脚本之家 阅读:100 作者:水桶前辈 Android中button的onClick事 ...
- storyline发布方法_(完整)ArticulateStoryline入门教程
1 目录 1.Articulate Storyline 入门教程:中文安装教程 ( 图文 ) ............................................. 2 2.Art ...
- android post方法吗,Android中使用Post请求的方法
本文实例讲述了Android中使用Post请求的方法.分享给大家供大家参考.具体如下: 一.需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中 ...
- android studio 安卓制作app入门教程,Android开发:AndroidStudio安卓APP入门教程
轻松学会Android,让工作主动找你 即使你是零基础,也能掌握真正的技术 低风险.低投入,随时随地学习 全方位的技术支持:高清视频.源码.资料.技术指导 课程目录 章节1:初识篇 课时1开发环境搭建 ...
- android局部布局替换,android – 子片段替换父片段根布局
我有一个5个片段的viewpager,其中一个我希望通过按钮点击完全替换它.我也希望能够通过后退按钮隐藏子片段. 这里的片段布局: 当我尝试像这样替换contacts_layout时: ImportC ...
最新文章
- 长此以往的发展,以BCH为代表的数字货币终将会为自己正名
- 如何快速阅读一篇英文文献
- 直播技术(从服务端到客户端)二
- 判断一个字符串是否全部相同
- 数据库设计五要点 让数据库设计更加规范
- 录入班级学生姓名科目成绩_如何利用钉钉发布考试成绩
- 最新出炉|也许你该看看这份的模型数据
- 《Flask 入门教程》第 3 章:模板
- Python基础(7) - 函数
- robotframework使用之 下拉框的选择的几种用法
- 5G关键技术及应用、5G移动通信组网架构
- B站视频、音频分开传输
- Unity中加载倾斜摄影模型、dem叠加卫星影像做真实地形
- spring boot中的banner制作
- 综述 | 语义分割经典网络及轻量化模型盘点
- 如何快速去除图片上的水印?去除图片水印怎么做?
- 手把手带你实现QQ分享
- 《趣弹幕-滚动LED显示屏-隐私协议》
- Hive中小表与大表关联(join)的性能分析
- canvas --用循环画圆
热门文章
- 2021年牛宝宝起名取名,惊艳有诗意的三字女孩名
- JLX256160 液晶屏串行 无字库
- 计算机固态和机械什么意思,固态硬盘和机械硬盘有什么不同?详解固态硬盘和机械硬盘...
- 解决dataTable在element下的tab切换时表头与内容错位问题
- sci影响因子小于1计算机,影响因子小于1的期刊_影响因子_柳叶刀影响因子多少...
- 关于给hexo博客增加节日气氛主题切换(包括中国春节和圣诞节)
- DELPHI Webbrowser 响应回车键(EWB响应正常,无需额外代码)
- OH~My Godness ~!被点到了...
- 计算机行业职业名称英语,行业英语学习
- Hive中的left semi join和left anti join